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でデフォルトのブリッジネットワークとカスタムのブリッジネットワークでそれぞれコンテナを稼働。
docker0172.17.0.1br-xxxxxxxx172.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