Interface編集部
2022年11月号 特集 第1部サポート・ページ
●このページで解説すること
本サポート・ページでは,2022年11月号 特集 第1部「仮想ルータ作りで学ぶネットワークの基本」で作成するルータ・プログラムを動かす仮想ネットワーク環境の構築手順と,通信実験の手順を解説します.基本的には本誌と同じ内容ですが,ここではルータ・プログラムを試す手順に焦点を当てて,コマンドやプログラムの実行方法についてより詳しく説明します.
ここでは,Windows 10(ビルド番号19041以上)のWSL(Windows Subsystem for Linux)機能を使った場合を想定して説明します.WSLによるLinuxの仮想マシンには,Ubuntu 20.04を使用します.
●仮想ネットワーク環境の構築手順
▼手順1:WSL機能のインストール
Windowsのスタート・ボタンを右クリックして,[Windows Power Shell(管理者)]を選択し,コマンドを入力するターミナルを起動します.起動したら,次のコマンドを実行します.
> wsl --install |
▼手順2:Linuxディストリビューションのインストール
Windows Power Shellで次のコマンドを実行します.
> wsl --install -d Ubuntu |
インストールが完了すると,新しいターミナルが立ち上がり,ユーザ名の入力が求められます.ここでユーザ名とパスワードを登録するとLinux環境が利用できるようになります.
▼【補足】一括実行シェル・スクリプト
手順3~手順6のコマンドは,一括実行のシェル・スクリプトを用意しています.下記のコマンドを実行すれば,手順3~手順6をスキップできます.
$ git clone https://github.com/kametan0730/interface_2022_11.git
|
▼手順3:namespaceを作成する
ここからは,図1に示す実験用のネットワークを仮想的に構築します.Ubuntuのターミナルで次のコマンドを実行して,4つのnamespaceを作成します.
$ sudo ip netns add host1
|
図1 仮想的に構築する実験用ネットワークの構成
▼手順4:リンクを作成する
次のコマンドを実行して,リンクを作成します.
$ sudo ip link add name host1-router1 type veth peer name router1-host1
|
▼手順5:作成したリンクをnamespaceに接続する
手順4で作成したリンクを,手順3で作成したnamespaceに接続します.
$ sudo ip link set host1-router1 netns host1
|
▼手順6:リンクの設定
次のコマンドを実行して,各namespaceのリンクを設定します.ここでは,ip netns execコマンドを使ってnamespace内でコマンドを実行します.IPアドレスの設定,リンクのアップ,ネットワーク・インターフェースのオフローディングの無効化,経路の設定,ルータでのIPフォワーディングの有効化を行います.
# host1のリンクの設定
|
▼手順7:namespace同士で通信してみる
次のコマンドでhost1のbashを実行します.
$ sudo ip netns exec host1 bash |
host1からhost2のIPアドレスである192.168.2.2に向けてpingを打ってみます.
(host1):~# ping 192.168.2.2
|
正しくnamespaceの設定ができていれば,pingが疎通します.シェルを実行したnamespaceから抜けるときはexitコマンドを使います.
▼手順8:router1のルータ機能を無効化する
次のコマンドを実行して,router1のルータ機能を無効化します.
$ sudo ip netns exec router1 sysctl -w net.ipv4.ip_forward=0 |
▼手順9:namespace名をプロンプトに表示する
次のコマンドを実行して,rootユーザのホーム・ディレクトリにある.bashrcを開きます.
$ sudo nano /root/.bashrc |
.bashrcを開いたら,ファイルの最後に次の内容を追加します.
if [ `ip netns identify| wc -m` -gt 1 ]; then |
追加したら,次のコマンドを実行して,プロンプトにnamespace名が表示されるか確認します.
$ sudo ip netns exec router1 bash root@asus1(router1):/home/daiya# |
以上で環境構築は完了です.
●第1章実験…受信プログラムを動かしてみる
先ほど構築した仮想ネットワーク環境を使って,実際にプログラムを動かしてみます.第1章で作成した受信プログラムのソースコードは,次のURLからも入手できます.
https://github.com/kametan0730/interface_2022_11
▼手順1:プログラムを入手する
次のコマンドを実行して,受信プログラムのソースコードをダウンロードします.
$ git clone https://github.com/kametan0730/interface_2022_11.git |
▼手順2:プログラムをビルドする
次のコマンドを実行して,受信プログラムのソースコードが入っているディレクトリに移動します.
$ cd interface_2022_11/chapter1/ |
次のコマンドを実行して,受信プログラムのソースコードをビルドします.
$ make all |
▼手順3:router1のnamespaceから受信プログラムを実行する
次のコマンドを実行して,router1のbashを実行します.
$ sudo ip netns exec router1 bash |
次のコマンドを実行して,受信プログラムを実行します.
(router1):# sudo make run
|
▼手順4:host1からpingコマンドを実行してみる
別のターミナル・ウィンドウを起動して,次のコマンドを実行します.host1からpingコマンドを実行してみます.
$ sudo ip netns exec host1 bash
|
すると,router1のターミナルに,次のような標準出力が表示されます.
Received 98 bytes from router1-host1: 223bab6b40fa224f8cb562b… Received 98 bytes from router1-host1: 223bab6b40fa224f8cb562b… … |
以上で受信プログラムの動作確認は完了です.
●第2章実験…ルータ・プログラムによるARPの解決
▼手順1:環境構築用シェル・スクリプトの実行
次のコマンドを実行して,実験用の仮想ネットワーク環境を構築します.
$ cd interface_2022_11/netns-scripts/
|
▼手順2:arpingコマンドでARPリクエストを生成する
次のコマンドを実行して,arpingコマンドをインストールします.
$ sudo apt install arping |
router1のnamespace でルータ・プログラムを動かします.
$ cd interface_2022_11/chapter2/
|
host1のnamespaceで次のコマンドを実行し,ARPリクエストを生成します.
$ sudo ip netns exec host1 bash
|
次に示すようなARPの応答が返ってきたら成功です.
ARPING 192.168.1.1 |
●第3章 実験1…pingコマンドの実行
実験用の仮想ネットワーク環境は,第2章で構築したものと同じです.
▼手順1:ルータ・プログラムの実行
router1のnamespace でルータ・プログラムを動かします.
$ cd interface_2022_11/chapter3/
|
▼手順2:pingコマンドの実行
host1のnamespaceでpingコマンドを実行します.
$ sudo ip netns exec host1 bash
|
ping応答が無事返ってきたら成功です.
●第3章 実験2…tracerouteコマンドを実行する
実験用の仮想ネットワーク環境は,第2章で構築したものと同じです.
第3章 実験1のときにrouter1で実行したルータ・プログラムは,実行したままにします.
▼手順1:tracerouteコマンドをインストールする
次のコマンドを実行して,tracerouteコマンドをインストールします.
$ sudo apt install traceroute |
▼手順2:tracerouteコマンドを実行してみる
host1のnamespaceで,tracerouteコマンドを実行します.
(本誌のp.61 ↓10行目のコマンドは誤りです.お詫びして訂正します)
(host1):~# traceroute 192.168.1.1 -n
|
●第4章 実験①…分岐の無いネットワークでルーティング機能を試す
実験用の仮想ネットワーク環境は,第2章で構築したものと同じです.
▼手順1:ルータ・プログラムの実行
router1のnamespace でルータ・プログラムを動かします.
$ cd interface_2022_11/chapter4/
|
▼手順2:ping/tracerouteコマンドを打ってみる
host1のnamespaceでpingコマンドを実行します.
$ sudo ip netns exec host1 bash
|
host1のnamespaceでtracerouteコマンドを実行します.
(host1):~# traceroute 192.168.2.2 -n |
●第4章 実験②…分岐のあるネットワークでルーティング機能を試す
▼手順1:環境構築用シェル・スクリプトの実行
次のコマンドを実行して,実験用の仮想ネットワーク環境を構築します.
$ cd interface_2022_11/netns-scripts/
|
図2 ルーティング機能を試す実験の仮想ネットワーク環境構成
▼手順2:ルータの設定を変更する
main.cppを編集して,ルータの設定を変更します.
【変更前】
void configure(){
configure_ip_address(
get_net_device_by_name("router1-host1"),
IP_ADDRESS(192, 168, 1, 1),
IP_ADDRESS(255, 255, 255, 0));
configure_ip_address(
get_net_device_by_name("router1-router2"),
IP_ADDRESS(192, 168, 0, 1),
IP_ADDRESS(255, 255, 255, 0));
configure_ip_net_route(
IP_ADDRESS(192, 168, 2, 0), 24,
IP_ADDRESS(192, 168, 0, 2));
}
|
【変更後】
void configure(){
|
▼手順3:ルータ・プログラムの実行
router1のnamespace でルータ・プログラムを動かします.
$ cd interface_2022_11/chapter4/
|
▼手順4:pingコマンドを打ってみる
host1のnamespaceでhost2に対するpingコマンドを実行します.
$ sudo ip netns exec host1 bash
|
続いて,host1のnamespaceでhost3に対するpingコマンドを実行します.
(host1):~# ping 192.168.4.2 … |
★第5章の実験手順については近日中に公開します★