EC2 Ubuntu 22.04.1 LTS
10.0.0.10
ホストのEC2インスタンス10.0.0.1
サブネット10.0.0.0/16
のデフォルトゲートウェイ10.0.0.2
AmazonProvidedDNS(Amazon Route 53 Resolver サーバー)各サブネット CIDR ブロックの最初の 4 つの IP アドレスと最後の IP アドレスは使用できず、EC2 インス タンスなどのリソースに割り当てることができません。例えば、CIDR ブロック 10.0.0.0/24 を持つサ ブネットの場合、次の 5 つの IP アドレスが予約されます。
• 10.0.0.0.: ネットワークアドレスです。
• 10.0.0.1: AWS が VPC ルーター用に予約しています。
• 10.0.0.2: AWS が予約しています。DNS サーバーの IP アドレスは、VPC ネットワーク範囲のベースに プラス 2 したものです。https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-ug.pdf
EC2インスタンス10.0.0.10
のDockerでデフォルトのブリッジネットワークとカスタムのブリッジネットワークでそれぞれコンテナを稼働。
docker0
172.17.0.1
br-xxxxxxxx
172.18.0.1
ルーティングテーブルはip route
コマンドで確認できます。
下記はip route
コマンドの結果です。
# ホスト 10.0.0.10 で実行
$ ip route
default via 10.0.0.1 dev eth0 proto dhcp src 10.0.0.10 metric 100
10.0.0.2 via 10.0.0.1 dev eth0 proto dhcp src 10.0.0.10 metric 100
10.0.0.0/16 dev eth0 proto kernel scope link src 10.0.0.10 metric 100
10.0.0.1 dev eth0 proto dhcp scope link src 10.0.0.10 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.18.0.0/16 dev br-xxxxxxxx proto kernel scope link src 172.18.0.1
10.0.0.10
から宛先がルートに一致しないものに適用(つまりルートテーブルにない宛先はすべて10.0.0.1
に転送)10.0.0.10
のeth0
(デバイス dev)から10.0.0.1
(デフォルトゲートウェイ)に転送10.0.0.1
(デフォルトゲートウェイ)がルーティング。どのようにルーティングするかは、10.0.0.1
(デフォルトゲートウェイ)のルートテーブルよる10.0.0.10
から宛先10.0.0.2
に適用されるルート10.0.0.10
のeth0
(デバイス dev)から10.0.0.1
(デフォルトゲートウェイ)に転送10.0.0.1
から10.0.0.2
へ配送10.0.0.10
から宛先10.0.0.0/16
に適用されるルート10.0.0.10
のeth0
(デバイス dev)から直接unicast
/broadcast
で通信10.0.0.10
から宛先10.0.0.1
に適用されるルート10.0.0.10
のeth0
(デバイス dev)から10.0.0.1
(デフォルトゲートウェイ)に転送172.17.0.1
から宛先172.17.0.0/16
に適用されるルート10.0.0.10
のdocker0
(デバイス dev)から直接unicast
/broadcast
で通信172.18.0.1
から宛先172.18.0.0/16
に適用されるルート10.0.0.10
のbr-xxxxxxxx
(デバイス dev)から直接unicast
/broadcast
で通信via
はネクストホップ、dev
は10.0.0.10
のネットワークインターフェースを表す。
proto kernel/dhcp、scope linkは以下の記事で詳しく解説されている。
ref. https://qiita.com/testnin2/items/7490ff01a4fe1c7ad61f
metricは経路が複数あるときの判断基準になる(値が小さいものが優先)。
※ Docker から外部への通信は NAT を使用。iptables -t nat -nL -v
で確認。
※ Ubuntu、 Debian 基本コマンドインストール。apt update && apt install -y iproute2 iputils-ping net-tools tcpdump traceroute lsof
外部からきたアクセスのdockerネットワークへの転送はnet.ipv4.ip_forward=1
で実行される。
host$ sudo sysctl --all | grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
※ 設定ファイルは /etc/sysctl.conf 。
ref. IPフォワード(IP Forward)
以下本文の構成は異なるが EC2 インスタンスに Docker コンテナが稼働している状況の ルートテーブルとNAT テーブル。
host$ ip route
default via 10.1.0.1 dev eth0 proto dhcp src 10.1.0.81 metric 100
10.1.0.0/24 dev eth0 proto kernel scope link src 10.1.0.81 metric 100
10.1.0.1 dev eth0 proto dhcp scope link src 10.1.0.81 metric 100
10.1.0.2 dev eth0 proto dhcp scope link src 10.1.0.81 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown
172.18.0.0/16 dev br-528a7aa7b156 proto kernel scope link src 172.18.0.1
外部からのDocker コンテナへの接続は IP フォワード(net.ipv4.ip_forward
) によって 172.18.0.1に転送される。
sudo iptables -t nat -nL -v
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
25 1216 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DOCKER all -- * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
10 600 MASQUERADE all -- * !br-528a7aa7b156 172.18.0.0/16 0.0.0.0/0
33 1994 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0
0 0 MASQUERADE tcp -- * * 172.18.0.2 172.18.0.2 tcp dpt:3306
0 0 MASQUERADE tcp -- * * 172.18.0.3 172.18.0.3 tcp dpt:8080
Chain DOCKER (2 references)
pkts bytes target prot opt in out source destination
0 0 RETURN all -- br-528a7aa7b156 * 0.0.0.0/0 0.0.0.0/0
0 0 RETURN all -- docker0 * 0.0.0.0/0 0.0.0.0/0
0 0 DNAT tcp -- !br-528a7aa7b156 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306 to:172.18.0.2:3306
0 0 DNAT tcp -- !br-528a7aa7b156 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080 to:172.18.0.3:8080