私がやろうとしているのは、VPNトンネルを介してIPv6トラフィックをルーティングすることです。そうすれば、IPv6をサポートしないネットワークでIPv6を使用できるはずです。
IPv6ブロックが割り当てられているVPSがあります。このブロックの一部をopenvpnクライアントに使用したい。 openvpnはサブネットとして/ 64と/ 112しかサポートしていないため、私が考えていた範囲は2001:db8::111:800:0/112
(接頭辞は匿名化されています)でした。
トンネル経由のIPv6は既に機能しており、クライアントからサーバー(2001:db8::111:800:1
)にpingを送信できます。また、サーバー上のインターフェース(2001:db8::111:100:100
および2001:db8:216:3dfa:f1d4:81c0
)にも接続できます。
ただし、クライアントからgoogle.comにpingを実行しようとすると、応答がありません(pingタイムアウト)。この問題をデバッグするために、tcpdumpを使用してサーバー上のトラフィックをキャプチャしました。pingパケットが送信されるのを確認できますが、返信が返されません。 ip6tablesにログルールを追加すると、同じようにパケットが送信されますが、何も受信されません。
サーバーからタイムアウトを取得するオンラインtracerouteツールを使用しました。また、インターフェイスに直接IPを設定しようとしましたが、IP(2001:db8::111:800:1001
)に到達可能になりましたが、これはルーティングの問題だと思います。
/proc/sys/net/ipv6/conf/all/forwarding
を介してipv6の転送を有効にしました。 ip6tablesには、すべてのチェーンを許可するポリシーがあります。
私の質問は、インターフェイスに割り当てられていないIPのパケットをLinuxが受け入れてさらにルーティングするために正確に何が必要ですか?存在するルートだけでは十分ではないようです。
これが私のクライアントとサーバーの設定です。さらに情報が必要な場合はお知らせください。
クライアント
# 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
このVPNサブネットにサーバーを使用するようにルーターに指示する必要があります。問題の正しい解決策は、OpenVPNサブネットのルーターにルートを追加することです。
ルーターに触れることができないためにこれを行うことができない場合、別の解決策は、eth0
リンク上のクライアントにNDPプロキシをセットアップすることです。
VPSを使用しているため、おそらくルーターにルートを追加できません。おそらく2番目のソリューションを使用する必要があります。
問題の正しい解決策は、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要求が表示されます。
サーバーとNDPプロキシでIPv6転送を有効にする必要があります。
sysctl -w net.ipv6.conf.all.proxy_ndp = 1
Linuxカーネルでは、サブネットにNDPプロキシを追加することはできませんが、個々のIPにのみ追加できます。デーモン( ndppd など)を使用して、サブネット全体の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サーバー設定にフックを追加します。
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
これを見てください thread 。
for i in $(seq 0 65535) ; do
ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0
done