[netns] 秒速でネットワーク作成 [veth peer]

AWS運用自動化サービス「Cloud Automator」

技術三課の手塚です。入社から半年が過ぎましたが、もっと長く在籍しているような感覚もあり、大変密度の濃い時間を過ごしています。
さて、本記事は秒速でネットワークを作成する方法です。
Network namespace(以下 netns) と veth peer で軽量な仮想ネットワークを作成します。
– 結果と手順をすぐ知りたい方 => まとめ
– 時間はあるので詳しく見たい方 => 詳細

まとめ

  • Linux 上に 2 ノード直結のネットワークを作成しました
  • この設定に netns と veth peer を使用しました
  • この手順を実行したところ、秒速でネットワーク作成が完了しました

構成図

検証構成
検証構成

事前準備

root 権限でネットワーク変更を行うため、もし壊れても問題がない、使い捨て可能なサーバの使用を強く推奨します。
1. 検証用の Amazon EC2 を 1 台、新規作成します
– 参考: Linux 仮想マシンの起動 / クラウドならアマゾン ウェブ サービス 【AWS 公式】
– 本記事の確認環境: AMI:Amazon Linux 2 (ami-0c3fd0f5d33134a76)、インスタンスタイプ:t2.micro
2. SSH クライアントから Amazon Linux 2 にログインします
– 参考: EC2で構築したLinux ServerへのSSHログイン方法について(Windows環境版) / サーバーワークス エンジニアブログ

手順とコマンド

  • ネットワーク作成後に疎通確認を行い、最後に作成したネットワークを削除します
  • 各 ip コマンドの実行には root 権限が必要です

[ファイル] testnw

実行時間

約 0.1 秒です。確認した限りでは 0.07 秒から 0.12 秒程度のばらつきがありました。

今後は各種ツールやブリッジやルータ等を交えた検証を進めます。
以上、まとめでした。

詳細

以降は用語やコマンドの説明です。

略語の定義

  • netns : Network namespace
  • veth: Virtual Ethernet device
  • NIC : Network Interface Card
  • ホスト : Linux もしくは Amazon Linux 2

netns とは?

netns は独立したネットワークを提供します。ホストのネットワークも netns です。
例えば、1 つの netns には同じ名前の NIC を複数追加できません。

一方、netns が異なれば、他の netns に存在する NIC 名を他の netns でも利用可能です。下記は新規 netns とホストの NIC 名が同じですが、エラーはありません。

また lo と eth0、計 4 つのリソースは全て独立したリソースです。上記は NIC の例ですが、IP アドレスや経路情報等のリソースも netns 毎に独立しています。

veth peer とは?

veth peer は netns 間の接続を提供します。
Twinax ケーブルのように、LAN ケーブルの両端に NIC が接続されているようなリソースとして扱えます。

手順とコマンドの詳細

1. netns 作成

ip netns add <NETNS名>

netns を追加します。

netns を追加
netns を追加

ip netns [list]

netns 一覧を表示します。

[確認] ns1, ns2 があること

ip [-all] netns exec [NETNS名] <実行コマンド>

netns 上でコマンドを実行します。

[確認] ns1 と ns2 のインターフェイスが lo のみであること
state DOWN は後の手順で修正します。

[参考] ホストのネットワークデバイス
eth0 と lo があります。eth0 は ns1, ns2 に存在しません。またホストの lo は state UNKNOWN のため、先ほど確認した ns1, ns2 とは異なるネットワークデバイスです。

2. veth peer 作成

ip link add <VETH名1> type veth peer name <VETH名2>

eth0-ns1 と eth0-ns2 の veth peer 作成します。

veth peer 作成
veth peer 作成

[確認] ホストのネットワークデバイスに eth0-ns1 と eth0-ns2 が追加されること

3. netns と veth 紐づけ

ip link set <NIC名> netns <NETNS名>

eth0-ns1 と ns1 を紐づけます。

eth0-ns1 と ns1 を紐づけ
eth0-ns1 と ns1 を紐づけ

[確認] ns1 の NIC 一覧に eth0-ns1 が追加されること

[確認] ホストの NIC 一覧から eth0-ns1 が消えること

同様に eth0-ns2 と ns2 を紐づけます。

eth0-ns2 と ns2 を紐づけ
eth0-ns2 と ns2 を紐づけ

[確認] ns2 の NIC 一覧に eth0-ns2 が追加されること

[確認] ホストの NIC 一覧から eth0-ns2 が消えること

4. IP アドレス追加

ip address add <IPアドレス/サブネットマスク長> dev <NIC名>

eth0-ns1 と eth0-ns2 に IP アドレスを追加します。

IP アドレス追加
IP アドレス追加

[確認] eth0-ns1 と eth-ns2 に正しい IP アドレスが付与されていること

5. NIC 有効化

ip link set <NIC名> up

全ての NIC を有効化します。

ネットワークデバイス有効化
ネットワークデバイス有効化

[確認] 全ての NIC が UP, LOWER_UP であること

lo は無効でも veth peer 間の疎通は可能ですが、特に理由がなければ有効化します。

6. 疎通確認

ns1 から ns2 に ping が通ります。

[参考] 宛先 IP アドレスに対応する宛先 MAC アドレスが veth peer 経由で存在

[参考] ping に -i オプションを追加すると送信間隔を変更可能

7. netns 削除

ip [-all] netns delete [NETNS名]

疎通確認が完了したので、netns を削除します。

[確認] 新規 netns が存在しないこと(ns1, ns2 が表示されないこと)

[確認] ホストの NIC が lo と eth0 のみであること(ns1, ns2, eth0-ns1, eth0-ns2 が表示されないこと)

ip link delete <NIC名>

もし netns と veth peer の紐付けがない場合、netns を削除してもホスト上にある veth peer は自動で削除されません。この場合、veth peer のうち、どちらか一方の veth をホストから削除すると、両方の veth が削除されます。

もし初期化が手間な場合は EC2 の再構築も有効と考えます。

最後に

秒速で記事を作成したい!

以上

AWS運用自動化サービス「Cloud Automator」