NAT가 없는 IPv6 전용 WireGuard VPN

NAT가 없는 IPv6 전용 WireGuard VPN

목표

(a) 모든 트래픽을 라우팅하고 (b) 인터넷에서 액세스할 수 있는 서버를 사용하여 IPv6만 사용하여 WireGuard VPN을 설정하려고 합니다. (a)를 작동시킬 수도 없었기 때문에 작동하도록 노력하겠습니다. (b)는 단지 맥락을 위한 것입니다.

에 전역 2a03:4000:xx:xx:18d7:b1ef:fe48:7d35/64적 으로 라우팅 가능한 IPv6을 갖춘 VPS가 있습니다 . 호스트 이름으로 참조하겠습니다 . 테스트 목적으로 서버에는 방화벽이 없으며 및 .ip aeth0vpsnet.ipv6.conf.all.forwarding=1net.ipv6.conf.all.accept_ra=2

그런 다음 IPv6 주소가 있는 내 장치도 켜져 있습니다 2001:1715:yy:yy:db2d:ab24:ed3f:39d4/64( wlan0다른 WLAN에 있을 때 이 주소가 변경되므로 이는 관련 정보가 아니어야 합니다). 호스트 이름을 전달합니다 laptop.

나는 다음과 같이 끝내고 싶습니다.

Internet <-> vps <-> laptop

IPv4에서는 NAT를 사용하지만 IPv6에서는 NAT를 사용하지 않는 것이 좋습니다. 대신 무엇을 해야 할지 찾기가 어렵지만 올바르게 읽었다면 2a03:4000:xx:xx::/64VPS가 노트북에 가져온 블록의 다른 IP 주소를 제공해야 합니다.

설정

그래서 저는 다음 두 가지 wireguard 구성을 작성합니다.

VPS:

[Interface]
Address = fc01::1/128 # Shouldn't really matter?
ListenPort = 1935 # This port is open to UDP on most networks
PrivateKey = uLxxxxxxxxxxxxxxxxxxxxxxxxEQ=

[Peer]
# laptop
PublicKey = swxxxxxxxxxxxxxxxxxxxxxxxxxmQ=
AllowedIPs = 2a03:4000:xx:xx:ffff::3/128 # Is inside the vps' /64 block

랩탑:

[Interface]
Address = 2a03:4000:xx:xx:ffff::3/128 # The globally routable IP addr of my laptop via the vps
ListenPort = 1935
PrivateKey = yMxxxxxxxxxxxxxxxxxxxxxxxxxxxxm8=

[Peer]
PublicKey = pCxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxzs=
AllowedIPs = ::/0 # Route all traffic through this peer
Endpoint = [2a03:4000:xx:xx:18d7:b1ef:fe48:7d35]:1935

나는 그것들을 꺼낸다:

[root@vps ~]# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -6 address add fc01::1/128 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] ip -6 route add 2a03:4000:xx:xx:ffff::3/128 dev wg0

[root@laptop ~]# wg-quick up wg0
[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -6 address add 2a03:4000:xx:xx:ffff::3/128 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] wg set wg0 fwmark 51820
[#] ip -6 route add ::/0 dev wg0 table 51820
[#] ip -6 rule add not fwmark 51820 table 51820
[#] ip -6 rule add table main suppress_prefixlength 0
[#] ip6tables-restore -n

... aaaand 작동하지 않습니다.

WireGuard가 성공적으로 연결되지 않는 것 같습니다. 노트북에는 연결이 표시되고 전송된 트래픽이 계산되지만(수신된 트래픽은 0B) VPS에는 연결이 표시되지 않습니다.

IPv6 전용 WireGuard VPN을 올바르게 설정하려면 어떻게 해야 합니까? 그리고 이것이 맞다면 왜 한쪽 끝에서 전송된 트래픽이 터널의 다른 쪽 끝에 도착하지 않습니까?

더 많은 정보(pcaps, ip출력 등)가 유용할 경우 기꺼이 질문을 수정하겠습니다.

답변1

서버의 게이트웨이가 가정하기 때문에 작동하지 않습니다.전체 /64가 "온링크"입니다.즉, 모든 주소는 동일한 이더넷 세그먼트에서 직접 연결할 수 있습니다. 따라서 게이트웨이는 랩톱의 MAC 주소에 대해 Neighbor Discovery 쿼리를 생성하지만 랩톱이 동일한 링크에 전혀 없기 때문에 응답을 받지 못합니다.

(일반적으로 서버는 다른 곳으로 라우팅되는 주소를 대신하여 응답하지 않습니다. 자체 eth0 인터페이스에 직접 할당된 주소에 대해서만 응답합니다.)

온링크 주소로 이 작업을 수행하려면 "프록시 NDP"를 사용해야 합니다. 즉, 실제로 서버를 만들어야 합니다.노트북을 대신하여 NDP 응답 제공(그리고 터널을 통해 라우팅하려는 다른 주소).

IPv6에 대해 이를 수행하는 가장 안정적인 방법은 ndprespondereth0에서 데몬을 실행하는 것입니다. Neighbor Solicitation 패킷을 수신하고 올바른 Neighbor 광고를 보냅니다.

ndppd(마찬가지로 커널의 내장 기능을 사용할 수도 있지만 proxy_ndp이는 동작합니다.약간실제 NDP 응답과 다르며 때로는 일부 VPS 호스팅 운영자가 수행하는 스푸핑 방지 검사를 통과하지 못할 수도 있습니다.)

하지만 이상적으로는 호스팅 회사가당신에게 제공해야라우팅됨접두사– 데이터 센터 게이트웨이가 서버의 기본 주소를 '경유'하여 모든 것을 라우팅하도록 명시적으로 구성된 경우입니다. 단일 정적 경로가 많은 동적 인접 캐시 항목보다 더 효율적이기 때문에 이는 그들에게도 약간 유리할 것입니다.

(안타깝게도 많은 서버 호스팅 회사는 내부적으로 라우팅된 접두사 제공을 방지하는 특정 VPS 관리 플랫폼을 사용합니다. 이는 "플랫 온링크 /48" 모델을 고집하는 SolusVM의 잘못이라고 들었습니다.)


참고: 이것은 어떤 방식으로든 IPv6에만 국한되지 않습니다. '온링크'와 '라우팅' 간의 동일한 구분이 IPv4에도 존재하며 유일한 차이점은 IPv4가 NDP 대신 ARP를 사용한다는 것입니다. (예를 들어 서버가 eth0의 192.168.1.0/24에 있고 192.168.1.7을 VPN 클라이언트로 라우팅하려는 경우 정확히 동일한 문제가 발생하며 이를 해결하려면 프록시-ARP가 필요합니다. )

관련 정보