Linux 브리지의 호스트에서 Wireguard 터널로의 Linux 정책 기반 라우팅

Linux 브리지의 호스트에서 Wireguard 터널로의 Linux 정책 기반 라우팅

172.16.20.4/32vmbr-dmzLinux 라우팅을 사용하여 Linux 브리지(이름)의 특정 IP()에서 Wireguard 터널(이름 ) 로 트래픽을 라우팅하려고 합니다 wg0. 하지만 작동하지 않습니다.

두 가지 질문이 있습니다. 먼저 AllowedIPs=0.0.0.0/0wireguard와 함께 작동하도록 하고 작동하도록 제한하려면 어떻게 해야 합니까 AllowedIPs=172.16.20.4/32?

내가 한 일 - 내 호스트 컴퓨터(기본적으로 debian 11이 설치됨)에서 linux-bridging을 사용했습니다.

9: vmbr-dmz: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    inet 172.16.20.1/28 brd 172.16.20.15 scope global vmbr-dmz
11: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 10.2.0.2/32 scope global wg0
       valid_lft forever preferred_lft forever

/etc/iproute2/rt_tables.d/dmzwg0.conf에 새 정책 라우팅 테이블을 만들었습니다.

100 dmzwg0

dmzwg0 테이블을 사용하도록 이 IP 주소에 대한 규칙을 만듭니다. 규칙이 목록에 표시됩니다.

ip rule add from 172.16.20.4 lookup dmzwg0

VPN의 기본 설정으로 시작해서 VPN을 사용하기 시작했습니다.systemctl start wg-quick@wg0

[Interface]
PrivateKey = k...=
Address = 10.2.0.2/32
DNS = 10.2.0.1

[Peer]
PublicKey = 8...=
AllowedIPs = 0.0.0.0/0
#AllowedIPs = 172.16.20.4/32
Endpoint = NNN.NNN.NNN.NNN:51820

wg의 다음 hopw 주소를 찾는 방법을 잘 모르겠지만 10.2.0.1인 것 같습니다. Wireguard 인터페이스의 다음 홉을 결정하는 방법은 무엇입니까? AllowedIPs=0.0.0.0/0이므로 ping을 실행하여 다음 홉으로 추가할 수 있습니다.

ip route add default via 10.2.0.1 dev wg0 table dmzwg0

테이블을 보니 dmzwg0내가 예상했던 경로가 보였다.

ip route show table dmzwg0
default via 10.2.0.1 dev wg0

매스커레이딩을 위해 다음 nf 테이블 규칙을 추가했습니다.

nft add table nat
nft add chain nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule nat postrouting oifname "wg0" ip saddr 172.16.20.4/32 counter packets 0 bytes 0 masquerade

인터넷에 연결을 시도하는 가상 머신에서 시작했습니다. 내가 실행 중인 호스트에서 tcpump -i vmbr-dmz브리지에서 들어오는 트래픽이 예상되는 I 주소 IP를 가지고 있음을 알 수 있습니다.

tcpdump -i vmbr-dmz
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on vmbr-dmz, link-type EN10MB (Ethernet), snapshot length 262144 bytes
14:40:09.803588 IP 172.16.20.4.56226 > dns.google.domain: 59264+ SRV? _http._tcp.security.debian.org. (48)
14:40:09.803620 IP 172.16.20.4.55497 > dns.google.domain: 60873+ SRV? _http._tcp.deb.debian.org. (43)
14:40:14.808719 IP 172.16.20.4.41741 > 8.8.8.4.domain: 60873+ SRV? _http._tcp.deb.debian.org. (43)
14:40:14.808721 IP 172.16.20.4.54173 > 8.8.8.4.domain: 59264+ SRV? _http._tcp.security.debian.org. (48)

wg0물리적 네트워크 카드에서 tcpdump를 시도했지만 eno1트래픽을 볼 수 없었습니다.

내 nft nat 규칙이 패킷을 계산하지 않습니까?

Q1) - 그렇다면 제가 놓치고 있는 부분은 무엇인가요? 내 트래픽이 어디로 가는지 확인하려면 어떤 조치를 취해야 합니까?

또한, wireguard 구성을 allpw 원하는 IP 주소로 변경하면 됩니다 172.16.20.4. 호스트가 다음 홉에 도달/핑할 수 없기 때문에 다음 홉을 추가할 수 없습니다 wg0.

ip route add default via 10.2.0.1 dev wg0 table dmzwg0
Error: Nexthop has invalid gateway.

dmzwg0Q2) - wg0을 통해서만 모든 트래픽을 보내도록 테이블 에 기본 경로를 추가하는 방법은 무엇입니까 172.16.20.4/32?

답변1

WireGuard 인터페이스는 피어의 구성을 효과적으로 사용하여 다음 라우팅 홉을 결정하므로 WireGuard 인터페이스에 대해 명시적인 "다음 홉"을 지정하려고 시도해서는 안 됩니다.

WireGuard 인터페이스의 피어별 설정을 사용하여 AllowedIPs인터페이스 자체 내부 라우팅 테이블과 마찬가지로 해당 피어로 어떤 패킷을 보내야 하는지 인터페이스에 알릴 수 있습니다. WireGuard 인터페이스에서 직접 보내는 패킷은 AllowedIPs패킷의 대상 주소와 일치하는 설정을 사용하여 피어로 전송됩니다(일치하는 항목이 여러 개인 경우 가장 좁은 일치 항목이 선택되며 WireGuard에서는 여러 피어가 동일한 정확한 범위를 사용하는 것을 허용하지 않습니다). ). 일치하는 항목 이 없으면 AllowedIPs패킷이 삭제됩니다.

빠른 작업 그룹AllowedIPs경로는 인터페이스에 대해 구성한 모든 경로 와 일치하도록 자동으로 설정됩니다 . 인터페이스 Table설정을 사용하여 wg-quick에 기본 라우팅 테이블이 아닌 다른 라우팅 테이블에 이러한 경로를 설정하도록 지시할 수 있습니다.

[Interface]
PrivateKey = ...
Address = 10.2.0.2/32
Table = dmzwg0

[Peer]
PublicKey = ...
AllowedIPs = 0.0.0.0/0
Endpoint = NNN.NNN.NNN.NNN:51820

dmzwg0위의 구성은 테이블을 다음과 같이 설정합니다.

$ ip route show table dmzwg0
default dev wg0 scope link

이 WireGuard 인터페이스를 통해 전달하려는 패킷을 보내려면 172.16.20.4질문에서 언급한 정책 라우팅 규칙을 추가하기만 하면 됩니다.

ip rule add from 172.16.20.4 lookup dmzwg0 priority 123

패킷을 전달하는 경우 참고하세요.~에서 172.16.20.4WireGuard 인터페이스를 통해 피어에게 정보를 보내려면원하지 않는다AllowedIPs이 피어를 로 설정 하고 싶습니다 172.16.20.4. 항상 AllowedIPs설정목적지당신은 보내고 싶어도착하다피어(또는 이를 통해 전달됨) - 인터넷의 어느 곳으로든 트래픽이 포함되는 경우 이어야 합니다 0.0.0.0/0.

관련 정보