나는 다음과 같은 구성을 가지고 있습니다 :
두 인터페이스 모두 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
및 와이어가드 구성:
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
인터페이스 에 대해서만 발생합니다. 다른 WireGuard 인터페이스는 영향을 받지 않습니다.wlan0
eth0
# 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