Dockerで利用されているNATの機能
Docker が DOCKER チェーンを作る理由(家庭内ネットワークでの NAT の例を含む)
Docker がネットワーク設定で独自の DOCKER チェーンを作成する背景には、NAT(Network Address Translation)の仕組みと特性が深く関係しています。本記事では、NAT の役割や家庭内ネットワークの具体例を交えながら、Docker チェーンがなぜ必要なのかを噛み砕いて解説します。
NAT(Network Address Translation)とは?
NAT は、ネットワーク通信における アドレス変換技術 です。主に以下の 2 種類があります:
DNAT(Destination Network Address Translation)
宛先アドレスを変更する NAT。
略: Destination Network Address Translation
パケットが外部から送られてきたときに、その 宛先 IP アドレスやポートを変更 します。用途: 外部から内部への通信の振り分け。
例: 外部からの通信を家庭内の NAS にリダイレクト。
SNAT(Source Network Address Translation)
送信元アドレスを変更する NAT。
略: Source Network Address Translation
パケットを内部から外部に送る際に、送信元 IP アドレスを変更 します。用途: 内部ネットワークから外部への通信を可能にする。
例: 家庭内の PC がインターネットにアクセス。
家庭内ネットワークでの NAT の具体例
1. 家庭のルーターで SNAT を使用する場合
自宅の PC やスマホがインターネットにアクセスするとき、プライベート IP(例: 192.168.1.10)はそのままでは外部のネットワークと通信できません。ルーターが NAT を使って 送信元アドレスをグローバル IP に変換 します。
内部ネットワーク: 192.168.1.10(PC)
ルーターのグローバル IP: 203.0.113.1
送信の流れ:
PC(192.168.1.10)がウェブサイト(例: 8.8.8.8)にリクエスト。
ルーターが 送信元アドレスを 203.0.113.1 に変換(SNAT)。
応答データは、グローバル IP(203.0.113.1)に届く。
ルーターが受信データを 元のアドレス(192.168.1.10)に変換 して転送。
2. 家庭のルーターで DNAT を使用する場合
外部から家庭内ネットワークのデバイス(例: NAS サーバー)にアクセスしたいときに使用されます。
NAS の内部 IP: 192.168.1.100
ルーターのグローバル IP: 203.0.113.1
ルーターのポート転送設定: ポート 8080 → 192.168.1.100:80
通信の流れ:
外部ユーザーがグローバル IP(203.0.113.1)のポート 8080 にリクエスト。
ルーターが 宛先アドレスを 192.168.1.100:80 に変換(DNAT)。
NAS サーバー(192.168.1.100)が応答を返す。
PREROUTING と POSTROUTING の役割
NAT を用いたアドレス変換は、iptables の以下のチェーンで行われます。
1. PREROUTING
タイミング: パケットがネットワークに届いた直後(ルーティング前)。
用途: 宛先アドレスを変更(DNAT)。
例: 外部ポート 80 のリクエストを内部サーバー(192.168.1.100:8080)に転送。 iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
2. POSTROUTING
タイミング: ルーティング後、パケットが送信される直前。
用途: 送信元アドレスを変更(SNAT)。
例: 内部ネットワーク(192.168.1.0/24)の送信元をグローバル IP に変換。 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
DOCKER チェーンが必要な理由
Docker では、複数のコンテナが独自のネットワーク上で動作しています。これに伴い、以下のような課題が生じます:
ポートフォワーディングの管理が煩雑になる
Docker コンテナにポートフォワーディングを設定するには、外部ポートをコンテナの内部ポートに対応付けるルールを管理する必要があります。
複数コンテナのルールが混在してしまう
コンテナが増えると、管理者が設定したルール(手動の PREROUTING や POSTROUTING)と Docker のルールが混在し、トラブルが起きやすくなります。
動的なルールの追加・削除が必要
コンテナが作成・削除されるたびに、それに対応するネットワークルールを自動的に更新する仕組みが必要です。
Docker が DOCKER チェーンを作成する理由を噛み砕くと
Docker が独自に DOCKER チェーンを作る理由は以下の通りです:
Docker 専用のルールを分離して管理する
Docker のネットワークルールを DOCKER チェーンに集約し、他の PREROUTING や POSTROUTING のルールと分けることで、干渉を防ぎます。
他のアプリケーションや管理者が設定するルールと競合しにくくなります。
動的なルール管理を効率化
コンテナの作成や削除に応じてルールを自動的に追加・削除する仕組みが、DOCKER チェーンによって実現されています。
トラブルシューティングを容易にする
Docker 関連のルールがすべて DOCKER チェーン内に集約されているため、問題が発生した際に影響範囲を特定しやすくなります。
DOCKER チェーンの動作例
外部ポート 8080 をコンテナ内のポート 80 に転送する場合、以下のルールが適用されます:
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DOCKER
iptables -t nat -A DOCKER -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
PREROUTING: 外部ポート 8080 へのリクエストを DOCKER チェーンに転送。
DOCKER チェーン: 宛先をコンテナ(172.17.0.2:80)に変更。
まとめ
チェーン名 タイミング 主な用途 管理者 PREROUTING パケット受信直後 宛先アドレスの変更 (DNAT) 管理者または Docker POSTROUTING 送信直前 送信元アドレスの変更 (SNAT) 管理者 DOCKER Docker チェーンに転送後 Docker 関連ルールの管理 Docker
Docker の DOCKER チェーンは、Docker が動的にルールを管理しつつ、ネットワークの衝突を防ぎ、管理を効率化するために必要な仕組みです。