#
ドキュメント

Document

自分のための備忘録です。

ルーティングテーブル

環境

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

Docker

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
  • default via 10.0.0.1 dev eth0 proto dhcp src 10.0.0.10 metric 100
    • 送信元10.0.0.10から宛先がルートに一致しないものに適用(つまりルートテーブルにない宛先はすべて10.0.0.1に転送)
    • 10.0.0.10eth0(デバイス dev)から10.0.0.1(デフォルトゲートウェイ)に転送
    • 10.0.0.1(デフォルトゲートウェイ)がルーティング。どのようにルーティングするかは、10.0.0.1(デフォルトゲートウェイ)のルートテーブルよる
  • 10.0.0.2 via 10.0.0.1 dev eth0 proto dhcp src 10.0.0.10 metric 100
    • 送信元10.0.0.10から宛先10.0.0.2に適用されるルート
    • 10.0.0.10eth0(デバイス dev)から10.0.0.1(デフォルトゲートウェイ)に転送
    • 10.0.0.1から10.0.0.2へ配送
  • 10.0.0.0/16 dev eth0 proto kernel scope link src 10.0.0.10 metric 100
    • 送信元10.0.0.10から宛先10.0.0.0/16に適用されるルート
    • 10.0.0.10eth0(デバイス dev)から直接unicast/broadcastで通信
  • 10.0.0.1 dev eth0 proto dhcp scope link src 10.0.0.10 metric 100
    • 送信元10.0.0.10から宛先10.0.0.1に適用されるルート
    • 10.0.0.10eth0(デバイス dev)から10.0.0.1(デフォルトゲートウェイ)に転送
  • 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
    • 送信元172.17.0.1から宛先172.17.0.0/16に適用されるルート
    • 10.0.0.10docker0(デバイス dev)から直接unicast/broadcastで通信
  • 172.18.0.0/16 dev br-xxxxxxxx proto kernel scope link src 172.18.0.1
    • 送信元172.18.0.1から宛先172.18.0.0/16に適用されるルート
    • 10.0.0.10br-xxxxxxxx(デバイス dev)から直接unicast/broadcastで通信

viaはネクストホップ、dev10.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

備考

net.ipv4.ip_forward

外部からきたアクセスの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