iptables

Linux に実装されたパケットフィルタリング機能。
パケットフィルタリングはネットワーク上に流れているパケットをそのパケットのヘッダー情報によって受け取りを拒否したり、破棄したり、通過させるもの。

Man page of IPTABLES

以降「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 iptablesiptables.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 起動前

f:id:hirose-test:20190721125546j:plain

起動後

f:id:hirose-test:20190721125648j:plain

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

再度テストページにアクセス。閲覧できるようになった。

f:id:hirose-test:20190721125546j:plain

/* -----codeの行番号----- */