Atsushi2022の日記

データエンジニアリングに関連する記事を投稿してます

Linux iptablels

Dockerコンテナ外部からの通信制御はiptablesを使用して行う。(参考

Dockerコンテナ外部からの通信制御について理解したいので、まずiptablesについて復習していきたい。

iptablesLinuxでパケットフィルタリングを行うツール。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

引用元:https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-iptables

パラメータオプション

上の例だと-p-s-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ルールの保存

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://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-iptables

https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/security_guide/sect-security_guide-command_options_for_iptables-iptables_match_options

https://tech-blog.rakus.co.jp/entry/20220301/iptables

https://www.designet.co.jp/faq/term/?id=aXB0YWJsZXM#

https://knowledge.sakura.ad.jp/4048/

https://www.unix-power.net/networking/post-631