Dockerコンテナ外部からの通信制御はiptables
を使用して行う。(参考)
Dockerコンテナ外部からの通信制御について理解したいので、まずiptables
について復習していきたい。
iptables
はLinuxでパケットフィルタリングを行うツール。iptables
には後継のツールnftables
が存在する(が、Dockerの外部通信制御はiptables
で行っている)
まずはiptables
を使用するためにインストールする。
# yum install iptables-services # systemctl enable iptables # systemctl start iptables
iptables
を理解するのに必要な概念は2つある。テーブルとチェインである。
テーブルは4種類あり、一番利用機会が多いのはfilter
テーブルだろうと思われる。filter
テーブルはパケットフィルタリングを行うテーブルで、そこにフィルタリングルールを追加していく。nftables
とは異なり、テーブルは事前に用意されている。
下の例では、送信元アドレスがxxx.xxx.xxx.xxx
で送信先ポート番号が80番のTCPパケットをドロップさせる。
iptables -t filter -A INPUT -p tcp -s xxx.xxx.xxx.xxx --dport 80 -j DROP
テーブル
テーブルは-t [テーブル名]
で指定する。上の例だとfilter
テーブルが指定されている。
- filterテーブル
- フィルタリングに使用
- natテーブル
- NATに使用
- mangleテーブル
- rawテーブル
上の例だと-A
の箇所。代表的なコマンドオプションは以下の通り。
- -L : 指定したチェーンの全てのルールを表示
- -A : 指定したチェーンの最後にルールを追加
- -I : 引数を指定しないと、チェーンの先頭にルールを追加。整数引数で指定した場合は、指定された場所にチェーンにルールを追加
- -X : 指定のチェーンを削除
チェイン
上の例だとINPUT
の箇所。代表的なチェインは以下の通り。
- INPUT
- ローカルホスト向けのパケット受信時にルールを適用する
- OUTPUT
- ローカルプロセスがパケットを生成する際にルールを適用する
- PREROUTING
- パケット受信時、かつルーティング前にルールを適用する
- POSTROUTING
- パケット送信時にルールを適用する
パケットは以下の流れで、各テーブルのチェーンで処理される。
引用元:https://rlworkman.net/howtos/iptables/chunkyhtml/c962.html
上の例だと-p
と-s
、-j
の部分。代表的なパラメータオプションは以下の通り。
-p
: IPプロトコル。icmp
、tcp
、udp
、all
のいずれか-s
: 送信元IPアドレス-d
: 送信先IPアドレス/アドレスレンジ-i
: 受信ネットワークインターフェイス(例:eth0
)-o
: 発信ネットワークインターフェイス-j
: パケットが特定のルールにマッチすると、パケットを指定したターゲット(後述)にジャンプさせる。つまり、該当パケットの許可、拒否、ドロップを指定する。
上の例だと--dport
の部分。
--sport
: 宛先ポート--dport
: 送信元ポート--tcp-flags
:ACK
,FIN
などのTCPパケットの種類--icmp-type
:port-unreachable
などのICMPパケットの種類
上の例だとDROP
の部分。
- ACCEPT
- パケットの許可
- DROP
- パケットのドロップ。エラーパケットの送信なし。
- REJECT
- パケットを破棄し、エラーパケットを送信元に返送する。
- RETURN
- 現在のチェーンのルールに対するパケットの確認を停止
- LOG
- パケットの情報をログに記録する。デフォルトでは
/var/log/messages
に出力。/etc/syslog.conf
でログ出力先を制御。
- パケットの情報をログに記録する。デフォルトでは
iptablesコマンドで作成したルールはメモリーに保存されるため、再起動するとすべてのルールが失われる。再起動後も維持するには、以下のコマンドで/etc/sysconfig/iptables
にルールを保存する。
# service iptables save
参考
https://rlworkman.net/howtos/iptables/chunkyhtml/c962.html
https://en.m.wikipedia.org/wiki/File:Netfilter-packet-flow.svg
https://tech-blog.rakus.co.jp/entry/20220301/iptables
https://www.designet.co.jp/faq/term/?id=aXB0YWJsZXM#