双方无公网状态下 RouterOS 基于 WireGuard 的组网方案
目前各大运营商都在收紧 IPv4 公网分配,而 IPv6 却并不是随处可见(如校园、公司等场景)。在大部分场景下,获得 Full Cone NAT (下称 NAT1)的机会反而相对较多。
我们都知道 WireGuard 是一个基于 UDP 协议的隧道协议,通过 STUN 客户端简单地打个洞就可以在单方 NAT1 的情况下建立隧道,此类教程在 Linux 上已比比皆是,但 RouterOS 有没有 STUN Client 呢?
某人:没有 但是他有docker(
好的,一语惊醒梦中人,这个没毛病。不过其实在打洞这个场景下,无论是 RouterOS 的容器,还是同子网的另一个 Linux 机器,地位是相同的。
那么现在摆在我们面前的还有两个问题:
- 怎么确保代打完洞之后,这个端口的数据包发给 RouterOS 上的 WG Server 而不是流向打洞的客户端?
- IP 和端口变化了的话,另外一个 peer 怎么获取新的 Endpoint?
省流:
/ip/firewall/nat/add action=redirect chain=dstnat dst-port=13231 protocol=udp to-ports=13231
把流量截留住- 用 NATMap 的 IP4P 格式把 IP 和端口写到 AAAA 记录里,然后写一个 RouterOS Script 解析并更新。
- 如果两端都是 Full Cone NAT,你甚至不需要担心这个问题,因为当单端 IP 变更的时候,WireGuard 会继续尝试连接另外一端,而另外一端只要握手成功,就会自动把 Current Endpoint 更新过来。只要不是两边同时掉线,你不需要重新打洞,也不需要更换 IP。
如果你懂得相关知识,想要自己实现,那么看到这就OK了。
如果你想要直接用我整好的容器和脚本,请接着往下看。
由于我的情况是双端 Full Cone NAT,所以我只需要在第一次的时候手动打洞一下,懒得写脚本,谁遇上了可以自己搓一个,我先溜了拜拜(