내가 원하는 것은 VPN 터널을 통해 IPv6 트래픽을 라우팅하는 것입니다. 이렇게 하면 IPv6를 지원하지 않는 네트워크에서 IPv6을 사용할 수 있습니다.
IPv6 블록이 할당된 VPS가 있습니다. openvpn 클라이언트에 이 블록의 일부를 사용하고 싶습니다. 2001:db8::111:800:0/112
openvpn은 /64 및 /112만 서브넷으로 지원하므로 제가 염두에 둔 범위는 (접두사는 익명입니다)입니다 .
터널을 통한 IPv6은 이미 작동하고 있습니다. 클라이언트에서 서버( 2001:db8::111:800:1
)는 물론 서버의 인터페이스( 2001:db8::111:100:100
및 2001:db8:216:3dfa:f1d4:81c0
)에도 ping을 보낼 수 있습니다.
그러나 클라이언트에서 google.com을 ping하려고 하면 응답이 없습니다(ping 시간 초과). 이 문제를 디버깅하기 위해 tcpdump를 사용하여 서버의 트래픽을 캡처했는데 ping 패킷이 나가는 것을 볼 수 있었지만 응답이 돌아오지 않았습니다. ip6tables에 로그 규칙을 추가하면 동일한 상황이 표시됩니다. 패킷은 나가지만 아무것도 들어오지 않습니다.
온라인 추적 경로 도구를 사용하는데 내 서버에서 시간 초과가 발생합니다. 또한 인터페이스에서 직접 IP를 설정하려고 시도했는데 결과적으로 IP( 2001:db8::111:800:1001
)에 도달할 수 있게 되었기 때문에 라우팅 문제인 것 같습니다.
를 통해 ipv6 전달을 활성화했습니다 /proc/sys/net/ipv6/conf/all/forwarding
. ip6tables에는 모든 체인을 허용하는 정책이 있습니다.
내 질문은 리눅스가 인터페이스에 할당되지 않은 IP의 패킷을 수락하고 더 멀리 라우팅하려면 정확히 무엇이 필요합니까?기존 경로를 갖는 것만으로는 충분하지 않은 것 같습니다.
내 클라이언트 및 서버 설정은 다음과 같습니다. 더 많은 정보가 필요하면 알려주시기 바랍니다.
고객
# ip -6 addresses
10: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qlen 100
inet6 2001:db8::111:800:1001/112 scope global
valid_lft forever preferred_lft forever
# ip -6 routes
2001:db8::111:800:0/112 dev tun0 proto kernel metric 256
2000::/3 dev tun0 metric 1024
섬기는 사람
# ip -6 address
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
inet6 2001:db8:216:3dfa:f1d4:81c0/64 scope global dynamic
valid_lft 86254sec preferred_lft 14254sec
inet6 2001:db8::111:100:100/128 scope global
valid_lft forever preferred_lft forever
12: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qlen 100
inet6 2001:db8::111:800:1/112 scope global
valid_lft forever preferred_lft forever
# ip -6 route
2001:db8::111:100:100 dev eth0 proto kernel metric 256
2001:db8::111:800:0/112 dev tun0 proto kernel metric 256
2001:db8::/64 dev eth0 proto kernel metric 256 expires 86194sec
default via fe80::230:48ff:fe94:d6c5 dev eth0 proto ra metric 1024 expires 1594sec
답변1
이 VPN 서브넷에 대해 서버를 사용하도록 라우터에 지시해야 합니다. 문제에 대한 올바른 해결책은 라우터에 OpenVPN 서브넷에 대한 경로를 추가하는 것입니다.
라우터에 액세스할 수 없어 이 작업을 수행할 수 없는 경우 다른 해결 방법은 eth0
링크의 클라이언트에 대해 NDP 프록시를 설정하는 것입니다.
VPS를 사용하는 경우 라우터에 경로를 추가하지 못할 수도 있습니다. 두 번째 솔루션을 사용해야 할 수도 있습니다.
서브넷 경로 추가
문제를 해결하는 올바른 방법은 VPN 서브넷이 OpenVPN 서버(Linux용)를 통해 라우팅되어야 한다고 라우터에 알리는 것입니다.
ip route add 001:db8::111:800::/112 via 2001:db8::111:100:100
서버에서 IPv6 전달을 활성화해야 합니다.
sysctl sys.net.ipv6.conf.all.forwarding=1
새로운 민주당 요원
라우터는 eth0
링크에서 전체 IPv6 범위를 전송하도록 구성된 것으로 보입니다. NDP 프록시를 설정할 수 있습니다.
eth0
클라이언트에서 나머지 인터넷에 액세스하려고 하면 OpenVPN 서브넷의 서버 인터페이스에 NDP 요청이 표시되어야 합니다.
또한 서버에서 IPv6 전달 및 NDP 프록시를 활성화해야 합니다.
sysctl -w net.ipv6.conf.all.proxy_ndp=1
서브넷 NDP 프록시
Linux 커널은 개별 IP에 대해서만 서브넷에 대한 NDP 프록시 추가를 허용하지 않습니다. 다음과 같은 데몬을 사용할 수 있습니다. NDPPD전체 서브넷에 대해 NDP 프록시를 설정합니다(사용되지 않음).
IP당 NDP 프록시
또 다른 해결 방법은 VPN 서브넷의 각 IPv6에 대해 NDP 프록시를 추가하는 것입니다.
for i in $(seq 0 65535) ; do
ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0
done
OpenVPN 서브넷의 IP 수가 상대적으로 적기 때문에 이 방법은 작동합니다.
OpenVPN 후크가 있는 동적 NDP 프록시
OpenVPN 후크를 사용하여 NDP 프록시를 동적으로 추가할 수 있어야 합니다.
OpenVPN 서버 구성에 후크를 추가합니다.
learn-address /etc/openvpn/learn-address
다음 learn-address
스크립트를 사용하십시오.
#!/bin/sh
action="$1"
addr="$2"
case "$action" in
add | update)
ip neigh replace proxy "$addr" dev tun0
;;
delete)
ip neigh del proxy "$addr" dev tun0
;;
esac
이것 좀 봐철사.
짧은 답변
for i in $(seq 0 65535) ; do
ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0
done