wlan0 및 eth0을 통해 동일한 WAN IP에 대한 두 개의 서로 다른 와이어 가드 터널 wg0 및 wg1

wlan0 및 eth0을 통해 동일한 WAN IP에 대한 두 개의 서로 다른 와이어 가드 터널 wg0 및 wg1

나는 다음과 같은 구성을 가지고 있습니다 :

두 인터페이스 모두 eth0ISP1을 통해 연결되고 wlan0ISP2를 통해 인터넷에 연결됩니다. 두 연결 모두 서로 다른 IP 주소를 가지며 인터넷 연결을 허용합니다.

나는 두 개의 wireguard 인터페이스 를 설정 wg0했고 wg1.wg0eth0wg1wlan0

내가 겪고 있는 문제는 동일한 원격 서버 피어(예: 피어 wan ip)를 사용하여 11.11.11.11두 서버에 동시에 연결하고 있다는 것입니다. 따라서 패킷이 도착하면 통과하는 대신 통과하려고 할 수 있습니다. 고정 라우팅 규칙을 추가하려고 시도했지만 문제는 연결이 해당 경로를 통해 전송되어야 하기 때문에 항상 경로를 통과할 필요가 없다는 것입니다. .wg0wg1wg1eth0wlan011.11.11.11wlan0eth0eth0

말할 수 있는 방법이 있습니까? 연결은 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 인터페이스는 영향을 받지 않습니다.wlan0eth0

# 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입니다 .PreUpPostUpPreDownPostDownwg1.conf

관련 정보