双方无公网状态下 RouterOS 基于 WireGuard 的组网方案

2025-01-24
2分钟阅读时长

目前各大运营商都在收紧 IPv4 公网分配,而 IPv6 却并不是随处可见(如校园、公司等场景)。在大部分场景下,获得 Full Cone NAT (下称 NAT1)的机会反而相对较多。

我们都知道 WireGuard 是一个基于 UDP 协议的隧道协议,通过 STUN 客户端简单地打个洞就可以在单方 NAT1 的情况下建立隧道,此类教程在 Linux 上已比比皆是,但 RouterOS 有没有 STUN Client 呢?

某人:没有 但是他有docker(

好的,一语惊醒梦中人,这个没毛病。不过其实在打洞这个场景下,无论是 RouterOS 的容器,还是同子网的另一个 Linux 机器,地位是相同的。

那么现在摆在我们面前的还有两个问题:

  1. 怎么确保代打完洞之后,这个端口的数据包发给 RouterOS 上的 WG Server 而不是流向打洞的客户端?
  2. 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,所以我只需要在第一次的时候手动打洞一下,懒得写脚本,谁遇上了可以自己搓一个,我先溜了拜拜(

Avatar

蚊子

幸福往往是摸得透彻,而堇业的心却常常隐藏