Linuxで動かしながら学ぶTCP/IPネットワーク

1 台の Linux マシン上でネットワークを使って少し遊ぼうとしたとき、何を使えば良いのか調べたところ、Network Namespace が手ごろっぽい。 とはいえ、一度も触ったことがなかったので以下の本を読んでみた。

なお、未読者に向けての内容紹介を書くつもりはない。

Network Namespace

本の中で Network Namespace を扱っているのは主に Chapter 3,4 にあたる。ここで、一台の Linux マシン上でネットワークを構築して色々と実験をする。 具体的には 1 対 1 の通信から始まり、(静的ルーティングによる)ルータを介して異なるセグメント間での通信など、少しずつステップアップしていく。 後の章に比べて丁寧な作りになっているのは良いのだけれど、ひたすら同じようなコマンドを何度も入力させられるのには閉口してしまい、構成を記述した JSON を読み込んでコマントを発行する Python スクリプトを書いてしまった。

書き捨て気味で他の人が使うようには書いていないけれど、一応掲載しておく。いちいち リポジトリを作るのも面倒なので長くなるけど gist で。

gist056f52f93e94aba7f87dd842eac9f6f9

各 Chapter に対応した JSON もアップしておいた。chapter3_1.json を使うなら

> python netns.py chapter3_1.json start

で開始。

> python netns.py chapter3_1.json stop

で終了。ちなみに python のバージョンは以下の通り。

> python --version
Python 3.7.3

前述のように他人が使うことは一切考慮していないため、エラーチェック等は全くしていない。

どーでもいーけど、JSON を手書きすると trailing comma でミスしやすいネ。

IPTables による Bridge 経由パケットのフィルタリング

chapter 4.5 では複数のホストをネットワークで繋ぐため、ブリッジを導入するのだけれど、自分の環境では ping が通らなかった。

理由は sysctl の net.bridge.bridge-nf-call-iptables が 1 になっていたためで、その場合は iptables によるフィルタリングが効いてしまう。とりあえず 0 にして無効化したところ ping が通るようになった。

なお、本書を読むにあたってこれの対応が一番難しかった。

f:id:mtXTJocj:20201219235744p:plain

その他の部分について

Chapter 5 以降はトランスポート層から上のレイヤを扱っている。内容は本当に表面をなぞるだけ。localhost 上で疎通確認して、それを tcpdump で覗いて終わり程度。今まで色々やってきた Network Namespace は DHCP や NAT といった複数ホストが必要になるときにちょっと使うだけ。 ちなみに DHCP のコマンドを何も考えずにそのまま使ったら /etc/resolv.conf を書き変えられてしまって、後で名前解決ができなくなっているのに気付いた。

Chapter 8 では python によるソケットプログラミングを扱っているが、これもネットワークプログラミングの本なら一番最初の章で出てくるようなもの。全くの素人以外は読む必要はない。

というわけで Chapter 5 以降は Not for me だった。

おそらく本の作者もまともな解説をするつもりはなく、わかった気にさせることを目的としていると思う。こうした場合、より深く知りたい人向けに次のステップとなる書籍ガイドを付けるべきだけれど、そういったものはなし。参考文献は RFCpython 関連のネット上のドキュメントで、つまりは純粋に執筆に使用した文書のリストであってこの本の対象読者に役立ててもらうためのものではない。

余談

ネットワークについて全く知らない人向けに解説するとき、下のレイヤから説明するのと上から説明するのとではどちらが分かりやすいんでしょうかね。