V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LittleState
V2EX  ›  WireGuard

想请问一下各位, Wireguard IPv4 连接没问题,但是 IPv6 却遇到下面这样的情况怎么办?

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

    我两台路由器使用 ipv4 连接对端时没有任何问题,但是换成 ipv6 后,我在异地使用 iperf3 测试家中的设备,除了路由器外,其他设备基本都没速度...

    这是是怎么回事,我把 wg 的 mtu 已经改成了 1280 。 大概的网络环境就是下面这样

    image.png

    然后使用 iperf3 测速就这样

    image.png

    大概试了 3 种情况:

    1. OpenWrt-A 和 OpenWrt-B 上运行 wireguard 并连接,就是上面的图那样
    2. 笔记本 和 OpenWrt-A 连接,还是和 1 是一样的效果
    3. 笔记本 和 树莓派 连接,这样没任何问题,访问其他设备也是满速

    两个路由器的配置

    使用的 luci-app-wireguard ,基本上就只改了 mtu 为 1280

    笔记本配置文件

    // 笔记本
    [Interface]
    PrivateKey =
    Address = 10.10.0.2/32
    MTU = 1280
    
    [Peer]
    PublicKey = 
    AllowedIPs = 10.10.0.0/24, 192.168.2.0/24
    Endpoint = <ipv6-ddns-域名>:38538
    PersistentKeepalive = 25
    

    树莓派配置

    [Interface]
    PrivateKey = 
    Address = 10.10.0.1/24
    ListenPort = 38538
    MTU = 1280
    
    #replace eth0 with the interface open to the internet (e.g might be wlan0 if wifi)
    PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
    # IP masquerading
    PreUp = iptables -t mangle -A PREROUTING -i wg0 -j MARK --set-mark 0x30
    PreUp = iptables -t nat -A POSTROUTING ! -o wg0 -m mark --mark 0x30 -j MASQUERADE
    PostDown = iptables -t mangle -D PREROUTING -i wg0 -j MARK --set-mark 0x30
    PostDown = iptables -t nat -D POSTROUTING ! -o wg0 -m mark --mark 0x30 -j MASQUERADE
    
    # laptop
    [Peer]
    PublicKey = 
    AllowedIPs = 10.10.0.2/32
    
    第 1 条附言  ·  249 天前
    破案了,给 Openwrt-B 刷了官方固件(也可能之前的固件默认也开启了 IPv6 硬件加速吧),同时给家中的 Openwrt-A 关闭了 IPv6 硬件加速就好了,现在 IPv6 wg 隧道速度正常了。也多谢 @zbinlin 帮我排查了一下午。
    27 条回复    2023-08-22 12:24:08 +08:00
    1423
        1
    1423  
       251 天前   ❤️ 1
    有必要 masquerading 吗?
    用 openwrt 了,为什么还手写 iptables,用 luci web ui 配置不更好吗?
    zbinlin
        2
    zbinlin  
       251 天前   ❤️ 1
    怎么你文中描述的前后矛盾:

    > 除了路由器外,其他设备基本都没速度

    > 笔记本 和 树莓派 连接,这样没任何问题,访问其他设备也是满速

    还有可以试试树莓派跟 OpenWrt-B 看有没有问题
    LittleState
        3
    LittleState  
    OP
       251 天前
    @zbinlin #2 抱歉,是我的错,问题描述的太混乱了... 可能因为我自己也没理的太清楚

    就是说我的目的是想让路由器 A 、B 使用 ipv6 组网,这样两边局域网内的设备都能互相访问了嘛

    但是就是这个方式连接后,使用 iperf3 测速,除了 A 、B 外,对方的网络内其他设备速度都很慢

    所以我就尝试用身边的笔记本开启 wireguard 连接路由器 A ,结果也是和上面同样的。

    之后就尝试把树莓派作为 peer ,用笔记本连接,也是用 ipv6 ,但是就没有问题了...
    zbinlin
        4
    zbinlin  
       251 天前   ❤️ 1
    这看明白了。
    那你再试下 树莓派跟 OpenWrt-B 连看有没有问题
    LittleState
        5
    LittleState  
    OP
       250 天前
    @zbinlin #4 我刚按你说的试了下 OpenWrt-B 连接 树莓派

    然后从 OpenWrt-B 上测试都没问题,速度都满速
    - iperf3 -c 192.168.2.221 (树莓派)
    - iperf3 -c 192.168.2.1 ( Openwrt-A )

    但是从 OpenWrt-B 局域网内的笔记本测试上面的命令,又都是只有几百 KB/s 。

    但是我从树莓派上测试连接对端,都是可以满速...
    - iperf3 -c 192.168.3.1 ( OpenWrt-B )
    - iperf3 -c 192.168.3.230 (笔记本)
    LittleState
        6
    LittleState  
    OP
       250 天前
    @zbinlin #4 OpenWrt-A 连接 OpenWrt-B 时,我看了两边的路由器,CPU 负载也不高
    zbinlin
        7
    zbinlin  
       250 天前   ❤️ 1
    你上面的测试是基于 Openwrt A <-> Openwrt B wireguard 隧道来测的吧?
    LittleState
        8
    LittleState  
    OP
       250 天前
    @zbinlin #7 我在 5 楼回复的那些测试,是 树莓派 <-> Openwrt-B 这样连接的隧道
    zbinlin
        9
    zbinlin  
       250 天前   ❤️ 1
    你还是基于 Openwrt A <-> Openwrt B wireguard 隧道 来测试,把 mtu 调大点,1340 试试,看有没有变化

    分别测
    树莓派连 Openwrt B
    树莓派连 笔记本
    笔记本连 Openwrt A
    笔记本连 树莓派
    zbinlin
        10
    zbinlin  
       250 天前   ❤️ 1
    也测试下 iperf3 加参数 --set-mss 900 试试
    LittleState
        11
    LittleState  
    OP
       250 天前
    好像还是那样子,两边的 mtu 改成了 1340... 不过还是谢谢了,头都大了啊。

    笔记本连 Openwrt A
    笔记本连 树莓派

    https://sm.ms/image/pugvytqY2CFlmNK

    树莓派连 Openwrt B
    树莓派连 笔记本

    https://sm.ms/image/g86KW2ecrsZzML1
    zbinlin
        12
    zbinlin  
       250 天前   ❤️ 1
    iperf3 换参数 `--udp` 测下 udp 的看怎样?
    LittleState
        13
    LittleState  
    OP
       250 天前
    @zbinlin #12 我刚到家里,现在试试啊。使用 --udp 测试 A 、B 路由器的话会报这个错误:`iperf3: error - unable to read from stream socket: Connection refused`

    然后 笔记本 ---> 树莓派 测试结果就是下面这样

    ![image.png]( https://s2.loli.net/2023/08/20/8YQVzJUliZMWgS3.png)
    bobryjosin
        14
    bobryjosin  
       250 天前   ❤️ 1
    接口的 MTU 是一样的吗,重启一下接口看看?直接用默认的 1420 。
    LittleState
        15
    LittleState  
    OP
       250 天前
    @bobryjosin #14 是一样的,我刚重启了两边,用默认的 MTU 也还是那样子...

    上面一直就是 OpenWrt-B 用 IPv6 连接的 OpenWrt-A ,但是只要我改成 IPv4 连接就没问题了... 难道是 IPv6 到 IPv4 有损耗吗?
    ysc3839
        16
    ysc3839  
       250 天前 via Android   ❤️ 1
    WireGuard 接口的 MTU 设置成 1200 甚至更低试试?另外建议抓包看看有没有 ICMP 返回错误
    bobryjosin
        17
    bobryjosin  
       250 天前 via Android   ❤️ 1
    @LittleState 我之前也是遇到和你一样的问题,mtu 太小导致的,ping 正常但是 ssh http 大包过不去,你看看直接用两台 openwrt 下面的 lan ip 互相用多线程打个流看看,目前我和海外的机器组网也是 ipv6 ,多线程打流没有问题,另外可以把标记路由的 postup 语句删了看看?
    LittleState
        18
    LittleState  
    OP
       250 天前
    @ysc3839 #16

    我试了下改成了 1200 、1000 没有什么变化,我在 OpenWrt-B 上用 tcpdump icmp 好像也没抓到什么错误信息。

    ![image.png]( https://s2.loli.net/2023/08/21/i5I1D28aZHbted9.png)

    现在问题就是,我在两边路由器上用 iperf 测试,它俩互相是正常的,但是访问对方局域网内的其他设备,就不行很慢
    LittleState
        19
    LittleState  
    OP
       250 天前
    @bobryjosin #17

    是这样测试吗?对了那个 postup 配置是树莓派上的,现在没用树莓派作为 peer ,而是在两台 OpenWrt 路由器上启动的 wg

    左边是 OpenWrt-B ---> OpenWrt-A
    右边是 OpenWrt-B ---> 树莓派

    ![image.png]( https://s2.loli.net/2023/08/21/fq6JFxitdZ2DGEV.png)
    zbinlin
        20
    zbinlin  
       250 天前
    你直接 ping 下对应的设备看下:

    Openwrt A ping Openwrt B
    树莓派 ping Openwrt B
    树莓派 ping 笔记本
    LittleState
        21
    LittleState  
    OP
       250 天前
    @zbinlin #20

    好像看起来都挺正常的?

    https://s2.loli.net/2023/08/21/RBEbm4NAt6GjWxo.png
    zbinlin
        22
    zbinlin  
       250 天前
    @LittleState #21 这看起来没问题。看下 openwrt a/b 上的这些设备信息:

    `ip addr`
    `ip route` 和 `ip -6 route`
    `ip rule` 和 `ip -6 rule`

    openwrt 如果是用最新版的:`nft list ruleset`
    LittleState
        23
    LittleState  
    OP
       250 天前
    @zbinlin #22 多谢了啊,我把有些公网地址打码了,要是有影响到的话,我重新截图一份

    OpenWrt-A
    - `ip addr`
    https://sm.ms/image/jyAlI6wrLGCbnZK

    - `ip route` 和 `ip -6 route`
    https://sm.ms/image/16M2zuo8Frm9TUA

    - `ip rule` 和 `ip -6 rule`
    https://sm.ms/image/etc1Rd7QHNCSb6I

    OpenWrt-B :
    - `ip addr`
    https://sm.ms/image/pUYuPGFwjyb4Hki

    - `ip route` 和 `ip -6 route`
    https://sm.ms/image/IiPzZ6yTDux1Uh4

    - `ip rule` 和 `ip -6 rule`
    https://sm.ms/image/3YHFrN9d7inCUOI
    zbinlin
        24
    zbinlin  
       250 天前   ❤️ 1
    看起来都正常,你这问题搞得我都挺感兴趣了,如果方便的,可以 email 联系我远程上去看下 :)
    LittleState
        25
    LittleState  
    OP
       250 天前
    @zbinlin #24 我给您 outlook 发邮件了
    LittleState
        26
    LittleState  
    OP
       249 天前
    @bobryjosin #17 话说想问一下,你说的是和海外机器用 ipv6 wg 隧道组网吗,那不会被封吗
    bobryjosin
        27
    bobryjosin  
       249 天前
    @LittleState 海外除了路由比较烂,现在没有任何审计策略,除了 google ,facebook 一些主流厂商的 ipv6 的地址是直接被阻断的,cloudflare 的 warp ipv6 2606:4700::/32 这段 ip 部分地区 udp 阻断,其他的没有任何限制,wireguard 和 ss 这些非常明显的协议可以随便跑。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2763 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 06:35 · PVG 14:35 · LAX 23:35 · JFK 02:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.