私はちょうどネットワークの名前空間を調査し始め、非常に一般的な例を研究しています。これは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 address
peer
同じショット内にパスを追加するパラメータ。したがって、ifconfig
2つのコマンドを使用するのではなく、このコマンド(最新の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
コマンド(およびその他のコマンド)の使用を中止する必要があります。route
brctl
IP ルート 2。ifconfig
Linux の API (ioctl) は netlink API の半分が放棄されているため、一部の新機能はip ...
これらのコマンドでのみ使用できます。 - 最近は十分ですIP ルート 2ほとんどのツールサブコマンドは、名前空間を使用するときにオプションをショートカットとして使用します。
-netns
可能であれば、以下からこのショートカットを使用します。多くのコマンドには短縮バージョンがあります(たとえば、ip -netns net1 FOO
ip netns exec net1 ip FOO
ip addr
ip a
ip 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
。