OpenVPN 터널을 통한 공개 IPV6 트래픽 라우팅


13

내가하려는 것은 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을 핑하려고 할 때 응답이 없습니다 (핑 시간 초과). 이 문제를 디버깅하기 위해 tcpdump를 사용하여 서버의 트래픽을 캡처했으며 핑 패킷이 나가는 것을 볼 수 있지만 응답이 다시 나타나지 않습니다. 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

당신은 테이블 POSTROUTING ... MASQUERADE에서 찾고 nat있습니다. 그러나 나는 내가 완전히 이해하고 있는지 확신하지 못한다. IPv6 트래픽을 터널링하려고합니까? 그렇다면 각 시설을 설치 했습니까? 인가 -p ipv6는 IPv4 (!) 규칙에 허용 된 패킷은?
0xC0000022L

라우터의 IP 구성 (eth0)이 있습니까? 라우터를 제어합니까? (경로를 추가 할 수 있습니까?)
ysdx

iptables 원시 테이블 TRACE대상 (여기서는 좋지 않을 수도 있음) ip neighbour, 및을 사용해보십시오 ip route get. 또한 핑 사람을 지정하십시오 google.ca.
pilona 2016 년

google.com 또는 goole.com을 핑?
totti

@totti google.com은 오타였습니다
Ikke

답변:


12

라우터에게이 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

NDP 프록시

라우터가 eth0링크 에서 전체 IPv6 범위를 보내도록 구성된 것 같습니다 . NDP 프록시를 설정할 수 있습니다.

eth0클라이언트에서 나머지 인터넷에 액세스하려고 할 때 OpenVPN 서브넷의 서버 인터페이스에 NDP 요청이 표시되어야합니다 .

서버와 NDP 프록시에서 IPv6 전달을 활성화해야합니다.

sysctl -w net.ipv6.conf.all.proxy_ndp = 1

서브넷 NDP 프록시

Linux 커널은 서브넷에 NDP 프록시를 추가 할 수없고 개별 IP에 대해서만 추가 할 수 있습니다. 데몬 (예 : 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 서버 conf에 후크를 추가하십시오.

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

1
고마워, 내가 조사 할게 이제 문제를 이해했습니다. ipsidixit.net/2010/03/24/239 에 이에 대한 자세한 내용이 포함되어 있습니다.
Ikke

클라이언트의 IP를 이웃 프록시로 가지고 있습니다. sys.net.ipv6.conf.all.proxy_ndp를 활성화했지만 여전히 google.com을 ping 할 수 없습니다. 서버를 확인하면 eth0에서 ndp 요청 패킷이 수신되지만 광고가 나오지 않습니다.
Ikke

1
npd6을 설치하고 설정하면 갑자기 작동합니다!
Ikke
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.