两个不同的wireguard隧道wg0和wg1通过wlan0和eth0到同一个WAN IP

两个不同的wireguard隧道wg0和wg1通过wlan0和eth0到同一个WAN IP

我有以下配置:

两个接口eth0通过 ISP1 连接并wlan0通过 ISP2 连接到互联网。两个连接都有不同的 IP 地址并允许互联网连接。

我设置了两个wireguard 接口wg0wg1.wg0应该总是通过eth0(无论如何都是默认的),并且wg1应该总是通过wlan0接口。

我遇到的问题是我使用相同的远程服务器对等点(例如对等点 wan ip )同时11.11.11.11连接到两者。因此,当数据包到达时,它可能会尝试通过而不是通过.我尝试添加静态路由规则,但问题是我不需要总是通过路由,因为如果连接来自它也应该通过 发送它。wg0wg1wg1eth0wlan011.11.11.11wlan0eth0eth0

有没有什么方法可以说 - 连接wg1应该始终通过 进行通信wlan0

我在这里看到的其他解决方案是可能的(不确定它是否有效),是为eth0和设置链路聚合wlan0,但我读到不可能聚合​​不同的物理连接?如果我可以有一个wg0可用的接口,无论哪个接口已启动并正在运行(eth0wlan0),那将是最好的。

这是当前配置:

2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 02:81:1e:50:c6:18 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.200/24 brd 192.168.100.255 scope global eth0
       valid_lft forever preferred_lft forever
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 0e:41:58:01:16:9e brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.134/24 brd 192.168.0.255 scope global wlan0
       valid_lft forever preferred_lft forever
4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 10.9.0.1/24 scope global wg0
       valid_lft forever preferred_lft forever
5: wg1: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 10.9.1.1/24 scope global wg0-client
       valid_lft forever preferred_lft forever

更新

添加注释中列出的命令的输出:

ip route

default via 192.168.100.1 dev eth0 onlink
10.9.0.0/24 dev wg0 proto kernel scope link src 10.9.0.1
10.9.1.0/24 dev wg1 proto kernel scope link src 10.9.1.1
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.134
192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.200

ip rule

0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

ip route show table local

local 10.9.0.1 dev wg0 proto kernel scope host src 10.9.0.1
broadcast 10.9.0.255 dev wg0 proto kernel scope link src 10.9.0.1
local 10.9.1.1 dev wg1 proto kernel scope host src 10.9.1.1
broadcast 10.9.1.255 dev wg1 proto kernel scope link src 10.9.1.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 192.168.0.134 dev wlan0 proto kernel scope host src 192.168.0.134
broadcast 192.168.0.255 dev wlan0 proto kernel scope link src 192.168.0.134
local 192.168.100.200 dev eth0 proto kernel scope host src 192.168.100.200
broadcast 192.168.100.255 dev eth0 proto kernel scope link src 192.168.100.200

ip route show table main

default via 192.168.100.1 dev eth0 onlink
10.9.0.0/24 dev wg0 proto kernel scope link src 10.9.0.1
10.9.1.0/24 dev wg1 proto kernel scope link src 10.9.1.1
192.168.0.0/24 dev wlan0 proto kernel scope link src 192.168.0.134
192.168.100.0/24 dev eth0 proto kernel scope link src 192.168.100.200

和wireguard配置:

wg0.conf

[Interface]
Address = 10.9.0.1/24
PrivateKey = xxx
ListenPort = 51820

PostUp = sysctl net.ipv4.conf.%i.forwarding=1 net.ipv4.conf.$(ip r l 0/0 | mawk '{print $5;exit}').forwarding=1
PostUp = sysctl net.ipv6.conf.$(ip r l 0/0 | mawk '{print $5;exit}').accept_ra=2
PostUp = sysctl net.ipv6.conf.%i.forwarding=1 net.ipv6.conf.$(ip r l 0/0 | mawk '{print $5;exit}').forwarding=1
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.9.0.0/24 -o $(ip r l 0/0 | mawk '{print $5;exit}') -j MASQUERADE
PostUp = ip6tables -A FORWARD -i %i -j ACCEPT; ip6tables -t nat -A POSTROUTING -o $(ip r l 0/0 | mawk '{print $5;exit}') -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.9.0.0/24 -o $(ip r l 0/0 | mawk '{print $5;exit}') -j MASQUERADE
PostDown = ip6tables -D FORWARD -i %i -j ACCEPT; ip6tables -t nat -D POSTROUTING -o $(ip r l 0/0 | mawk '{print $5;exit}') -j MASQUERADE

# Client 1
[Peer]
PublicKey = yyy
AllowedIPs = 10.9.0.2/32

wg1.conf

[Interface]
Address = 10.9.1.1/24
PrivateKey = zzz

PostUp = sysctl net.ipv4.conf.wg1.forwarding=1 net.ipv4.conf.wlan0.forwarding=1
PostUp = sysctl net.ipv6.conf.wlan0.accept_ra=2
PostUp = sysctl net.ipv6.conf.wg1.forwarding=1 net.ipv6.conf.wlan0.forwarding=1
PostUp = iptables -A FORWARD -i wg1 -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.9.1.0/24 -o wlan0 -j MASQUERADE
PostUp = ip6tables -A FORWARD -i wg1 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
#PostUp = ip route add 11.11.11.11/32 via 192.168.0.1 dev wlan0
PostDown = iptables -D FORWARD -i wg1 -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.9.1.0/24 -o wlan0 -j MASQUERADE
PostDown = ip6tables -D FORWARD -i wg1 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o wlan0 -j MASQUERADE
#PostDown = ip route del 11.11.11.11/32

[Peer]
PublicKey = qqq
AllowedIPs = 10.9.1.0/24
Endpoint = 11.11.11.11:7777

# Uncomment the following, if you're behind a NAT and want the connection to be kept alive.
PersistentKeepalive = 25

wg 命令状态:

interface: wg0
  public key: ddd
  private key: (hidden)
  listening port: 51820

peer: yyy
  endpoint: 11.11.11.11:51000
  allowed ips: 10.9.0.2/32
  latest handshake: 1 minute, 48 seconds ago
  transfer: 11.99 MiB received, 397.40 MiB sent

interface: wg1
  public key: ggg
  private key: (hidden)
  listening port: 35999

peer: qqq
  endpoint: 11.11.11.11:7777
  allowed ips: 10.9.1.0/24
  transfer: 0 B received, 525.95 KiB sent
  persistent keepalive: every 25 seconds

答案1

在当前 IPv4 设置运行的情况下,可以使用依赖第 4 层(UDP 端口)的策略路由规则来向同一服务器提供两条不同的路由。

因此,与其使用通过该路由到达服务器的路由wlan0,还不如通过该路由覆盖预期发生的路由eth0 喜欢:

ip route add 11.11.11.11/32 via 192.168.0.1 dev wlan0

相反,我们可以依靠 WireGuard 的源端口来进行不同的路由,使用带有端口选择器的规则和由该规则选择的备用路由表。最简单的方法是选择固定的本地 WireGuard 端口。由于 ISP2 的 NAT,远程系统是否看到其他端口并不重要:路由规则仅在本地系统上重要,在远程系统上无关。

更改之前,没有固定的源端口,到达 11.11.11.11 端口 7777 的路由是通过的,eth0而意图是使用wlan0

# ip route get 11.11.11.11 ipproto udp dport 7777
11.11.11.11 via 192.168.100.1 dev eth0 src 192.168.100.200 uid 0 
    cache 
  • 使用固定端口 51821wg1

    将此行添加到以下[Interface]部分wg1.conf

    ListenPort = 51821
    

    同时立即生效:

    wg set wg1 listen-port 51821
    
  • 使用无线网关到 ISP2 准备一个新的路由表(任意选择 1000),其中包含默认路由:

    ip route add default via 192.168.0.1 dev wlan0 table 1000
    
  • 当本地发起的UDP源端口为51821时选择该路由表(这iif lo是特殊语法当地发起的代替路由/转发因此,如果有任何偶然使用相同 UDP 源端口的流量,这不会中断其他路由流量)。

    ip rule add iif lo ipproto udp sport 51821 lookup 1000
    
  • 由于已选择松散反向路径转发 ( rp_filter=2),因此无需进一步调整回复,因为某处存在默认路由(即使它不在同一接口上)。

    因此,在这两种情况下,回复通过wlan0都可以。之前和之后:

    # ip route get iif wlan0 from 11.11.11.11 ipproto udp dport 51821 to 192.168.0.134
    local 192.168.0.134 from 11.11.11.11 dev lo 
        cache <local> iif wlan0 
    

但现在经过这些改变:

# ip route get 11.11.11.11 ipproto udp sport 51821
11.11.11.11 via 192.168.0.1 dev wlan0 table 1000 src 192.168.0.134 uid 0 
    cache 

该流量仅针对 UDP 源端口 51821,即仅针对该wg1接口,使用wlan0而不是eth0.其他 WireGuard 接口不会受到影响:

# ip route get 11.11.11.11 ipproto udp sport 51820
11.11.11.11 via 192.168.100.1 dev eth0 src 192.168.100.200 uid 0 
    cache 

唯一必须运行的两个命令(除了已添加的侦听端口之外wg1.conf)可能应该集成为中的附加PreUp//条目。PostUpPreDownPostDownwg1.conf

相关内容