DockerコンテナでTCP/IPネットワークの仕組みを学ぶ

ネットワークツールを含んだDockerイメージを作成しTCP/IPネットワークの仕組みを学ぶ Docker

TCP/IP ネットワークの仕組みを学ぶには、実際にパケットのやり取りを観察し、自分で遅延やパケットロスをシミュレーションするのが効果的です。

この記事では、Ubuntu ベースの Docker コンテナを作成し、ネットワークツールを使ってTCP/IPネットワークの仕組みを学ぶ方法を解説しています。

Dockerコンテナのネットワーク構成図

Docker Host 上に my-net というカスタムブリッジ(サブネット 10.10.0.0/24)を作成し、nodeA(10.10.0.2)と nodeB(10.10.0.3)を同じブリッジに接続する。

Dockerコンテナのネットワーク構成図

コンテナ内部でping、nc、tcpdumpなどのネットワークコマンドを使用してTCP/IPネットワークの動作を確認する。

イメージのビルドとコンテナの実行

作業ディレクトリの作成

作業ディレクトリを作成し、移動する。

Dockerfileの作成

Ubuntu のバージョン 22.04 LTS (Jammy Jellyfish) をベースイメージとして、ネットワークの診断、トラブルシューティング用のパッケージをインストールする。

コンテナは非 rootユーザーで起動する。

インストールするネットワークパッケージ

iproute2

機能: 最新のLinuxシステムで推奨されるネットワーク設定ツール群です。
ipコマンドが含まれ、IPアドレスの設定、ルーティングテーブルの操作、ネットワークインターフェースの管理などのネットワーク設定を行います。

net-tools

機能: ifconfig (インターフェース設定), netstat (ネットワーク接続統計), route (ルーティングテーブル表示), arp (ARPキャッシュ表示) などが含まれます。
現在ではiproute2に置き換えられつつありますが、互換性や特定のスクリプトのためにまだ利用されています。

traceroute

機能: ネットワーク上のパケットが宛先に到達するまでの経路(ホップ)を表示するツールです。
ネットワークの遅延や到達不能な原因を特定するのに役立ちます。

netcat (または nc)

機能: ネットワーク接続を確立し、TCP/UDPプロトコルを使用してデータを読み書きするための汎用的なツールです。
ポートスキャン、シンプルなチャットサーバー、ファイル転送など、非常に多くの用途で利用されます。

iputils-ping

機能: IPネットワークの到達可能性をテストするためのpingコマンドを提供します。
ICMPエコー要求/応答パケットを送信し、応答時間やパケットロスを確認することで、ホストが到達可能かどうか、ネットワーク遅延はどうかなどを診断します。

tcpdump

機能: ネットワークインターフェースを通過するパケットをキャプチャして表示するパケットアナライザです。
ネットワークトラフィックを分析し、プロトコル、ソース/デスティネーションIPアドレス、ポート番号など、さまざまな情報を確認できます。
ネットワークのトラブルシューティングやセキュリティ分析に不可欠なツールです。

libcap2-bin:

機能: プロセスに特定の「機能」(capability)を付与または削除するためのユーティリティが含まれています。
例えば、非rootユーザーでもpingtcpdumpのような特権を必要とするネットワーク操作を実行できるようにするために使用されることがあります。

docker-compose.ymlの作成

【参考】

cap_add:
コンテナに特定のLinuxケーパビリティ(capabilities)を追加します。
- NET_ADMIN: 
ネットワークインターフェースの設定、ルーティングテーブルの変更、ファイアウォールルールの設定など、ネットワーク管理に関する特権をコンテナに付与します。
- NET_RAW: 
生(RAW)ソケットの作成を許可します。
これは、ping (ICMPパケット) やtcpdumpのような、低レベルのネットワークパケットを直接操作するツールに必要です。

tty: true: stdin_open: true:
擬似ターミナル(TTY)を割り当て開いたままにします。
これにより、コンテナがインタラクティブなシェルセッションを保持し、バックグラウンドで終了しないようにします。

イメージをビルド

コンテナの起動

ターミナル操作

イメージのビルドとコンテナの実行時のターミナル操作画面。

作業環境は、こちらの記事を参照してください。

TCP/IPネットワークの仕組みを学ぶ

複数のターミナルを使って、ネットワークコマンドを実行しTCP/IPネットワークの仕組みを学びます。

以下は、ネットワークコマンド実行時のターミナル操作画面です。

【参考】
tcpdumpコマンド オプションの意味

-s 0 # スナップレングス無制限
-e  # リンク層(Ethernet)ヘッダも表示
-nn # ホスト・ポート名を解決しない
-vv # 詳細モード
-XX # ヘッダ+ペイロードを16進+ASCII表示
-c 10# 10パケットで停止

まとめ

Dockerfileで必要なネットワークツールをまとめたイメージを作成して、複数コンテナを立ち上げ同一ネットワークに接続して、ip,ping,tcpdumpなどのネットワークコマンドを実行しました。

この環境をベースに、TCP と UDP、ポート番号、ネットワークスタックの挙動を一つひとつ試しながら学んでいくと、TCP/IP の理解が深まります。

タイトルとURLをコピーしました