![两个不同的wireguard隧道wg0和wg1通过wlan0和eth0到同一个WAN IP](https://linux22.com/image/227949/%E4%B8%A4%E4%B8%AA%E4%B8%8D%E5%90%8C%E7%9A%84wireguard%E9%9A%A7%E9%81%93wg0%E5%92%8Cwg1%E9%80%9A%E8%BF%87wlan0%E5%92%8Ceth0%E5%88%B0%E5%90%8C%E4%B8%80%E4%B8%AAWAN%20IP.png)
我有以下配置:
两个接口eth0
通过 ISP1 连接并wlan0
通过 ISP2 连接到互联网。两个连接都有不同的 IP 地址并允许互联网连接。
我设置了两个wireguard 接口wg0
和wg1
.wg0
应该总是通过eth0
(无论如何都是默认的),并且wg1
应该总是通过wlan0
接口。
我遇到的问题是我使用相同的远程服务器对等点(例如对等点 wan ip )同时11.11.11.11
连接到两者。因此,当数据包到达时,它可能会尝试通过而不是通过.我尝试添加静态路由规则,但问题是我不需要总是通过路由,因为如果连接来自它也应该通过 发送它。wg0
wg1
wg1
eth0
wlan0
11.11.11.11
wlan0
eth0
eth0
有没有什么方法可以说 - 连接wg1
应该始终通过 进行通信wlan0
?
我在这里看到的其他解决方案是可能的(不确定它是否有效),是为eth0
和设置链路聚合wlan0
,但我读到不可能聚合不同的物理连接?如果我可以有一个wg0
可用的接口,无论哪个接口已启动并正在运行(eth0
或wlan0
),那将是最好的。
这是当前配置:
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
使用固定端口 51821
wg1
将此行添加到以下
[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
//条目。PostUp
PreDown
PostDown
wg1.conf