저는 Wireguard를 사용하여 두 Linux 시스템 사이에 "간단한" VPN을 설정하려고 합니다. 불행하게도 기존 자습서에서는 일반적으로 A) IPv4만 설정하고 B) 일반적으로 IP 매스커레이딩을 사용하기 때문에 도움이 되는 기존 자습서를 찾지 못했습니다.
기계 A의 구성:
[Interface]
Address = 192.168.10.2/24
ListenPort = 51820
[Peer]
AllowedIPs = 192.168.10.0/24, 172.16.0.0/24, fdbb:bbbb:bbbb::/48, 2001:db8:bbbb:0000::/64
Endpoint = [2001:db8:bbbb:0000:1234:56ff:fe78:90ab]:51820
PersistentKeepalive = 20
기계 B의 구성:
[Interface]
Address = 192.168.10.1/24
ListenPort = 51820
[Peer]
AllowedIPs = 192.168.10.2/32, 10.0.0.0/16, fdaa:aaaa:aaaa::/48, 2001:db8:aaaa:0000::/64
Endpoint = [2001:db8:aaaa:0000:ba09:87ff:fe65:4321]:51820
PersistentKeepalive = 20
(터널 자체가 트래픽을 전달하므로 키를 생략하면 이것이 정확하다는 것을 알 수 있습니다). 따라서 이론적으로는 구성이 간단합니다. 머신 A에는 로컬 방화벽이 없습니다(방화벽이 내장되어 UDP/51820을 켜는 일반적인 소비자 라우터). 머신 B에는 ip(6) 테이블이 있지만 모든 Docker 규칙에만 해당되며 기본 정책은 허용하도록 설정되어 있습니다. .
두 기계 모두 net.ipv4.ip_forward=1
및 가 있습니다 net.ipv6.conf.all.forwarding=2
.
Wireguard가 분명히 라우팅을 시도하기 때문에 이 구성은 작동하지 않습니다.자체 와이어가드 트래픽터널 자체를 통해 엔드포인트 IPv6이 AllowedIPs 네트워크에 포함되어 있기 때문입니다. 기본적으로 제외되지 않는 이유는 무엇입니까?
저는 wg0 대신 일반 인터페이스를 통해 이 끝점에 대한 트래픽을 보내는 고정 경로를 추가하여 이 문제를 해결하려고 했습니다.
PostUp = /usr/sbin/ip -6 route add 2001:db8:aaaa:0000:ba09:87ff:fe65:4321/128 via fe80::1 dev enp1s0
PreDown = /usr/sbin/ip -6 route del 2001:db8:aaaa:0000:ba09:87ff:fe65:4321/128 via fe80::1 dev enp1s0
이 설정(양쪽 모두)을 사용하면 피어는 A) WG 피어 주소(192.168.10.X)를 통해 서로 핑하고, B) 로컬 IPv4(10.0.XX 또는 172.16.XX)를 통해 C) 각각 핑할 수 있습니다. 다른 하나는 로컬 IPv4(10.0.XX 또는 172.16.XX)를 통해 이루어집니다. ULA 주소.
그러나 터널에는 여전히 두 가지 문제가 있습니다.
A) 엔드포인트에 IPv6 경로를 추가해야 하기 때문에 이는 다른 피어의 공개 IPv6 주소로 향하는 트래픽이 WG 터널을 통과하지 않고 인터넷을 통해 직접 이동한다는 것을 의미합니다. 피어는 공개 GUA IPv6 주소를 사용하여 서로 ping할 수 없습니다. PostUp 매개변수를 사용하여 추가된 IP 경로와 같은 것이 필요하지만 이는 터널을 통과하는 트래픽이 아닌 터널 자체에 대해서만 작동합니다. IPv6 라우팅과 마찬가지로 "이 경로를 통해 UDP/51820을 (인터넷으로 직접) 라우팅하지만 다른 트래픽은 이 경로(wg0)를 통해 동일한 IP로 보냅니다"라고 말할 수 있습니다.
B) IPv4를 통해 네트워크의 다른 컴퓨터에서 모든 기능을 얻을 수 없습니다. 네트워크 A의 다른 시스템에서 다른 네트워크의 IPv4에 고정 경로를 추가했습니다 172.16.0.0/24 via 10.0.1.25 dev enp7s0 metric 100
.
지금 경로를 추적할 때 첫 번째 홉은 wireguard 시스템(10.0.1.25)이고 두 번째 홉은 원격 시스템의 WG 피어 주소(192.168.10.1)입니다(따라서 터널을 통과합니다!). 그것. 실제 대상에 대한 세 번째 홉은 없습니다(다른 쪽의 기본 게이트웨이에는 해당 쪽의 Wireguard 시스템으로 라우팅되는 고정 경로 10.0.0.0/8이 있음에도 불구하고). IP 위장을 수행하고 싶지 않습니다. 내가 찾은 것보다 더 많은 것) 해결책" 다른 네트워크의 다른 컴퓨터가 요청이 어디에서 오는지 정확히 확인하기를 원합니다. 즉 터널 반대편에 있는 컴퓨터입니다.
IPv6에서는 ULA를 사용하면 모든 것이 정상입니다. 게이트웨이에 IPv6 라우팅을 추가하고 상대방의 ULA를 Wireguard 시스템으로 라우팅한 다음 완료합니다. GUA에 대한 솔루션을 찾으면 됩니다. 아마도 wireguard 시스템에서 radvd를 사용하여 해당 네트워크에 대한 경로를 알리는 것 같습니다.
핵심요약: 두 피어 간의 Wireguard 연결은 잘 작동하지만 A) Wireguard가 아닌 트래픽을 Wireguard 끝점 IP로 터널링하는 방법, B) IPv6 ULA 라우팅은 작동하지만 IPv4 라우팅은 작동하지 않는 이유 설정이 동일합니다.
답변1
IP 규칙을 사용하고 wireguard 구성에서 다음 명령을 사용하여 작동하도록 관리했습니다.
PostUp = ip -6 rule add to 2001:db8:aaaa::ba09:87ff:fe65:4321/128 ipproto udp dport 51820 table 200
PostUp = ip -6 route add default via fe80::1 dev eth0 table 200
PreDown = ip -6 rule del lookup 200
PreDown = ip -6 route del default via fe80::1 dev eth0 table 200
이렇게 하면 모든 트래픽을 로컬 라우터로 보내는 하나의(기본) 경로만 포함하는 완전히 별도의 경로 테이블이 추가되고 200
, 해당 새 경로 테이블을 기반으로 포트 51820에서 엔드포인트 IPv6에 대한 모든 UDP 트래픽을 처리하는 IP 규칙이 추가됩니다.
이렇게 하면 WG 터널 자체에 대한 UDP 트래픽이 라우터로 전송되지만 대상 IP가 동일한 다른 패킷은 WG 터널을 통과하게 됩니다.
그런 다음 터널 양쪽에 radvd를 추가하여 네트워크의 장치가 Wireguard 시스템으로 트래픽을 보낼 수 있도록 다른 쪽의 GUA 접두사에 대한 경로를 발표했습니다.