Linux iptablels
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#