让 WireGuard 节点也能用公网 IPv6 地址从外边访问 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dalaoshu25
V2EX    宽带症候群

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

  •  
  •   dalaoshu25 292 天前 3717 次点击
    这是一个创建于 292 天前的主题,其中的信息可能已经有所发展或是发生改变。

    众所周知: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 条附言    291 天前
    3 楼 9 楼 17 楼几位的评论让我丈二金刚摸不着头脑。忽然想到,他们的意思是说路由器里相当于“server”这一侧的 wg 节点可以用普通的 IPv6 方式直接访问到?

    如果是这个意思,那就说得通了。可惜,跟我的帖子内容完全没有半毛钱关系。

    我这个文章里说的,是远程访问那一侧的 wg 节点,比如出门在外的手机笔记本平板电脑啦、某个场所里一台局域网里的电脑啦之类的。

    我说的是前门楼子,你聊的是 xx 头子。看来我需要改进一下汉语写作能力。
    36 条回复    2024-12-30 19:57:41 +08:00
    terrancesiu
        1
    terrancesiu  
       292 天前
    这个配置,chh 有个贴发了很久了。
    dalaoshu25
        2
    dalaoshu25  
    OP
       292 天前
    @terrancesiu 给个链接,去学习一下。
    everfly
        3
    everfly  
       292 天前 via iPhone
    ipv6 不需要 nat ,直接给 wg interface 分配 ipv6 地址,然后设置节点的 allowed-addresss 就好了。
    dalaoshu25
        4
    dalaoshu25  
    OP
       292 天前   1
    @everfly 希望你知道自己在说什么。你开心就好。
    bobryjosin
        5
    bobryjosin  
       292 天前
    之前在这个帖子看到过 t/1024715
    dalaoshu25
        6
    dalaoshu25  
    OP
       292 天前
    @bobryjosin 你睁大眼睛仔细对比一下。
    bobryjosin
        7
    bobryjosin  
       292 天前
    @dalaoshu25 如果没有理解错,你的这个方法跟我之前看到的帖子中#2 的效果是一样的,防火墙 netmap 替换前缀?多个 wg 节点可以共用同一个公网前缀,同一个公网用后缀区分不同的 wg 节点?刚刚在我的环境根据你提供的配置又配了一遍效果就是这样,还是说有什么特殊的效果?
    dalaoshu25
        8
    dalaoshu25  
    OP
       292 天前
    @bobryjosin 你测试正确就 OK 了嘛,这种效果不可以?还是说我不能写这种帖子?看你的口气似乎我挡了什么人的财路一样。
    justtoxic
        9
    justtoxic  
       292 天前 via iPhone
    一直都是在主路由上开双栈,然后给一些单独用 ipv6 的设备开一个支持双栈的 vlan ,这样不用走 nat 也不用 masquerade ,该 vlan 下的设备直接拿到的就是个可外部访问的 v6 地址,这样不需要那么复杂的操作,直接通
    dalaoshu25
        10
    dalaoshu25  
    OP
       292 天前
    @justtoxic 你说的跟我写的风马牛不相及。

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

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

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

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

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

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

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

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

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

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

    就是这个是你写的吧?多线接入 IPv6 的策略路由怎么弄
    https://www.chiphell.com/thread-2621637-1-1.html
    (出处: Chiphell - 分享与交流用户体验)

    蛮好。再加上脚本自动更新前缀就更完善了。
    thereone
        36
    thereone  
       285 天前 via Android
    方法不错算是拓展了 wireguard 的使用方法,不过我这边用 softether 也实现了给没有 ipv6 网络的远程接入设备分配 ipv6 。相比你这个我是觉得 softether 更简单一些,图形化界面点点点就搞好了。当然这个相比 wireguard 更重所以觉得哪个好用就用哪个吧。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     891 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 20:22 PVG 04:22 LAX 13:22 JFK 16:22
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86