V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dalaoshu25
V2EX  ›  宽带症候群

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

  •  
  •   dalaoshu25 · 1 天前 · 1778 次点击

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

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

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

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

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

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

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

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

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

    总结:
    dalaoshu25 在技术领域是非常有能力的,但在沟通和处理冲突时可能存在一定的性格缺陷,尤其是对批评和异议的回应方式,容易产生不必要的摩擦。如果能够更加包容和耐心地与他人互动,尤其是在面对不同意见时,可能会有更好的合作和交流效果。
    MYDB
        20
    MYDB  
       16 小时 29 分钟前 via iPhone
    已 block ,典型的反驳型人格,还是 100%反驳👍
    hackroad
        21
    hackroad  
       16 小时 23 分钟前
    @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
       16 小时 0 分钟前
    @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  
       15 小时 55 分钟前
    @hackroad 检查光猫, 光猫上的连接里要设置为 ipv4/ipv6, 嫌麻烦就直接打 10000
    hackroad
        24
    hackroad  
       15 小时 46 分钟前
    @dalaoshu25 @xhcnb OK ,晚上回去查查光猫桥接的配置
    hackroad
        25
    hackroad  
       15 小时 45 分钟前
    @dalaoshu25 不算歪的厉害,毕竟外面情况下手机和 mac 都是通过 wg 回家,也能用上你的方案。
    shenyuzhi
        26
    shenyuzhi  
       15 小时 9 分钟前
    其实就是做了一个 1:1 NAT?
    这是个办法。不过折腾这玩意,最大的原因,不是技术,而是不想让 IPv6 用 NAT 的一种心理。
    我打算回到传统 VPN ,IPSec IKEv2 或者 L2TP/IPSec ,它们可以动态分配地址。
    SakuraYuki
        27
    SakuraYuki  
       15 小时 4 分钟前
    从前几楼就可以看出来你不是来分享技术的,而是来和别人对线来凸显自己专业性
    dalaoshu25
        28
    dalaoshu25  
    OP
       14 小时 2 分钟前
    @SakuraYuki 随便,这种话你跟#1 的说去。
    maybeonly
        29
    maybeonly  
       13 小时 34 分钟前
    @shenyuzhi
    openvpn 也可以动态分配地址,但是我用这么久以来,还是在用 fd 开头的地址做 snpt
    如果有固定地址当然没问题,如果是前缀的话……用脚本更新前缀虽然说也可以,但是根本不如分配私网地址省事
    没必要那么忌讳 nat

    以及,openvpn 也好 wg 也好,实际上也可以不用从上游拉整段/64 (这里不一定可以方便实现),随便拆个/120 ,在网关上静态路由指过去就得了,撞上的机会基本没有……
    dalaoshu25
        30
    dalaoshu25  
    OP
       12 小时 32 分钟前
    @shenyuzhi 对,netmap 就是 1:1 NAT 一般情况下针对这种本地 VPN 业务,src-nat 已经足够。反正 RouterOS 做这些动态工作很方便,也就多折腾一下。
    trott
        31
    trott  
       11 小时 52 分钟前
    我其实也没看懂楼主想达到什么目的?如果是用希望在外面的时候通过 IPV6, 连回内网, 本身你内网的 wg 服务器应该就是有 IPV6 公网的 IP 的, 不明白为什么要做 IPV6 的 NAT
    dalaoshu25
        32
    dalaoshu25  
    OP
       11 小时 15 分钟前
    @trott 不是为了连回内网,而是连回内网之后,其他人能从外网主动访问到你这个远程的设备。比如你的机器 A 在一个 LAN 里(比如酒店,仅有 v4 ),这样连回家里后,其他外网机器可以通过 IPv6 ssh 登录到你的这台机器 A 。应用场景确实很刁钻。看不懂也很正常。
    xqzr
        33
    xqzr  
       5 小时 12 分钟前
    @Livid #19 AI
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1107 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 19:04 · PVG 03:04 · LAX 11:04 · JFK 14:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.