让 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 上成功做了实施,效果蛮好。

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

1911 次点击
所在节点    宽带症候群
34 条回复
terrancesiu
1 天前
这个配置,chh 有个贴发了很久了。
dalaoshu25
1 天前
@terrancesiu 给个链接,去学习一下。
everfly
1 天前
ipv6 不需要 nat ,直接给 wg interface 分配 ipv6 地址,然后设置节点的 allowed-addresss 就好了。
dalaoshu25
1 天前
@everfly 希望你知道自己在说什么。你开心就好。
bobryjosin
1 天前
之前在这个帖子看到过 https://www.v2ex.com/t/1024715
dalaoshu25
1 天前
@bobryjosin 你睁大眼睛仔细对比一下。
bobryjosin
1 天前
@dalaoshu25 如果没有理解错,你的这个方法跟我之前看到的帖子中#2 的效果是一样的,防火墙 netmap 替换前缀?多个 wg 节点可以共用同一个公网前缀,同一个公网用后缀区分不同的 wg 节点?刚刚在我的环境根据你提供的配置又配了一遍效果就是这样,还是说有什么特殊的效果?
dalaoshu25
1 天前
@bobryjosin 你测试正确就 OK 了嘛,这种效果不可以?还是说我不能写这种帖子?看你的口气似乎我挡了什么人的财路一样。
justtoxic
1 天前
一直都是在主路由上开双栈,然后给一些单独用 ipv6 的设备开一个支持双栈的 vlan ,这样不用走 nat 也不用 masquerade ,该 vlan 下的设备直接拿到的就是个可外部访问的 v6 地址,这样不需要那么复杂的操作,直接通
dalaoshu25
1 天前
@justtoxic 你说的跟我写的风马牛不相及。

LAN 里面的设备当然是那样,我都开了 3 个 VLAN 呢。咱现在讨论的不是通过 wg 连接进来的嘛。比如你用移动上网获取到的 IPv6 地址不能入站,用 wg 连回家里去之后就能通过这种方式访问。
bobryjosin
1 天前
@dalaoshu25 误会了,如果是我表达有问题我道歉,因为之前做过类似的实验翻到过帖子,你让我仔细对比一下区别,哥们儿找半天实在找不出有啥区别,好奇问下而已。
justtoxic
1 天前
@dalaoshu25 我一直这样用,80 443 之类特定端口不能访问,别的端口是可以访问的,我甚至从联通宽带用 ipv6 连上移动的家里的一个中转设备来操作 nas 下载文件。你路由器拿到的 ipv6 前缀下发给 lan 设备也是公网地址怎么不能访问呢
dalaoshu25
1 天前
@bobryjosin 我还以为在你们这个论坛,略微详细写一下自己的操作过程是犯了什么忌讳。人家分享个最后效果的图我就不能写自己的实现步骤。

反正就是个抛砖引玉,写出来的东西经过你实际测试能用,说明我没有漏写什么过程,这就足够了,其他事情我懒得关心。
dalaoshu25
1 天前
@justtoxic 合着我写了半天 WireGuard 您老就是看不见啊?是我汉语写作能力太退化了辞不达意还是怎样?
justtoxic
1 天前
@dalaoshu25 我说的就是你本地本来直接拿到的 ipv6 地址就外部可访问,本地起一个 wireguard 节点,外部当然是可连接
dalaoshu25
1 天前
@justtoxic 看来大概可能你需要去稍微了解一下 WireGuard , 不要回复了,我不喜欢歪楼。
sealinfree
1 天前
wireguard peers endpoint 不止可以用 ip ,也可以用域名,为何不用域名?
ljl024
1 天前
楼主的意思是不是:“通过路由器上运营商分配的其中一个公网 IPV6 地址,去访问 WireGurad 组的网络中的某个节点”
达成的效果是:给一个没有公网 IP 的设备,映射一个 IPV6 地址,通过路由器的中转去建立连接
xPKK1qofAr6RR09O
1 天前
从这个帖子和互动内容来看,可以从以下几个方面分析他的性格特点和潜在的性格缺陷:

防御性和易怒:dalaoshu25 对不同意见的反应有时显得较为激烈,甚至可能被认为有点挑衅。例如,他在与他人讨论时,常常直接否定别人或显得不耐烦,这可能会使一些人感到他对批评缺乏开放性,或者是对与自己意见不合的观点缺乏包容。

沟通不够包容:虽然他在技术讨论中详细描述了解决方案,但对与自己不同观点的回应显得有些冷淡,甚至是有点傲慢。他可能过于注重自己的观点,忽略了其他人的想法和反馈,这种沟通方式容易导致他人觉得不被尊重或理解。

情绪化反应:在面对他人疑问或意见时,他的回应有时带有明显的情绪色彩,比如使用“希望你知道自己在说什么”或“我不喜欢歪楼”等措辞,这可能反映了他在压力或挑战面前的易怒和情绪化。

总结:
dalaoshu25 在技术领域是非常有能力的,但在沟通和处理冲突时可能存在一定的性格缺陷,尤其是对批评和异议的回应方式,容易产生不必要的摩擦。如果能够更加包容和耐心地与他人互动,尤其是在面对不同意见时,可能会有更好的合作和交流效果。
MYDB
1 天前
已 block ,典型的反驳型人格,还是 100%反驳👍

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

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

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

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

© 2021 V2EX