vethデバイスを使用して2つの名前空間を直接接続するには、どのネットワークプレフィックスを使用する必要がありますか?

vethデバイスを使用して2つの名前空間を直接接続するには、どのネットワークプレフィックスを使用する必要がありますか?

私はちょうどネットワークの名前空間を調査し始め、非常に一般的な例を研究しています。これは2つのvethを介して2つの名前空間を接続します(ブリッジは含まれていません)。

ip netns add net1
ip netns add net2
ip netns exec net1 ifconfig lo up
ip netns exec net2 ifconfig lo up
ip link add veth1 type veth peer name veth2
ip link set veth1 netns net1
ip link set veth2 netns net2
ip netns exec net1 ifconfig veth1 10.0.15.1/24 up
ip netns exec net2 ifconfig veth2 10.0.15.2/24 up
ip netns exec net1 ping 10.0.15.2

出力は次のとおりです

PING 10.0.15.2 (10.0.15.2) 56(84) bytes of data.
64 bytes from 10.0.15.2: icmp_seq=1 ttl=64 time=0.355 ms
64 bytes from 10.0.15.2: icmp_seq=2 ttl=64 time=0.189 ms
64 bytes from 10.0.15.2: icmp_seq=3 ttl=64 time=0.187 ms
64 bytes from 10.0.15.2: icmp_seq=4 ttl=64 time=0.184 ms
64 bytes from 10.0.15.2: icmp_seq=5 ttl=64 time=0.158 ms
64 bytes from 10.0.15.2: icmp_seq=6 ttl=64 time=0.300 ms
64 bytes from 10.0.15.2: icmp_seq=7 ttl=64 time=0.189 ms
64 bytes from 10.0.15.2: icmp_seq=8 ttl=64 time=0.186 ms
64 bytes from 10.0.15.2: icmp_seq=9 ttl=64 time=0.186 ms

私が理解できないのは、私が見るすべての例でvethにIPを提供するときに常に/ 24クラスのIPを提供する理由です。 IPを付与しようとすると:

ip netns exec net2 ifconfig veth2 10.0.15.2/32 up

私が得た結果は次のとおりです。

PING 10.0.15.2 (10.0.15.2) 56(84) bytes of data.
From 10.0.15.1 icmp_seq=9 Destination Host Unreachable
From 10.0.15.1 icmp_seq=10 Destination Host Unreachable
From 10.0.15.1 icmp_seq=11 Destination Host Unreachable
From 10.0.15.1 icmp_seq=12 Destination Host Unreachable
From 10.0.15.1 icmp_seq=13 Destination Host Unreachable
From 10.0.15.1 icmp_seq=14 Destination Host Unreachable
From 10.0.15.1 icmp_seq=15 Destination Host Unreachable

単一のIPアドレスを提供できないのはなぜですか?

ベストアンサー1

長い話を短く

Linuxはアドレスを追加するときに暗黙的なパスを追加します。アドレスが/ 32の場合、暗黙的なパスを追加することはできません。その後、別のIPにパスを手動で追加する必要があります。 1つの宛先(LANまたはIP)にのみルーティングすることを意図していますが、対称の場合は通常ピアのIPにのみルーティングされます。ip addresspeer同じショット内にパスを追加するパラメータ。したがって、ifconfig2つのコマンドを使用するのではなく、このコマンド(最新のipコマンドを使用)を使用するとpingが機能します。

ip -n net1 link set veth1 up
ip -n net2 link set veth2 up
ip -n net1 address add 10.0.15.1 peer 10.0.15.2 dev veth1
ip -n net2 address add 10.0.15.2 peer 10.0.15.1 dev veth2

より長い答え:

まずいくつか:

  • 問題はネットワークネームスペースには関係なく、ルーティング機能とLinux機能に関するすべてです。それにもかかわらず、ネットワークネームスペースは全体の設定をモデル化するのに非常に便利です。
  • Linuxでは、利点を利用するためにこのifconfigコマンド(およびその他のコマンド)の使用を中止する必要があります。routebrctlIP ルート 2ifconfigLinux の API (ioctl) は netlink API の半分が放棄されているため、一部の新機能はip ...これらのコマンドでのみ使用できます。
  • 最近は十分ですIP ルート 2ほとんどのツールサブコマンドは、名前空間を使用するときにオプションをショートカットとして使用します。-netns可能であれば、以下からこのショートカットを使用します。多くのコマンドには短縮バージョンがあります(たとえば、ip -netns net1 FOOip netns exec net1 ip FOOip addrip aip address)と一部のパラメータキーワードは省略できます。ここでは略語を使用しません(除く-n-netns

Linuxは、ネットマスクを使用してアドレスを設定するときに暗黙的にパスを追加します。ネットマスクが/ 32の場合、この方法でパスを追加することはできません(または実際にはまだ存在します)。地元の 範囲は指定されたルーティングですが、非表示になっています。地元のip -n net1 route show table localデフォルトのルーティングテーブルの代わりにルーティングテーブル()を使用します。暗黙的なルーティングを必要としない特定の設定ip address addでフラグを使用すると、これらの追加を防ぐことができます。デフォルト(すべてのホストビット設定のバリエーション)ブロードキャストアドレスなどのnoprefixrouteいくつifconfigかのデフォルト設定も追加されました。使用時に明示的に要求する必要がありますip address

何が起こっているのかを理解するのに役立ついくつかの例は次のとおりです。

アドレスを追加する前に、以下を実行してください。ip monitor名前空間の1つは別々の端末にあります。ネットワーク名前空間でできるだけ多くのネットワーク変更を表示し、最初のアドレスadd(ip netns exec net1 ifconfig veth1 10.0.15.1/24 up)を実行します。一般的に得られるものは次のとおりです。

# ip -4 -n net1 monitor route
local 10.0.15.1 dev veth1 table local proto kernel scope host src 10.0.15.1 
broadcast 10.255.255.255 dev veth1 table local proto kernel scope link src 10.0.15.1 linkdown 
10.0.0.0/8 dev veth1 proto kernel scope link src 10.0.15.1 linkdown 
broadcast 10.0.0.0 dev veth1 table local proto kernel scope link src 10.0.15.1 linkdown 
Deleted 10.0.0.0/8 dev veth1 proto kernel scope link src 10.0.15.1 linkdown 
Deleted broadcast 10.255.255.255 dev veth1 table local proto kernel scope link src 10.0.15.1 linkdown 
Deleted broadcast 10.0.0.0 dev veth1 table local proto kernel scope link src 10.0.15.1 linkdown 
Deleted local 10.0.15.1 dev veth1 table local proto kernel scope host src 10.0.15.1 
local 10.0.15.1 dev veth1 table local proto kernel scope host src 10.0.15.1 
broadcast 10.0.15.255 dev veth1 table local proto kernel scope link src 10.0.15.1 linkdown 
10.0.15.0/24 dev veth1 proto kernel scope link src 10.0.15.1 linkdown 
broadcast 10.0.15.0 dev veth1 table local proto kernel scope link src 10.0.15.1 linkdown

ここだと思います。ifconfig非効率的:まず/ 8パスを追加し、それを削除して要求された/ 24パスを配置します。これは、過去に修正されたことのない従来の問題である可能性があります。これは次のとおりですip -n net1 link set veth1 up; ip -n net1 address add 10.0.15.1/24 broadcast + dev veth1

local 10.0.15.1 dev veth1 table local proto kernel scope host src 10.0.15.1 
broadcast 10.0.15.255 dev veth1 table local proto kernel scope link src 10.0.15.1 linkdown 
10.0.15.0/24 dev veth1 proto kernel scope link src 10.0.15.1 linkdown 
broadcast 10.0.15.0 dev veth1 table local proto kernel scope link src 10.0.15.1 linkdown 

/ 24が必要ない場合はどうなりますか? / 32 IPを設定し、次のように直接ルーティングを追加できます(全体設定の(おそらく)短いバージョンを書き直しました):

ip netns add net1
ip netns add net2
ip -n net1 link set lo up
ip -n net2 link set lo up
ip -n net1 link add name veth1 type veth peer netns net2 name veth2

インターフェイスの設定(以前または後で実行でき、一度起動した後は最終結果を変更しません):

ip -n net1 link set veth1 up
ip -n net2 link set veth2 up

住所:

ip -n net1 address add 10.0.15.1/32 dev veth1
ip -n net2 address add 10.0.15.2/32 dev veth2

これには隠されたローカルパスのみがip -4 -n net1 monitor route表示されます。local 10.0.15.1 dev veth1 table local proto kernel scope host src 10.0.15.1

路線:

ip -n net1 route add 10.0.15.2/32 dev veth1
ip -n net2 route add 10.0.15.1/32 dev veth2

両方のアドレス値はまったく関係がないかもしれません。 192.0.2.1 および 198.51.100.2 も使用できます。一部のホスティングプロバイダは、このメカニズムを使用して追加の「障害対策IP」を提供します。実際、これらの特定の状況への近道があります。関連情報を提供すると、そのアドレスに沿ったルートがただちに追加されます。したがって、前の4つのコマンドの代わりにこれで十分です。

ip -n net1 address add 10.0.15.1 peer 10.0.15.2 dev veth1
ip -n net2 address add 10.0.15.2 peer 10.0.15.1 dev veth2

すべての場合において、これらのインターフェイスはまだポイントツーポイントではないイーサネットインターフェイスであるため、他のIPを見つけるためにリンク層でARP要求が発行され続けます。

最後の注意:3つ以上のネットワークネームスペースを一緒に使用したい場合は、LANネットマスクの使用に戻り、ブリッジインターフェイスを作成する必要があります(元のネームスペースに入れることができます)。名前空間を作成しましたが、予期しない相互作用を防ぐために、独自に予約された名前空間に入れることをお勧めします。その後、各 veth インターフェイスのペアについて、一方の側をブリッジのネットワーク名前空間に配置し、ブリッジに依存する必要がありますip -n mybridgens link set vethp1 master bridge0

おすすめ記事