众所周知: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 上成功做了实施,效果蛮好。
至于这样做有多大的实用性,好不好安不安全,那是另外一个问题,请用家自行评估,偶不接受任何批评反驳。
1
terrancesiu 3 天前
这个配置,chh 有个贴发了很久了。
|
2
dalaoshu25 OP @terrancesiu 给个链接,去学习一下。
|
3
everfly 3 天前 via iPhone
ipv6 不需要 nat ,直接给 wg interface 分配 ipv6 地址,然后设置节点的 allowed-addresss 就好了。
|
4
dalaoshu25 OP @everfly 希望你知道自己在说什么。你开心就好。
|
5
bobryjosin 3 天前
之前在这个帖子看到过 https://www.v2ex.com/t/1024715
|
6
dalaoshu25 OP @bobryjosin 你睁大眼睛仔细对比一下。
|
7
bobryjosin 3 天前
@dalaoshu25 如果没有理解错,你的这个方法跟我之前看到的帖子中#2 的效果是一样的,防火墙 netmap 替换前缀?多个 wg 节点可以共用同一个公网前缀,同一个公网用后缀区分不同的 wg 节点?刚刚在我的环境根据你提供的配置又配了一遍效果就是这样,还是说有什么特殊的效果?
|
8
dalaoshu25 OP @bobryjosin 你测试正确就 OK 了嘛,这种效果不可以?还是说我不能写这种帖子?看你的口气似乎我挡了什么人的财路一样。
|
9
justtoxic 3 天前 via iPhone
一直都是在主路由上开双栈,然后给一些单独用 ipv6 的设备开一个支持双栈的 vlan ,这样不用走 nat 也不用 masquerade ,该 vlan 下的设备直接拿到的就是个可外部访问的 v6 地址,这样不需要那么复杂的操作,直接通
|
10
dalaoshu25 OP @justtoxic 你说的跟我写的风马牛不相及。
LAN 里面的设备当然是那样,我都开了 3 个 VLAN 呢。咱现在讨论的不是通过 wg 连接进来的嘛。比如你用移动上网获取到的 IPv6 地址不能入站,用 wg 连回家里去之后就能通过这种方式访问。 |
11
bobryjosin 3 天前 via Android
@dalaoshu25 误会了,如果是我表达有问题我道歉,因为之前做过类似的实验翻到过帖子,你让我仔细对比一下区别,哥们儿找半天实在找不出有啥区别,好奇问下而已。
|
12
justtoxic 3 天前 via iPhone
@dalaoshu25 我一直这样用,80 443 之类特定端口不能访问,别的端口是可以访问的,我甚至从联通宽带用 ipv6 连上移动的家里的一个中转设备来操作 nas 下载文件。你路由器拿到的 ipv6 前缀下发给 lan 设备也是公网地址怎么不能访问呢
|
13
dalaoshu25 OP @bobryjosin 我还以为在你们这个论坛,略微详细写一下自己的操作过程是犯了什么忌讳。人家分享个最后效果的图我就不能写自己的实现步骤。
反正就是个抛砖引玉,写出来的东西经过你实际测试能用,说明我没有漏写什么过程,这就足够了,其他事情我懒得关心。 |
14
dalaoshu25 OP @justtoxic 合着我写了半天 WireGuard 您老就是看不见啊?是我汉语写作能力太退化了辞不达意还是怎样?
|
15
justtoxic 3 天前 via iPhone
@dalaoshu25 我说的就是你本地本来直接拿到的 ipv6 地址就外部可访问,本地起一个 wireguard 节点,外部当然是可连接
|
16
dalaoshu25 OP @justtoxic 看来大概可能你需要去稍微了解一下 WireGuard , 不要回复了,我不喜欢歪楼。
|
17
sealinfree 3 天前
wireguard peers endpoint 不止可以用 ip ,也可以用域名,为何不用域名?
|
18
ljl024 3 天前
楼主的意思是不是:“通过路由器上运营商分配的其中一个公网 IPV6 地址,去访问 WireGurad 组的网络中的某个节点”
达成的效果是:给一个没有公网 IP 的设备,映射一个 IPV6 地址,通过路由器的中转去建立连接 |
19
xPKK1qofAr6RR09O 3 天前 5
从这个帖子和互动内容来看,可以从以下几个方面分析他的性格特点和潜在的性格缺陷:
防御性和易怒:dalaoshu25 对不同意见的反应有时显得较为激烈,甚至可能被认为有点挑衅。例如,他在与他人讨论时,常常直接否定别人或显得不耐烦,这可能会使一些人感到他对批评缺乏开放性,或者是对与自己意见不合的观点缺乏包容。 沟通不够包容:虽然他在技术讨论中详细描述了解决方案,但对与自己不同观点的回应显得有些冷淡,甚至是有点傲慢。他可能过于注重自己的观点,忽略了其他人的想法和反馈,这种沟通方式容易导致他人觉得不被尊重或理解。 情绪化反应:在面对他人疑问或意见时,他的回应有时带有明显的情绪色彩,比如使用“希望你知道自己在说什么”或“我不喜欢歪楼”等措辞,这可能反映了他在压力或挑战面前的易怒和情绪化。 总结: dalaoshu25 在技术领域是非常有能力的,但在沟通和处理冲突时可能存在一定的性格缺陷,尤其是对批评和异议的回应方式,容易产生不必要的摩擦。如果能够更加包容和耐心地与他人互动,尤其是在面对不同意见时,可能会有更好的合作和交流效果。 |
20
MYDB 3 天前 via iPhone
已 block ,典型的反驳型人格,还是 100%反驳👍
|
21
hackroad 3 天前
@ppbaozi wc ,还有 ai 。。。
另外借楼问下 @dalaoshu25 家里一直没弄过 ipv6 ,这两天逛 v2 看到不少人在玩这个,我也试了下。发现不管是改哪个 AC ,ipv6 dhcp 一直是 searching ,有些帖子说上海电信默认开 ipv6 了,难道我要单独去找装维开一下么。 MSE-1.MAN.M6000 VBASCP-1.NMAN.V6000 dhcp debug log 如图 |
22
dalaoshu25 OP @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 |
24
hackroad 3 天前
@dalaoshu25 @xhcnb OK ,晚上回去查查光猫桥接的配置
|
25
hackroad 3 天前
@dalaoshu25 不算歪的厉害,毕竟外面情况下手机和 mac 都是通过 wg 回家,也能用上你的方案。
|
26
shenyuzhi 3 天前
其实就是做了一个 1:1 NAT?
这是个办法。不过折腾这玩意,最大的原因,不是技术,而是不想让 IPv6 用 NAT 的一种心理。 我打算回到传统 VPN ,IPSec IKEv2 或者 L2TP/IPSec ,它们可以动态分配地址。 |
27
SakuraYuki 3 天前
从前几楼就可以看出来你不是来分享技术的,而是来和别人对线来凸显自己专业性
|
28
dalaoshu25 OP @SakuraYuki 随便,这种话你跟#1 的说去。
|
29
maybeonly 2 天前
@shenyuzhi
openvpn 也可以动态分配地址,但是我用这么久以来,还是在用 fd 开头的地址做 snpt 如果有固定地址当然没问题,如果是前缀的话……用脚本更新前缀虽然说也可以,但是根本不如分配私网地址省事 没必要那么忌讳 nat 以及,openvpn 也好 wg 也好,实际上也可以不用从上游拉整段/64 (这里不一定可以方便实现),随便拆个/120 ,在网关上静态路由指过去就得了,撞上的机会基本没有…… |
30
dalaoshu25 OP @shenyuzhi 对,netmap 就是 1:1 NAT 一般情况下针对这种本地 VPN 业务,src-nat 已经足够。反正 RouterOS 做这些动态工作很方便,也就多折腾一下。
|
31
trott 2 天前
我其实也没看懂楼主想达到什么目的?如果是用希望在外面的时候通过 IPV6, 连回内网, 本身你内网的 wg 服务器应该就是有 IPV6 公网的 IP 的, 不明白为什么要做 IPV6 的 NAT
|
32
dalaoshu25 OP @trott 不是为了连回内网,而是连回内网之后,其他人能从外网主动访问到你这个远程的设备。比如你的机器 A 在一个 LAN 里(比如酒店,仅有 v4 ),这样连回家里后,其他外网机器可以通过 IPv6 ssh 登录到你的这台机器 A 。应用场景确实很刁钻。看不懂也很正常。
|