見出し画像

Dockerで利用されているNATの機能

Docker が DOCKER チェーンを作る理由(家庭内ネットワークでの NAT の例を含む)

Docker がネットワーク設定で独自の DOCKER チェーンを作成する背景には、NAT(Network Address Translation)の仕組みと特性が深く関係しています。本記事では、NAT の役割や家庭内ネットワークの具体例を交えながら、Docker チェーンがなぜ必要なのかを噛み砕いて解説します。


NAT(Network Address Translation)とは?

NAT は、ネットワーク通信における アドレス変換技術 です。主に以下の 2 種類があります:

  1. DNAT(Destination Network Address Translation)

    • 宛先アドレスを変更する NAT

    • : Destination Network Address Translation
      パケットが外部から送られてきたときに、その 宛先 IP アドレスやポートを変更 します。

    • 用途: 外部から内部への通信の振り分け。

      • 例: 外部からの通信を家庭内の NAS にリダイレクト。

  2. 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

送信の流れ:

  1. PC(192.168.1.10)がウェブサイト(例: 8.8.8.8)にリクエスト。

  2. ルーターが 送信元アドレスを 203.0.113.1 に変換(SNAT)。

  3. 応答データは、グローバル IP(203.0.113.1)に届く。

  4. ルーターが受信データを 元のアドレス(192.168.1.10)に変換 して転送。

2. 家庭のルーターで DNAT を使用する場合

外部から家庭内ネットワークのデバイス(例: NAS サーバー)にアクセスしたいときに使用されます。

  • NAS の内部 IP: 192.168.1.100

  • ルーターのグローバル IP: 203.0.113.1

  • ルーターのポート転送設定: ポート 8080 → 192.168.1.100:80

通信の流れ:

  1. 外部ユーザーがグローバル IP(203.0.113.1)のポート 8080 にリクエスト。

  2. ルーターが 宛先アドレスを 192.168.1.100:80 に変換(DNAT)。

  3. 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 では、複数のコンテナが独自のネットワーク上で動作しています。これに伴い、以下のような課題が生じます:

  1. ポートフォワーディングの管理が煩雑になる

    • Docker コンテナにポートフォワーディングを設定するには、外部ポートをコンテナの内部ポートに対応付けるルールを管理する必要があります。

  2. 複数コンテナのルールが混在してしまう

    • コンテナが増えると、管理者が設定したルール(手動の PREROUTING や POSTROUTING)と Docker のルールが混在し、トラブルが起きやすくなります。

  3. 動的なルールの追加・削除が必要

    • コンテナが作成・削除されるたびに、それに対応するネットワークルールを自動的に更新する仕組みが必要です。


Docker が DOCKER チェーンを作成する理由を噛み砕くと

Docker が独自に DOCKER チェーンを作る理由は以下の通りです:

  1. Docker 専用のルールを分離して管理する

    • Docker のネットワークルールを DOCKER チェーンに集約し、他の PREROUTING や POSTROUTING のルールと分けることで、干渉を防ぎます。

    • 他のアプリケーションや管理者が設定するルールと競合しにくくなります。

  2. 動的なルール管理を効率化

    • コンテナの作成や削除に応じてルールを自動的に追加・削除する仕組みが、DOCKER チェーンによって実現されています。

  3. トラブルシューティングを容易にする

    • 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 が動的にルールを管理しつつ、ネットワークの衝突を防ぎ、管理を効率化するために必要な仕組みです。

いいなと思ったら応援しよう!