Linux名前空間のIP転送

Linux名前空間のIP転送

現在、Linuxでネットワーク名前空間を使用してネットワークをシミュレートしようとしています。ノードを確立して接続し、一度に1ホップずつ互いにpingできます。しかし、IP転送を有効にするには本当に問題があります。

私はUbuntu Server 21.04を使用しており、システムのネットワークはsystemd-networkdによって制御されています。 systemd バージョンは 247.3-3ubuntu3.4 です。net.ipv6.conf.all.forwardingすでにnet.ipv4.ip_forward有効になっています。ネットワーク接続を使用しているため、構成ファイルでも転送を有効にする必要があります。私の名前空間の1つは次のとおりです。

/etc/systemd/network/router1i.network:

[Match]
Name=router1i

[Network]
IPForward=yes

および/etc/systemd/network/router1i2.network:

[Match]
Name=router1i2

[Network]
IPForward=yes

これら(router1iおよびrouter1i2)は veth インタフェースであり、名前空間にある唯一の 2 つのインタフェースです。

名前空間でコマンドを使用すると、パスに転送が含まれないため、ip -6 route get to fe80::1:0:200 iif router1i2正解が得られます。他のインターフェースから始まったfe80::1:0:200 from :: dev router1i2 proto kernel metric 256 iif router1i2 pref medium同様のコマンドを使用すると、ip -6 route get to fe80::1:0:200 iif router1i答えは突然yesですRNETLINK answers: Network is unreachable。配信が有効になっていないようです。

networkctl reconfigure router1i名前空間内でを使用してネットワークを更新しようとしましたが、このメッセージはFailed to reconfigure network interface router1i: No such device or address奇妙です。使用すると、networkctl status router1iすべての情報が正しくリストされているためです。また、完全なリフレッシュを試しましたが、networkctl reload何も変更されませんでした。

正直に言って、とにかくどうすることはできません。ネットワーク作業に必須ではありません。どんなアイデアや解決策でも大変感謝します。

編集する:

dirktが提案したように、リンクローカルアドレスを一意のローカルアドレスに置き換えました。の出力と判断すると、パスが正しく選択されましたip -6 route get。ただし、まだ他のネットワークインターフェイスに対してpingを実行することはできません。正直なところ、エラーが見つからなかったので、以下に詳細を追加します。

インターフェース構成:

ubuntu@ubuntu:~$ sudo ip netns exec Router1 ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group`default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
6: router1i@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether be:fc:8e:30:e4:18 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fd00:0:0:1000::1/64 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::bcfc:8eff:fe30:e418/64 scope link
       valid_lft forever preferred_lft forever
8: router1i2@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether d6:3f:e9:9a:93:f3 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fd00:0:0:1001::1/63 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::d43f:e9ff:fe9a:93f3/64 scope link
       valid_lft forever preferred_lft forever

IPv6ルーティングテーブル:

ubuntu@ubuntu:~$ sudo ip netns exec Router1 ip -6 route
fd00:0:0:1000::/64 dev router1i proto kernel metric 256 pref medium
fd00:0:0:1000::/63 dev router1i2 proto kernel metric 256 pref medium
fe80::/64 dev router1i proto kernel metric 256 pref medium
fe80::/64 dev router1i2 proto kernel metric 256 pref medium
default via fd00:0:0:1001::2 dev router1i2 metric 1024 pref medium

出力ip netconf

ubuntu@ubuntu:~$ sudo ip netns exec Router1 ip netconf
inet lo forwarding on rp_filter loose mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet router1i forwarding on rp_filter loose mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet router1i2 forwarding on rp_filter loose mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet all forwarding on rp_filter loose mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet default forwarding on rp_filter loose mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet6 lo forwarding on mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet6 router1i forwarding on mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet6 router1i2 forwarding on mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet6 all forwarding on mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off
inet6 default forwarding on mc_forwarding off proxy_neigh off ignore_routes_with_linkdown off

今動作します:

ubuntu@ubuntu:~$ sudo ip netns exec Router1 ip -6 route get to fd00:0:0:1001::2 iif router1i
fd00:0:0:1001::2 from :: dev router1i2 proto kernel metric 256 iif router1i pref medium

ただし、実際にrouter1iでアドレスをpingしようとすると、次のようになります。

ubuntu@ubuntu:~$ sudo ip netns exec Router1 ping6 fd00:0:0:1001::2 -I router1i
ping6: connect: Network is unreachable

転送がオンになっており、正しいパスが選択されました。なぜまだ動作しないのですか?

編集2:

私はそれを働かせた!助けてくれた皆さんに感謝します。

明らかに、-Iオプションを使用したpingの効果を誤って判断したようです。これは私を混乱させ、私の未熟さは役に立ちませんでした。この方法をもう少し早く見つけなければなりませんでした。

とにかく、もう一度ありがとう、良い一日を過ごしてください!

答え1

fe80::/10リンクローカルアドレスです。私はこれがルーティング可能であるとは思いません(ルーティング可能にするいくつかのトリックがあるかもしれませんが、試したことはありません)。

IPv6ルーティングを試みるには、代わりにそれを使用しないでください。一意のローカルアドレスfc00::/7インターフェイスのリンクローカルアドレス(通常は自動設定)に加えて、es(ULA、範囲)があります。

また、デバッグにも使用できますip -6 route get from ... to ...

ip route add ...プレイ中はいつものようにルートを設定してください。

ルートを設定することを忘れないでくださいみんな「転送」ノードだけでなく、パケットパス(またはあなたの場合は名前空間)に従うノードです(これを忘れるのは一般的な初心者の間違いです)。


「あるインターフェースから別のインターフェースに移動」(使用すると仮定)して-I人生を難しくしない限り、これを行うのは簡単です。

3つの名前空間A、B、Cを設定します。 AとBをvethペアで接続し、BとCをvethペアで接続します。 4つのネットワークインターフェイスすべてにULAアドレス(正しいサブネット、1つのA / Bサブネット、1つのB / Cサブネットを含む)を配置します。 AとCのデフォルトパスを設定します(該当するBインターフェイスを介して)。 Bで転送を有効にします。次に、AからBの近距離インタフェースアドレス、Bの「遠距離」インタフェースアドレス、Cの順にpingを試みます。ただ一般を使用してくださいping <addr>。動作が停止する場所を確認してください(すぐに機能しない場合)。

デバッグするには、tcpdump4つのインターフェイスすべての4つの端末で実行してください。ネットワークネームスペースで1つ以上を実行すると、xtermデバッグと設定が簡単になります。

それでも機能しない場合は、機能しているpingと機能しないpingのtcpdump出力を含む、上記の設定で実行したすべてのコマンドを含む新しい質問をします。 (Q&AによるリモートデバッグはPITAです。)

関連情報