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にはすべてのチェーンを許可するポリシーがあります。

私の質問は、Linuxがインターフェイスに割り当てられていない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 を使用している場合、ルータにルートを追加できない場合があります。 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要求が表示されるはずです。

また、サーバーで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

おすすめ記事