Linux に実装されたパケットフィルタリング機能。
パケットフィルタリングはネットワーク上に流れているパケットをそのパケットのヘッダー情報によって受け取りを拒否したり、破棄したり、通過させるもの。
以降「Linuxセキュリティ標準教科書」を参考に進める。
iptables では用途に応じて、それぞれルールを記載する「テーブル」が定義されている。iptables コマンドなどでテーブルを指定しなければテーブル「filter」が使用される。filter 以外に「nat」「mangle」がある。
それぞれのテーブルごとに使用できるチェインが決まっており、どのタイミングで処理を施すかをこのチェインを使って指定する。
filter テーブルは INPUT / FOWARD / OUTPUT の3つのチェインが使える。
iptables
-L, --list [chain]
択されたチェインにある全てのルールを一覧表示する。 チェインが指定されない場合、全てのチェインのリストが一覧表示される。 他のコマンドと同様に、指定されたテーブル (デフォルトは filter) に対して作用する。
DNS の逆引きを避けるために、 -n オプションと共に使用されることがよくある。
-v, --verbose
詳細な出力を行う。複数回指定することができ、 数が多くなるとより多くのデバッグ情報が出力される。
$ sudo iptables -nL -v ↓ チェイン名 ↓ デフォルトポリシー(すべてのルールにマッチしない場合に、このルールが適用される) Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
これら iptables の設定は、/etc/sysconfig/iptables で設定されている。
$ sudo cat /etc/sysconfig/iptables # sample configuration for iptables service # you can edit this manually or use system-config-firewall # please do not ask us to add additional ports/services to this default configuration *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
iptables サービスがまだ停止中なので上記設定は読み込まれていない。
(CentOS7 では iptables はインストールされていても、iptables-services がインストールされていないこともあるのでなければ入れること)
$ systemctl status iptables ● iptables.service - IPv4 firewall with iptables Loaded: loaded (/usr/lib/systemd/system/iptables.service; disabled; vendor preset: disabled) Active: inactive (dead)
iptables を起動させる。
$ sudo systemctl start iptables $ sudo systemctl enable iptables $ sudo systemctl status iptables ● iptables.service - IPv4 firewall with iptables Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled) Active: active (exited) since 日 2019-07-21 12:33:07 JST; 22s ago Main PID: 9972 (code=exited, status=0/SUCCESS) ~(後略)~
ルールが読み込まれる。
$ sudo iptables -nL -v Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 111 7576 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 69 packets, 9012 bytes) pkts bytes target prot opt in out source destination
「Linuxセキュリティ標準教科書」より引用
INPUT チェイン (デフォルトポリシーは ACCEPT)
一番上の行で、state が RELATED, ESTABLISHED のパケットは、ACCEPT(許可) になっています。RELATED は既存の接続に関係しているパケット、ESTABLISHED は過去双方向でパケットのやり取りがあった接続に属しているパケットです。ほとんどのパケットは、ここで許可されます。state の各説明は表の通りです。
INVALID: このパケットは既知の接続と関係していない。
ESTABLISHED:このパケットは、過去双方向にパケットがやり取りされた接続に属するパケットである。
NEW:このパケットが新しい接続を開始したか、双方向にはパケットがやり取りされていない接続に属するパケットである。
RELATED:このパケットが新しい接続を開始しているが、FTP データ転送や ICMP エラーのように、既存の接続に関係している。
icmp(ping など) に関してのパケットは、許可されます。
送信元が lo(loopback) のパケットに関しては、全て許可されます。
ssh(ポート番号 22 番) に対して新しい接続が発生した場合には許可されます。これにより SSH の通信が許可されます。
上記以外の通信に関しては、パケットを REJECT(拒否) し、"icmp-host-prohibited"を返します。
FORWARD チェイン (デフォルトポリシーは ACCEPT)
転送のパケットは、全て REJECT(拒否) し、"icmp-host-prohibited"を返します。
OUTPUT チェイン (デフォルトポリシーは ACCEPT)
OUTPUT チェインに関しては、ルールが存在しないため、デフォルトのポリシーが適用されま す。デフォルトのポリシーは ACCEPT なので、OUTPUT のパケットに関しては、全て許可され ます。
iptables 起動前
起動後
iptables 設定の編集。
$ sudo vi /etc/sysconfig/iptables # sample configuration for iptables service # you can edit this manually or use system-config-firewall # please do not ask us to add additional ports/services to this default configuration *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT ←追加 -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT ←追加 -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT
$ sudo systemctl restart iptables $ sudo iptables -nL -v Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 14 936 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80 ← 追加された 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443 ← 追加された 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT 9 packets, 1420 bytes) pkts bytes target prot opt in out source destination
再度テストページにアクセス。閲覧できるようになった。