
私の質問はこれ質問ですが、ほとんど違いはありません。
メイン インターフェイスに IPv4 が 1 つある Ubuntu VPS があります。このマシンに、異なるエンドポイント アドレスを持つ 2 つの異なるプロバイダーからの 2 つの個別の IPv6 トンネルを用意したいと考えています。そのうちの 1 つだけを試したところ、すべて正常でした。しかし、2 つ目のトンネルを追加すると、最初のトンネルは引き続き機能しますが、2 つ目のトンネルは外部から ping できません。ただし、自分自身とゲートウェイには ping できます。
私は次の行を追加します/etc/network/interfaces
:
auto he-ipv6
iface he-ipv6 inet6 v4tunnel
address 2001:xxx:xxx:xxxx::2
netmask 64
endpoint xx.xx.xx.xx
local yy.yy.yyy.yy
ttl 255
gateway 2001:xxx:xxx:xxxx::1
auto sbtb-ipv6
iface sbtb-ipv6 inet6 v4tunnel
address 2a09:xxx:xxx:xxxx::2
netmask 64
endpoint zz.zz.zz.zz
local yy.yy.yyy.yy
ttl 255
gateway 2a09:xxx:xxx:xxxx::1
問題がどこにあるのか、またはこれをさらに解決するにはどうすればよいのか知っている人はいますか?
答え1
いくつかのコメント
以外のネットワーク構成ツールの場合ifupdown
、v4tunnel
実際にはレイヤー3座るip tunnel add FOO mode sit ...
または と同等の を使用するツールに応じて作成できるトンネルip link add name FOO type sit ...
。
レイヤー3インターフェースにはレイヤー2アドレス(イーサネットMACアドレス)がないため、下位レイヤー2のアドレスを解決する必要はありません。ARP(IPv4)とNDP(IPv6)はレイヤー3インターフェースでは発生しません。同じ理由で、解決するゲートウェイがありません。ゲートウェイはゲートウェイプロパティには必要ありませんが、構文によって、インターフェースを指定せずにルーティングテーブルエントリを作成するときに使用するインターフェースを推測することができ、通常はそれが行われます。トンネルブローカー独自の設定例結局、/64 ネットマスクとゲートウェイの使用は、OP の設定ではどこにも必要ありません。しかし、この回答はこれらの設定に固執するので、読者はこれをレイヤー 2 インターフェイス トンネルに適応させやすくなり、これらの設定はすべて必須になります。同様に、通常は非デフォルト インターフェイス (ここsbtb-ipv6
) に関する設定のみが必要ですが、とにかく 2 つのインターフェイスの設定を提供します。残る唯一の違いは、メイン ルーティング テーブルでどのインターフェイスがデフォルト ルートを取得するかです。
マルチホーミングとポリシールーティング
これは今や、複数のアドレスを使用するマルチホーミングシステムそれぞれが独自の経路でインターネット(IPv6)に到達します。上流のルーターは、厳密なリバースパス転送(SRPF) スプーフィング防止: 各送信元アドレスは、専用のパスを通過する必要があります。 シンプル ルーティングでは、デフォルト ルートは 1 つだけ使用されます (最初に表示されるルート)。 より長いメトリックを持つ 2 番目のデフォルト ルートを追加することもできますが、より短いメトリックを持つルートがなくなるまで、そのルートは選択されません。
これを克服するには、ポリシールーティングこれにより、システムは他のルーティングテーブル(異なるルートが設定されている)とルーティングルールを選択できるようになります。ルーティングテーブルは、宛先を使用してルートを検索するだけでなく、追加のセレクタを使用してこれらのルーティングテーブルを選択します。ここで役立つのは、送信元アドレスです(いくつかのケースでは、このインターフェイスが強制されている場合は、送信インターフェイスも役立ちます)。SO_BINDTODEVICE
)。
したがって、目標は、メイン ルーティング テーブルのエントリに基づいて、ルートの部分的なビューを持つ複数の代替ルーティング テーブルを作成することです。各ルーティング テーブルは、インターネットへのパスが 1 つだけ存在すると見なし、独自のデフォルト ルートを持ちます。次に、送信元アドレスに基づくルーティング ルールによって、送信パケットに適したルーティング テーブルが選択されます。OP の場合、ローカル ルーティング テーブルがすでにこのケースを処理しているため、受信パケットに対して特別な操作は必要ありません。
実装
まず、interfaces
設定を調整して別のものを追加する必要がありますメトリックそれぞれにsbtb-ipv6
同じメトリックを持つ 2 つのデフォルト ルートが存在することはできないため、セットアップが失敗する可能性があります。
次に、手動でこれを動作させる方法を説明します。HE の場合は (任意の) 値 2000、SBTB の場合は 2001 を持つ 2 つのルーティング テーブルを追加し、関連するルートのみを各テーブルにコピーします。競合の可能性はないため、メトリックはここでは重要ではありません。
ip -6 route add 2001:xxx:xxx:xxxx::/64 dev he-ipv6 table 2000
ip -6 route add default via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000
ip -6 route add 2a09:xxx:xxx:xxxx::/64 dev sbtb-ipv6 table 2001
ip -6 route add default via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001
そして、ルーティング ルールを使用して、送信元アドレスに基づいて適切なルートを選択します (明示的に、固定の優先順位を指定し、ローカルで開始されたパケットであることを次のように指定しますiif lo
)。
ip -6 rule add pref 20000 from 2001:xxx:xxx:xxxx::2 iif lo lookup 2000
ip -6 rule add pref 20010 from 2a09:xxx:xxx:xxxx::2 iif lo lookup 2001
ping -I sbtb-ipv6 ...
単にインターフェースのアドレス ( ) にバインドするのではなく、インターフェース(例ping -I 2a09:xxx:xxx:xxxx::2
) にバインドする場合も、適切な結果を得るためにこれを使用します (メイン ルーティング テーブルに 2 番目のデフォルト ルートが存在しないレイヤー 2 の場合には非常に便利ですが、レイヤー 3 インターフェースを使用する OP の場合には実際には必要ありません)。
ip -6 rule add pref 20001 oif he-ipv6 lookup 2000
ip -6 rule add pref 20011 oif sbtb-ipv6 lookup 2001
反対方向 (着信トラフィック、つまりイングレス) は、local
アドレスが追加されたときにルーティング テーブルですでに適切に処理されているため、イングレスに対して特別な操作を行う必要はありません。
最終構成
上記は、最初にバックアップ リモート コンソール アクセスを使用して手動で試す必要があります (IPv4 は影響を受けませんが、IPv4 アクセスで十分です)。次に、機能をサポートしていない場所 (つまり、すべてのポリシー ルーティング) で/コマンドinterfaces
を使用して、構成ファイルに統合できます。以前の手動テストを必ず削除してください。そうしないと、インターフェイス設定内のいくつかのコマンドが などのエラーと衝突し、インターフェイス構成が失敗します。up
down
ifupdown
RTNETLINK answers: File exists
更新: これには、SBTB トンネルのリモート エンドに 3 回の ping を送信することも含まれます。コメントによると、このトンネルはサーバーへのトラフィックを受け入れる前に、サーバーからのトラフィックを確認する必要があるようです。SBTB (トンネル) ピア アドレスがサーバーへのトラフィックの受け入れをトリガーするのに十分でない場合は、それを「よく知られている」IPv6 アドレスに置き換えます。同じことを HE インターフェイスに追加することもできますが、これは必要ないようです。
auto he-ipv6
iface he-ipv6 inet6 v4tunnel
address 2001:xxx:xxx:xxxx::2
netmask 64
endpoint xx.xx.xx.xx
local yy.yy.yyy.yy
ttl 255
gateway 2001:xxx:xxx:xxxx::1
metric 1000
up ip -6 route add 2001:xxx:xxx:xxxx::/64 dev he-ipv6 table 2000
up ip -6 route add default via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000
up ip -6 rule add pref 20000 from 2001:xxx:xxx:xxxx::2 iif lo lookup 2000
up ip -6 rule add pref 20001 oif he-ipv6 lookup 2000
down ip -6 rule del pref 20001
down ip -6 rule del pref 20000
auto sbtb-ipv6
iface sbtb-ipv6 inet6 v4tunnel
address 2a09:xxx:xxx:xxxx::2
netmask 64
endpoint zz.zz.zz.zz
local yy.yy.yyy.yy
ttl 255
gateway 2a09:xxx:xxx:xxxx::1
metric 1001
up ip -6 route add 2a09:xxx:xxx:xxxx::/64 dev sbtb-ipv6 table 2001
up ip -6 route add default via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001
up ip -6 rule add pref 20010 from 2a09:xxx:xxx:xxxx::2 iif lo lookup 2001
up ip -6 rule add pref 20011 oif sbtb-ipv6 lookup 2001
up ping -q -c3 -I sbtb-ipv6 2a09:xxx:xxx:xxxx::1
down ip -6 rule del pref 20011
down ip -6 rule del pref 20010
使い方?
これで、1 つまたは両方のインターフェースを起動できるようになりました。常に正常に動作し、he-ipv6
両方が起動しているときに優先されます。両方が起動しているときにインターフェースを使用するにはsbtb-ipv6
、そのアドレスにバインドするか、インターフェース自体にバインドする必要があります。カーネルが使用すると予想されるルートを表示する例を次に示します。
# ip route get to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from :: via 2001:xxx:xxx:xxxx::1 dev he-ipv6 src 2001:xxx:xxx:xxxx::2 metric 1000 pref medium
# ip route get from 2001:xxx:xxx:xxxx::2 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from 2001:xxx:xxx:xxxx::2 via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000 src 2001:xxx:xxx:xxxx::2 metric 1024 pref medium
# ip route get oif he-ipv6 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from :: via 2001:xxx:xxx:xxxx::1 dev he-ipv6 table 2000 src 2001:xxx:xxx:xxxx::2 metric 1024 pref medium
# ip route get from 2a09:xxx:xxx:xxxx::2 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from 2a09:xxx:xxx:xxxx::2 via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001 src 2a09:xxx:xxx:xxxx::2 metric 1024 pref medium
# ip route get oif sbtb-ipv6 to 2001:db8:f00:ba7::1
2001:db8:f00:ba7::1 from :: via 2a09:xxx:xxx:xxxx::1 dev sbtb-ipv6 table 2001 src 2a09:xxx:xxx:xxxx::2 metric 1024 pref medium
さまざまなコマンド、デーモン、またはツールでは、他のソース アドレスまたはデバイスにバインドするためにさまざまなオプションが必要です。例: ping -I
、、、/など。traceroute -i
curl --interface
ssh -b
ssh -B
次のいずれかのコマンドの結果を比較することで確認できます。
curl -6 https://ifconfig.co
curl -6 --interface 2001:xxx:xxx:xxxx::2 https://ifconfig.co
curl -6 --interface he-ipv6 https://ifconfig.co
次のいずれかの結果と比較すると:
curl -6 --interface 2a09:xxx:xxx:xxxx::2 https://ifconfig.co
curl -6 --interface sbtb-ipv6 https://ifconfig.co