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

一个关于 Wireguard AllowedIPs 的问题

  •  
  •   sofukwird · 2023-04-20 17:13:29 +08:00 · 2862 次点击
    这是一个创建于 372 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个关于 wireguard AllowedIPs 的问题, 想在节点 B 上以 192.168.0.2 地址访问节点 A 10.13.0.1, 请问什么方法可以做到吗?

    在节点 A 上我有以下配置

    [Interface]
    Address = 10.13.0.1/24
    PrivateKey = aaaaaaaa
    ListenPort = 0
    
    [Peer]
    PublicKey = bbbbbb
    AllowedIPs = 10.13.0.2/32
    

    在节点 B 上有以下配置

    [Interface]
    Address = 192.168.0.1/24
    PrivateKey = bbbbbbb
    ListenPort = 0
    
    [Peer]
    PublicKey = aaaaaaa
    AllowedIPs = 192.168.0.2/32:10.13.0.1/32
    
    第 1 条附言  ·  2023-04-20 18:35:47 +08:00
    节点 B 网段是需要不一样的,握手是成功的,大概是要做次 SNAT ?
    ```conf
    #可以当作是下面配置的进化版
    #AllowedIPs=192.168.0.2/32:10.13.0.1/32
    AllowedIPs=10.13.0.1/32
    ```
    为什么这么特殊呢?因为机器不是由一个人控制的,无法决定节点 B 的 IP 段是多少,所以需要这样一个地址转换来保证 IP 段不冲突
    第 2 条附言  ·  2023-04-20 21:27:41 +08:00
    节点 B 的配置如下, `ip route add 10.13.0.1 via 10.13.0.2`可以访问 `10.13.0.1`,我想把他改成`ip route add 192.168.0.2 via 10.13.0.2`之后能通过 192.168.0.2 访问 10.13.0.1
    ```conf
    [Interface]
    Address = 192.168.0.1/24, 10.13.0.2
    PrivateKey = bbbbbbb
    ListenPort = 0

    [Peer]
    PublicKey = aaaaaaa
    AllowedIPs = 10.13.0.1/32
    ```
    第 3 条附言  ·  2023-04-21 01:46:26 +08:00
    解决了,我 TM 直接用 IPv6 内网地址,这下地址多到用不完了,地址冲突的问题就留给继续用 IPv4 的人考虑吧
    18 条回复    2023-04-27 12:17:31 +08:00
    titanium98118
        1
    titanium98118  
       2023-04-20 17:43:44 +08:00   ❤️ 1
    根据我使用 wireguard 的理解
    A 和 B 的[Interface] Address 需要是一个网段,不然他们怎么能连通?
    A 的 AllowedIPs 表示哪个 IP 或 IP 段能与 A 建立通信,在这里应该填写 B 的[Interface] Address
    B 的 AllowedIPs 表示哪个 IP 或 IP 段需要经过 wireguard 路由
    #A
    [Interface]
    Address = 192.168.0.1/24
    PrivateKey = aaaaaaaa
    ListenPort = 0
    [Peer]
    PublicKey = bbbbbb
    AllowedIPs = 192.168.0.2/32

    #B
    [Interface]
    Address = 192.168.0.2/24
    PrivateKey = bbbbbbb
    ListenPort = 0
    [Peer]
    PublicKey = aaaaaaa
    AllowedIPs = 192.168.0.1/32,10.13.0.1/32

    wireguard 起来后,看能不能 Ping 通相方,然后你需要在 A 上做一个 NAT:
    iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
    SGTeam
        2
    SGTeam  
       2023-04-20 17:52:16 +08:00 via Android
    不需要指定那个 endpoint 吗?
    sofukwird
        3
    sofukwird  
    OP
       2023-04-20 18:01:54 +08:00 via Android
    @titanium98118 节点 B 网段是需要不一样的,握手是成功的,大概是要做次 SNAT ?
    sofukwird
        4
    sofukwird  
    OP
       2023-04-20 18:02:40 +08:00 via Android
    @SGTeam 我省略了无关配置
    rrfeng
        5
    rrfeng  
       2023-04-20 18:12:49 +08:00 via Android
    interface 是本地接口地址

    allowedips 就是加路由,把目标地址路由到接口。

    所以要添加:对端网段地址,对端接口地址。

    一般来说,多个节点的一个大 wg ,接口地址分配一个段,不和任意内网地址重合,直接把这个段放进去就行了。
    questionyu
        6
    questionyu  
       2023-04-20 19:49:11 +08:00   ❤️ 1
    一般来说,像这样的 Site-to-Site 的 VPN ,需要梳理清楚 4 个网络:
    1. 互联网(指两个路由器的 WAN 端口所连接的网络,需要填写地址到对方路由器 WireGuard 配置 [Peer] 中的 Endpoint )
    2. WireGuard 网络(指两个路由器 WireGuard 配置 [Interface] 中的地址所在的网络,需要在同一内网,且不与两个路由器内网地址重复)
    3. 路由器 A 内网(指路由器 A LAN 端口所连接的网络,需要填写网段到路由器 B WireGuard 配置 [Peer] 中的 AllowedIPs )
    4. 路由器 B 内网(指路由器 B LAN 端口所连接的网络,需要填写网段到路由器 A WireGuard 配置 [Peer] 中的 AllowedIPs )

    搞清楚这四个网络以后,再在两个路由器上做好转发就可以实现两端局域网互通了。
    azure2023us559
        7
    azure2023us559  
       2023-04-20 20:05:04 +08:00   ❤️ 1
    b 上再加一个 client ,地址是 10.13.0.2

    参考 https://github.com/0neday/gl-inet-mt-3000/blob/main/readme.md

    #!/bin/sh
    ip link add wg-client2 type wireguard
    ip link set mtu 1420 up dev wg-client2
    ip -4 address add 10.13.0.2 dev wg-client2
    ip route add 10.13.1.0/24 dev wg-client2
    wg setconf wg-client2 client2.conf
    iptables -t nat -A POSTROUTING -o wg-client2 -j MASQUERADE
    iptables -I FORWARD -i wg-client2 -j ACCEPT
    iptables -I FORWARD -o wg-client2 -j ACCEPT

    # client2.conf
    [Interface]
    PrivateKey =

    [Peer]
    PublicKey =
    Endpoint =
    PersistentKeepalive = 25
    AllowedIPs = 0.0.0.0/0
    azure2023us559
        8
    azure2023us559  
       2023-04-20 20:07:41 +08:00
    如果 a 和 b 都是 wg client 的话,那么要在 wg server 上 要开启 client 数据转发,加一条 iptables

    iptables -A FORWARD -i wg0 -o wg0 -j ACCEPT
    Daeyn
        9
    Daeyn  
       2023-04-20 21:01:04 +08:00 via iPhone
    azure2023us559
        10
    azure2023us559  
       2023-04-20 22:25:32 +08:00   ❤️ 1
    更正下

    ip route add 10.13.0.0/24 dev wg-client2

    让这个段的地址走 wg-client2
    yunisky
        11
    yunisky  
       2023-04-21 01:59:47 +08:00   ❤️ 1
    我做了个 p2mp 结构的多点互访,AllowedIPs 直接写 0.0.0.0 ,然后用动态路由协议来搞路由就好了。
    如果站点少,其实用静态路由解决也行。
    wireguard 就专门拿来打隧道,路由的问题还是交给专业的组件来解决吧。
    sofukwird
        12
    sofukwird  
    OP
       2023-04-21 02:16:48 +08:00 via Android
    @yunisky 确实,还是自己学艺不精导致的问题,如果我懂动态路由的话就不会被绑定在 wireguard 的路由脚本上了

    不过 IPv6 能解决问题也挺好
    thereone
        13
    thereone  
       2023-04-21 19:02:38 +08:00   ❤️ 1
    搞的麻烦,个人用我永远推荐 softether 这个软件。支持 IPv4 和 IPv6 同时可以随时切换采用 TCP 或者 UDP 协议。而且配置全图形界面使用简单方便同时还有丰富的接入策略。配合 openwrt 可以做到路由器两端某一个接口二层点对点隧道都行逻辑上来说就是一根超长的网线,不要太强大了。
    sofukwird
        14
    sofukwird  
    OP
       2023-04-21 19:38:29 +08:00 via Android
    @thereone 你说的对,但我要做的是点对点直连,softether 做不到,始终要个中转站
    thereone
        15
    thereone  
       2023-04-21 20:51:18 +08:00   ❤️ 1
    @sofukwird 要中转站?我这边异地 IPV6 直连根本不需要中转。老家 IPv6 做服务器同时用 dynv6 的 ddns 更新 ipv6 地址,现在住的位置 ipv6 直连回老家。根本不需要中转啊。
    233373
        16
    233373  
       2023-04-27 09:21:07 +08:00
    @sofukwird wireguard 好像做不到点对点直连,默认都是要走 wg 服务端中转的,大佬有什么方案可以实现点对点吗?之前研究过 headscale ,但是不知道为什么有一台手机一直连不上就放弃了。。。。
    sbilly
        17
    sbilly  
       2023-04-27 09:42:05 +08:00
    wireguard 实现点对点 fullmesh 完全没问题
    izhaohui
        18
    izhaohui  
       2023-04-27 12:17:31 +08:00 via iPhone
    allowedIP 就是哪些网络( subnet / address )能通过这个节点到达
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2807 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 04:02 · PVG 12:02 · LAX 21:02 · JFK 00:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.