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)を同じブリッジに接続する。

コンテナ内部でping、nc、tcpdumpなどのネットワークコマンドを使用してTCP/IPネットワークの動作を確認する。
イメージのビルドとコンテナの実行
作業ディレクトリの作成
作業ディレクトリを作成し、移動する。
$mkdir net
$cd net
【ディレクトリとファイル構成】
~/net$ tree
.
├── Dockerfile
└── docker-compose.yml
Dockerfileの作成
Ubuntu のバージョン 22.04 LTS (Jammy Jellyfish) をベースイメージとして、ネットワークの診断、トラブルシューティング用のパッケージをインストールする。
コンテナは非 rootユーザーで起動する。
# Dockerfile
FROM ubuntu:22.04
# 1) 非 root 用ユーザー作成
RUN groupadd -r appuser \
&& useradd -r -g appuser -d /home/appuser -m -s /bin/bash appuser
# 2) ネットワークツール+tcpdump+libcap2-bin をインストール
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
iproute2 net-tools traceroute netcat iputils-ping tcpdump libcap2-bin \
&& rm -rf /var/lib/apt/lists/*
# 3) which でパスを取得してからケーパビリティ付与
RUN TCPDUMP_PATH="$(which tcpdump)" \
&& echo ">> setting capabilities on $TCPDUMP_PATH" \
&& setcap cap_net_raw,cap_net_admin+eip "$TCPDUMP_PATH"
# 4) 作業ディレクトリを用意し所有者を appuser に
RUN mkdir /workspace \
&& chown appuser:appuser /workspace
WORKDIR /workspace
# 5) 以降は非 root ユーザーで起動
USER appuser
CMD ["bash"]
インストールするネットワークパッケージ
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ユーザーでもpingやtcpdumpのような特権を必要とするネットワーク操作を実行できるようにするために使用されることがあります。
docker-compose.ymlの作成
services:
nodeA:
image: tcp-net
container_name: nodeA
user: "1000:1000"
cap_add:
- NET_ADMIN
- NET_RAW
tty: true
stdin_open: true
networks:
mynet:
ipv4_address: 10.10.0.2
nodeB:
image: tcp-net
container_name: nodeB
user: "1000:1000"
cap_add:
- NET_ADMIN
- NET_RAW
tty: true
stdin_open: true
networks:
mynet:
ipv4_address: 10.10.0.3
networks:
mynet:
driver: bridge
ipam:
config:
- subnet: 10.10.0.0/24
【参考】
cap_add:
コンテナに特定のLinuxケーパビリティ(capabilities)を追加します。
- NET_ADMIN:
ネットワークインターフェースの設定、ルーティングテーブルの変更、ファイアウォールルールの設定など、ネットワーク管理に関する特権をコンテナに付与します。
- NET_RAW:
生(RAW)ソケットの作成を許可します。
これは、ping (ICMPパケット) やtcpdumpのような、低レベルのネットワークパケットを直接操作するツールに必要です。
tty: true: stdin_open: true:
擬似ターミナル(TTY)を割り当て開いたままにします。
これにより、コンテナがインタラクティブなシェルセッションを保持し、バックグラウンドで終了しないようにします。
イメージをビルド
# イメージをビルド(名前:tcp-net)
$ docker build -t tcp-net .
コンテナの起動
# nodeA、nodeBコンテナを起動
$ docker-compose up -d
ターミナル操作
イメージのビルドとコンテナの実行時のターミナル操作画面。
作業環境は、こちらの記事を参照してください。
【ターミナル操作画面】
~$ mkdir net
~$ cd net/
【Dockerfileの作成】
~/net$ nano Dockerfile
~/net$ cat Dockerfile
FROM ubuntu:22.04
# 1) 非 root 用ユーザー作成
RUN groupadd -r appuser \
&& useradd -r -g appuser -d /home/appuser -m -s /bin/bash appuser
# 2) ネットワークツール+tcpdump+libcap2-bin をインストール
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
iproute2 net-tools traceroute netcat iputils-ping tcpdump libcap2-bin \
&& rm -rf /var/lib/apt/lists/*
# 3) which でパスを取得してからケーパビリティ付与
RUN TCPDUMP_PATH="$(which tcpdump)" \
&& echo ">> setting capabilities on $TCPDUMP_PATH" \
&& setcap cap_net_raw,cap_net_admin+eip "$TCPDUMP_PATH"
# 4) 作業ディレクトリを用意し所有者を appuser に
RUN mkdir /workspace \
&& chown appuser:appuser /workspace
WORKDIR /workspace
# 5) 以降は非 root ユーザーで起動
USER appuser
CMD ["bash"]
【docker-compose.ymlの作成】
~/net$ nano docker-compose.yml
~/net$ cat docker-compose.yml
services:
nodeA:
image: tcp-net
container_name: nodeA
user: "1000:1000"
cap_add:
- NET_ADMIN
- NET_RAW
tty: true
stdin_open: true
networks:
mynet:
ipv4_address: 10.10.0.2
nodeB:
image: tcp-net
container_name: nodeB
user: "1000:1000"
cap_add:
- NET_ADMIN
- NET_RAW
tty: true
stdin_open: true
networks:
mynet:
ipv4_address: 10.10.0.3
networks:
mynet:
driver: bridge
ipam:
config:
- subnet: 10.10.0.0/24
【ファイル ディレクトリ構成の確認】
~/net$ tree
.
├── Dockerfile
└── docker-compose.yml
1 directory, 2 files
【イメージのビルド】
~/net$ docker build -t tcp-net .
[+] Building 1.8s (11/11) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 886B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:22.04 1.5s
=> [auth] library/ubuntu:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/6] FROM docker.io/library/ubuntu:22.04@sha256:3c61d3759c2639d4b836d32a2d3c83fa0214e36f195a3421018dbaaf79cbe37f 0.0s
=> => resolve docker.io/library/ubuntu:22.04@sha256:3c61d3759c2639d4b836d32a2d3c83fa0214e36f195a3421018dbaaf79cbe37f 0.0s
=> CACHED [2/6] RUN groupadd -r appuser && useradd -r -g appuser -d /home/appuser -m -s /bin/bash appuser 0.0s
=> CACHED [3/6] RUN apt-get update && apt-get install -y --no-install-recommends iproute2 net-tools traceroute netcat iputils-ping tcpdump libcap2-bin && rm -rf /var/lib/apt/lists/* 0.0s
=> CACHED [4/6] RUN TCPDUMP_PATH="$(which tcpdump)" && echo ">> setting capabilities on $TCPDUMP_PATH" && setcap cap_net_raw,cap_net_admin+eip "$TCPDUMP_PATH" 0.0s
=> CACHED [5/6] RUN mkdir /workspace && chown appuser:appuser /workspace 0.0s
=> CACHED [6/6] WORKDIR /workspace 0.0s
=> exporting to image 0.2s
=> => exporting layers 0.0s
=> => exporting manifest sha256:03ed0ae5b138ce4ed78f0fa1b0e1a780a76bef57342cf63b1cc77d2042b96d05 0.0s
=> => exporting config sha256:4494e9501d85d610d78c771f7abd0027bbb91a3ff51b5bff097ff05c890977fe 0.0s
=> => exporting attestation manifest sha256:69595d77fea758d5c345388458fd22a4a193282161ca444555ffaa4db3683c42 0.0s
=> => exporting manifest list sha256:4fb622426e9fb4d675a9e024d57cafa5cadda8277a99434836e7ff40a4d207dd 0.0s
=> => naming to docker.io/library/tcp-net:latest 0.0s
=> => unpacking to docker.io/library/tcp-net:latest 0.1s
【イメージの確認】
~/net$ docker images tcp-net
REPOSITORY TAG IMAGE ID CREATED SIZE
tcp-net latest 4fb622426e9f 6 hours ago 131MB
【コンテナの起動】
~/net$ docker-compose up -d
[+] Running 2/2
✔ Container nodeB Started 0.3s
✔ Container nodeA Started 0.4s
【コンテナの確認】
~/net$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
781ae7bbdc15 tcp-net "bash" 11 seconds ago Up 10 seconds nodeB
c86b90f99203 tcp-net "bash" 11 seconds ago Up 10 seconds nodeA
~/net$
TCP/IPネットワークの仕組みを学ぶ
複数のターミナルを使って、ネットワークコマンドを実行しTCP/IPネットワークの仕組みを学びます。
以下は、ネットワークコマンド実行時のターミナル操作画面です。
【nodeAコンテナ】
# コンテナA に入る。
~$ docker exec -it nodeA bash
# IPコマンドで情報を見る
I have no name!@c86b90f99203:/workspace$ ip addr show eth0
2: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether fa:37:d9:c9:01:33 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.10.0.2/24 brd 10.10.0.255 scope global eth0
valid_lft forever preferred_lft forever
# ifconfigコマンドで情報を見る
I have no name!@c86b90f99203:/workspace$ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.10.0.2 netmask 255.255.255.0 broadcast 10.10.0.255
ether fa:37:d9:c9:01:33 txqueuelen 0 (Ethernet)
RX packets 13 bytes 1106 (1.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 3 bytes 126 (126.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# コンテナ B へ ping
I have no name!@c86b90f99203:/workspace$ ping -c 4 10.10.0.3
PING 10.10.0.3 (10.10.0.3) 56(84) bytes of data.
64 bytes from 10.10.0.3: icmp_seq=1 ttl=64 time=0.073 ms
64 bytes from 10.10.0.3: icmp_seq=2 ttl=64 time=0.142 ms
64 bytes from 10.10.0.3: icmp_seq=3 ttl=64 time=0.146 ms
64 bytes from 10.10.0.3: icmp_seq=4 ttl=64 time=0.153 ms
--- 10.10.0.3 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3271ms
rtt min/avg/max/mdev = 0.073/0.128/0.153/0.032 ms
# tcpdump を使って、パケットをキャプチャ
#新しいターミナルを開き、コンテナ B へ pingする。
I have no name!@c86b90f99203:/workspace$ tcpdump -i eth0 icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
08:14:05.282575 IP c86b90f99203 > nodeB.net_mynet: ICMP echo request, id 11, seq 1, length 64
08:14:05.282620 IP c86b90f99203 > nodeB.net_mynet: ICMP echo request, id 11, seq 1, length 64
08:14:05.282641 IP nodeB.net_mynet > c86b90f99203: ICMP echo reply, id 11, seq 1, length 64
08:14:06.334074 IP c86b90f99203 > nodeB.net_mynet: ICMP echo request, id 11, seq 2, length 64
08:14:06.334104 IP nodeB.net_mynet > c86b90f99203: ICMP echo reply, id 11, seq 2, length 64
08:14:07.374094 IP c86b90f99203 > nodeB.net_mynet: ICMP echo request, id 11, seq 3, length 64
08:14:07.374129 IP nodeB.net_mynet > c86b90f99203: ICMP echo reply, id 11, seq 3, length 64
08:14:08.414203 IP c86b90f99203 > nodeB.net_mynet: ICMP echo request, id 11, seq 4, length 64
08:14:08.414315 IP nodeB.net_mynet > c86b90f99203: ICMP echo reply, id 11, seq 4, length 64
# tcpdump を使って、全ヘッダ+ペイロードを見る
#新しいターミナルを開き、コンテナ B へ pingする。
I have no name!@c86b90f99203:/workspace$ tcpdump -i eth0 -s 0 -e -nn -vv -XX -c 10
tcpdump: listening on eth0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
08:21:25.612247 fa:37:d9:c9:01:33 > 22:9c:37:44:62:55, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 21655, offset 0, flags [DF], proto ICMP (1), length 84)
10.10.0.2 > 10.10.0.3: ICMP echo request, id 12, seq 1, length 64
0x0000: 229c 3744 6255 fa37 d9c9 0133 0800 4500 ".7DbU.7...3..E.
0x0010: 0054 5497 4000 4001 d1f9 0a0a 0002 0a0a .TT.@.@.........
0x0020: 0003 0800 418b 000c 0001 05d5 6c68 0000 ....A.......lh..
0x0030: 0000 7c57 0900 0000 0000 1011 1213 1415 ..|W............
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$%
0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &'()*+,-./012345
0x0060: 3637 67
08:21:25.612291 fa:37:d9:c9:01:33 > 22:9c:37:44:62:55, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 21655, offset 0, flags [DF], proto ICMP (1), length 84)
10.10.0.2 > 10.10.0.3: ICMP echo request, id 12, seq 1, length 64
0x0000: 229c 3744 6255 fa37 d9c9 0133 0800 4500 ".7DbU.7...3..E.
0x0010: 0054 5497 4000 4001 d1f9 0a0a 0002 0a0a .TT.@.@.........
0x0020: 0003 0800 418b 000c 0001 05d5 6c68 0000 ....A.......lh..
0x0030: 0000 7c57 0900 0000 0000 1011 1213 1415 ..|W............
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$%
0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &'()*+,-./012345
0x0060: 3637 67
08:21:25.612312 22:9c:37:44:62:55 > fa:37:d9:c9:01:33, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 55660, offset 0, flags [none], proto ICMP (1), length 84)
10.10.0.3 > 10.10.0.2: ICMP echo reply, id 12, seq 1, length 64
0x0000: fa37 d9c9 0133 229c 3744 6255 0800 4500 .7...3".7DbU..E.
0x0010: 0054 d96c 0000 4001 8d24 0a0a 0003 0a0a .T.l..@..$......
0x0020: 0002 0000 498b 000c 0001 05d5 6c68 0000 ....I.......lh..
0x0030: 0000 7c57 0900 0000 0000 1011 1213 1415 ..|W............
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$%
0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &'()*+,-./012345
0x0060: 3637 67
08:21:26.615334 fa:37:d9:c9:01:33 > 22:9c:37:44:62:55, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 21707, offset 0, flags [DF], proto ICMP (1), length 84)
10.10.0.2 > 10.10.0.3: ICMP echo request, id 12, seq 2, length 64
0x0000: 229c 3744 6255 fa37 d9c9 0133 0800 4500 ".7DbU.7...3..E.
0x0010: 0054 54cb 4000 4001 d1c5 0a0a 0002 0a0a .TT.@.@.........
0x0020: 0003 0800 2e7e 000c 0002 06d5 6c68 0000 .....~......lh..
0x0030: 0000 8e63 0900 0000 0000 1011 1213 1415 ...c............
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$%
0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &'()*+,-./012345
0x0060: 3637 67
08:21:26.615376 22:9c:37:44:62:55 > fa:37:d9:c9:01:33, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 55687, offset 0, flags [none], proto ICMP (1), length 84)
10.10.0.3 > 10.10.0.2: ICMP echo reply, id 12, seq 2, length 64
0x0000: fa37 d9c9 0133 229c 3744 6255 0800 4500 .7...3".7DbU..E.
0x0010: 0054 d987 0000 4001 8d09 0a0a 0003 0a0a .T....@.........
0x0020: 0002 0000 367e 000c 0002 06d5 6c68 0000 ....6~......lh..
0x0030: 0000 8e63 0900 0000 0000 1011 1213 1415 ...c............
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$%
0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &'()*+,-./012345
0x0060: 3637 67
08:21:27.665291 fa:37:d9:c9:01:33 > 22:9c:37:44:62:55, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 21805, offset 0, flags [DF], proto ICMP (1), length 84)
10.10.0.2 > 10.10.0.3: ICMP echo request, id 12, seq 3, length 64
0x0000: 229c 3744 6255 fa37 d9c9 0133 0800 4500 ".7DbU.7...3..E.
0x0010: 0054 552d 4000 4001 d163 0a0a 0002 0a0a .TU-@.@..c......
0x0020: 0003 0800 2eba 000c 0003 07d5 6c68 0000 ............lh..
0x0030: 0000 8c26 0a00 0000 0000 1011 1213 1415 ...&............
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$%
0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &'()*+,-./012345
0x0060: 3637 67
08:21:27.665373 22:9c:37:44:62:55 > fa:37:d9:c9:01:33, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 55691, offset 0, flags [none], proto ICMP (1), length 84)
10.10.0.3 > 10.10.0.2: ICMP echo reply, id 12, seq 3, length 64
0x0000: fa37 d9c9 0133 229c 3744 6255 0800 4500 .7...3".7DbU..E.
0x0010: 0054 d98b 0000 4001 8d05 0a0a 0003 0a0a .T....@.........
0x0020: 0002 0000 36ba 000c 0003 07d5 6c68 0000 ....6.......lh..
0x0030: 0000 8c26 0a00 0000 0000 1011 1213 1415 ...&............
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$%
0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &'()*+,-./012345
0x0060: 3637 67
08:21:28.695251 fa:37:d9:c9:01:33 > 22:9c:37:44:62:55, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 21823, offset 0, flags [DF], proto ICMP (1), length 84)
10.10.0.2 > 10.10.0.3: ICMP echo request, id 12, seq 4, length 64
0x0000: 229c 3744 6255 fa37 d9c9 0133 0800 4500 ".7DbU.7...3..E.
0x0010: 0054 553f 4000 4001 d151 0a0a 0002 0a0a .TU?@.@..Q......
0x0020: 0003 0800 1044 000c 0004 08d5 6c68 0000 .....D......lh..
0x0030: 0000 a99b 0a00 0000 0000 1011 1213 1415 ................
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$%
0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &'()*+,-./012345
0x0060: 3637 67
08:21:28.695323 22:9c:37:44:62:55 > fa:37:d9:c9:01:33, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 55743, offset 0, flags [none], proto ICMP (1), length 84)
10.10.0.3 > 10.10.0.2: ICMP echo reply, id 12, seq 4, length 64
0x0000: fa37 d9c9 0133 229c 3744 6255 0800 4500 .7...3".7DbU..E.
0x0010: 0054 d9bf 0000 4001 8cd1 0a0a 0003 0a0a .T....@.........
0x0020: 0002 0000 1844 000c 0004 08d5 6c68 0000 .....D......lh..
0x0030: 0000 a99b 0a00 0000 0000 1011 1213 1415 ................
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$%
0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &'()*+,-./012345
0x0060: 3637 67
08:21:29.735657 fa:37:d9:c9:01:33 > 22:9c:37:44:62:55, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 21835, offset 0, flags [DF], proto ICMP (1), length 84)
10.10.0.2 > 10.10.0.3: ICMP echo request, id 12, seq 5, length 64
0x0000: 229c 3744 6255 fa37 d9c9 0133 0800 4500 ".7DbU.7...3..E.
0x0010: 0054 554b 4000 4001 d145 0a0a 0002 0a0a .TUK@.@..E......
0x0020: 0003 0800 54a5 000c 0005 09d5 6c68 0000 ....T.......lh..
0x0030: 0000 6339 0b00 0000 0000 1011 1213 1415 ..c9............
0x0040: 1617 1819 1a1b 1c1d 1e1f 2021 2223 2425 ...........!"#$%
0x0050: 2627 2829 2a2b 2c2d 2e2f 3031 3233 3435 &'()*+,-./012345
0x0060: 3637 67
10 packets captured
11 packets received by filter
0 packets dropped by kernel
I have no name!@c86b90f99203:/workspace$
【参考】
tcpdumpコマンド オプションの意味
-s 0 # スナップレングス無制限
-e # リンク層(Ethernet)ヘッダも表示
-nn # ホスト・ポート名を解決しない
-vv # 詳細モード
-XX # ヘッダ+ペイロードを16進+ASCII表示
-c 10# 10パケットで停止
まとめ
Dockerfileで必要なネットワークツールをまとめたイメージを作成して、複数コンテナを立ち上げ同一ネットワークに接続して、ip,ping,tcpdumpなどのネットワークコマンドを実行しました。
この環境をベースに、TCP と UDP、ポート番号、ネットワークスタックの挙動を一つひとつ試しながら学んでいくと、TCP/IP の理解が深まります。

