openvpn 터널을 통해 공개 ipv6 트래픽 라우팅

openvpn 터널을 통해 공개 ipv6 트래픽 라우팅

내가 원하는 것은 VPN 터널을 통해 IPv6 트래픽을 라우팅하는 것입니다. 이렇게 하면 IPv6를 지원하지 않는 네트워크에서 IPv6을 사용할 수 있습니다.

IPv6 블록이 할당된 VPS가 있습니다. openvpn 클라이언트에 이 블록의 일부를 사용하고 싶습니다. 2001:db8::111:800:0/112openvpn은 /64 및 /112만 서브넷으로 지원하므로 제가 염두에 둔 범위는 (접두사는 익명입니다)입니다 .

터널을 통한 IPv6은 이미 작동하고 있습니다. 클라이언트에서 서버( 2001:db8::111:800:1)는 물론 서버의 인터페이스( 2001:db8::111:100:1002001: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

관련 정보