让 WireGuard 节点也能用公网 IPv6 地址从外边访问

2 天前
 dalaoshu25

众所周知:WireGuard(以下简称 wg)的节点只能在配置文件里静态指定 IP 地址,无论是 v4 还是 v6 。

v6 部分我们一般都是给自己分配保留地址,比如我用 fd80 开头的。每个节点可以配置多个地址,比如我会配置一个 fd80:开头的作数据通信,一个 fe80:开头的供 OSPFv3 使用。

即便 wg 建立连接两头的地址都是 IPv4 ,在 wg 链路里依旧可以同时跑 v4 和 v6 。

wg 节点的 v4 地址从路由器出去访问公网,肯定是要 NAT 啦,这个没得说。

v6 略微复杂一点,通常可以 NAT66 或者 masquerade ,这样外边只能看到一个网关的地址,不能知道是那个 wg 节点的,其实很好很安全。

极个别情况下,我们也许希望从外界直接发起对这个节点的访问,比如 ssh 进来,这时候你总不能打 fd80 开头的内部地址,而是希望也可以是 2409:xxxx:xxxx:xxxx:1234 这样的合法公网 IPv6 地址。

这时候可以用略微复杂一点的方式实现,这里我选择了用 netmap 方式。

我们知道通常 SLACC 模式下,每个节点 IPv6 地址的高 64 位是从运营商分配来的,低 64 位是本地随机数产生的。考虑到运营商给了我们/56 或者/60 的前缀,可以分出来 256 个或者 16 个/64 ,我们平常撑死也就用掉两三个/64 ,完全可以再拿一个/64 来给这些 wg 节点用。

1 、从运营商给的 v6 地址池里拿一个/64 ,给回家 wg 链路那个接口,比如我的是 wg3 。注意我们只是为了占一个位置,不需要也不能下发,所以要设置 advertise=no

/interface wireguard add name=wg3 comment="My back to home" listen-port=16384 mtu=1412
/ipv6 address add address=fd80:0:0:89::1 advertise=no comment="Inner WG" interface=wg3
/ipv6 address add address=::192:168:89:1 advertise=no comment="Inner WG" from-pool=v6pool interface=wg3

2 、给每个 wg 客户节点也分配好静态地址, 这里只举一个栗子,其他的你改那个 104 逐渐增加就行。

/interface wireguard peers add allowed-address=192.168.89.104/32,fd80:0:0:89::123:104/128 client-address=192.168.89.104/24,fd80:0:0:89::123:104/64 client-dns=192.168.89.1 client-endpoint=MY_DDNS_NAME client-keepalive=25s comment=MY_CLIENT_10 interface=wg3 name=FedoraNUC preshared-key="auto" private-key="auto" public-key="auto" responder=yes

3 、路由器,出口链路,把 wg 客户来的数据包 netmap 一下,用刚才那个/64 替换掉原来 wg 的 fd80 那个/64 4 、路由器,进口链路,把凡是给那个/64 前缀的,替换成 wg 的 fd80 前缀。

/ipv6 firewall nat add action=netmap chain=srcnat comment=NETMAPv6 src-address=fd80:0:0:89::/64 to-address=2409:8a1e:7000:7000::/64
/ipv6 firewall nat add action=netmap chain=dstnat comment=NETMAPv6Rtn dst-address=2409:8a1e:7000:7000::/64 to-address=fd80:0:0:89::/64

4 、写好脚本,挂在/ipv6/dhcp-client 下,每次获得新的前缀,就修改一下/ipv6/firewall/nat 里对应条目的前缀。

:local pre [/ipv6/pool/used get [find info=wg3 ] prefix ]
/ipv6 firewall nat set [find comment=NETMAPv6    ] to-address=$pre
/ipv6 firewall nat set [find comment=NETMAPv6Rtn ] dst-address=$pre

这样,各个 wg 客户端就有了一个实际上可用的 IPv6 公网地址。外边可以通过这个地址(这里的栗子是 2409:8a1e:7000:7000::123:104 )主动访问这个 wg 节点, 这个 wg 节点可以用这个地址去注册更新动态域名什么的。

俺在 RouterOS 上成功做了实施,效果蛮好。

至于这样做有多大的实用性,好不好安不安全,那是另外一个问题,请用家自行评估,偶不接受任何批评反驳。

1973 次点击
所在节点    宽带症候群
34 条回复
hackroad
1 天前
@ppbaozi wc ,还有 ai 。。。

另外借楼问下 @dalaoshu25
家里一直没弄过 ipv6 ,这两天逛 v2 看到不少人在玩这个,我也试了下。发现不管是改哪个 AC ,ipv6 dhcp 一直是 searching ,有些帖子说上海电信默认开 ipv6 了,难道我要单独去找装维开一下么。

MSE-1.MAN.M6000
VBASCP-1.NMAN.V6000

dhcp debug log 如图
dalaoshu25
1 天前
@hackroad 那些不足为奇。不要歪我的楼。

IPv6 不需要专门开通,你先查一下 IPv6 防火墙里有没有这两条:

/ipv6 firewall filter add action=accept chain=input comment="defconf: accept ICMPv6" protocol=icmpv6
/ipv6 firewall filter add action=accept chain=input comment="defconf: accept DHCPv6-Client prefix delegation." dst-port=546 protocol=udp src-address=fe80::/10

再看看/ppp/profile/print 里有没有 use-ipv6=yes
xhcnb
1 天前
@hackroad 检查光猫, 光猫上的连接里要设置为 ipv4/ipv6, 嫌麻烦就直接打 10000
hackroad
1 天前
@dalaoshu25 @xhcnb OK ,晚上回去查查光猫桥接的配置
hackroad
1 天前
@dalaoshu25 不算歪的厉害,毕竟外面情况下手机和 mac 都是通过 wg 回家,也能用上你的方案。
shenyuzhi
1 天前
其实就是做了一个 1:1 NAT?
这是个办法。不过折腾这玩意,最大的原因,不是技术,而是不想让 IPv6 用 NAT 的一种心理。
我打算回到传统 VPN ,IPSec IKEv2 或者 L2TP/IPSec ,它们可以动态分配地址。
SakuraYuki
1 天前
从前几楼就可以看出来你不是来分享技术的,而是来和别人对线来凸显自己专业性
dalaoshu25
1 天前
@SakuraYuki 随便,这种话你跟#1 的说去。
maybeonly
1 天前
@shenyuzhi
openvpn 也可以动态分配地址,但是我用这么久以来,还是在用 fd 开头的地址做 snpt
如果有固定地址当然没问题,如果是前缀的话……用脚本更新前缀虽然说也可以,但是根本不如分配私网地址省事
没必要那么忌讳 nat

以及,openvpn 也好 wg 也好,实际上也可以不用从上游拉整段/64 (这里不一定可以方便实现),随便拆个/120 ,在网关上静态路由指过去就得了,撞上的机会基本没有……
dalaoshu25
1 天前
@shenyuzhi 对,netmap 就是 1:1 NAT 一般情况下针对这种本地 VPN 业务,src-nat 已经足够。反正 RouterOS 做这些动态工作很方便,也就多折腾一下。
trott
1 天前
我其实也没看懂楼主想达到什么目的?如果是用希望在外面的时候通过 IPV6, 连回内网, 本身你内网的 wg 服务器应该就是有 IPV6 公网的 IP 的, 不明白为什么要做 IPV6 的 NAT
dalaoshu25
1 天前
@trott 不是为了连回内网,而是连回内网之后,其他人能从外网主动访问到你这个远程的设备。比如你的机器 A 在一个 LAN 里(比如酒店,仅有 v4 ),这样连回家里后,其他外网机器可以通过 IPv6 ssh 登录到你的这台机器 A 。应用场景确实很刁钻。看不懂也很正常。
xqzr
1 天前
@Livid #19 AI
Livid
17 小时 32 分钟前
@xqzr 谢谢,19 楼的账号已经被彻底 ban 。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1099659

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX