/etc/network/if-pre-up.d/firewall はもういらない – iptables-persistent の使い方

Linux でのファイアウォール設定は iptables で行うことが多いですが、Linux ディストロの再起動時に毎回ファイアウォールルールを有効化するには従来はスクリプトファイルが必要でした。しかし、現在では Debian/Ubuntu では iptables-persistent が使えるので、シェルスクリプト /etc/network/if-pre-up.d/firewall が必要なくなります。

実行環境 Ubuntu 14.04 LTS

I. IPv4 での iptables のルールセットの例

以下は IPv4 での iptables の一例です。


$ sudo vim /etc/iptables/tmpv4

*filter

# すべてのループバック (lo0) トラフィックを許可し、lo0 からでない localhost へのトラフィックを拒否する。
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT

# ping を許可。
-A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT

# SSH 接続を許可。
-A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT

# どこからでも HTTP および HTTPS 接続を許可。
-A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT

# 確立された接続からのインバウンドトラフィックを許可。
# ICMP エラーリターンを含む。
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 拒否されたインバウンドトラフィックをログに記録する。
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables_INPUT_denied: " --log-level 7

# その他のインバウンドトラフィックはすべて拒否する。
-A INPUT -j REJECT

# 転送トラフィックをログに記録する。
-A FORWARD -m limit --limit 5/min -j LOG --log-prefix "iptables_FORWARD_denied: " --log-level 7

# 転送トラフィックをすべて拒否する。
-A FORWARD -j REJECT

COMMIT

II. IPv6 での iptables のルールセットの例

IPv6での接続も許可するので、以下に IPv6 での iptables (ip6tables) の一例を示します。


$ sudo vim /etc/iptables/tmpv6

*filter

# すべてのループバック (lo0) トラフィックを許可し、lo0 からでない localhost へのトラフィックを拒否する。
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -s ::1/128 -j REJECT

# ICMP を許可。
-A INPUT -p icmpv6 -j ACCEPT

# どこからでも HTTP および HTTPS 接続を許可。
-A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT

# 確立された接続からのインバウンドトラフィックを許可。
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 拒否されたインバウンドトラフィックをログに記録する。
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "ip6tables_INPUT_denied: " --log-level 7

# その他のインバウンドトラフィックはすべて拒否する。
-A INPUT -j REJECT

# 転送トラフィックをログに記録する。
-A FORWARD -m limit --limit 5/min -j LOG --log-prefix "ip6tables_FORWARD_denied: " --log-level 7

# 転送トラフィックをすべて拒否する。
-A FORWARD -j REJECT

COMMIT

III. iptables ルールセットの保存

I. II.で作成した iptables のルールセットを有効化します。


$ sudo iptables-restore < /etc/iptables/tmpv4
$ sudo ip6tables-restore < /etc/iptables/tmpv6

IV. iptables の確認

有効化した iptables を確認します。


$ sudo iptables -L

Chain INPUT (policy DROP)
target     prot opt source               destination
fail2ban-ssh  tcp  --  anywhere             anywhere             multiport dports ssh
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  127.0.0.0/8          anywhere             reject-with icmp-port-unreachable
ACCEPT     icmp --  anywhere             anywhere             state NEW icmp echo-request
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh state NEW
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http state NEW
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https state NEW
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables_INPUT_denied: "
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain FORWARD (policy DROP)
target     prot opt source               destination
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables_FORWARD_denied: "
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain fail2ban-ssh (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

$ sudo ip6tables -L

Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     all      anywhere             anywhere
REJECT     all      localhost            anywhere             reject-with icmp6-port-unreachable
ACCEPT     ipv6-icmp    anywhere             anywhere
ACCEPT     tcp      anywhere             anywhere             tcp dpt:http state NEW
ACCEPT     tcp      anywhere             anywhere             tcp dpt:https state NEW
ACCEPT     all      anywhere             anywhere             state RELATED,ESTABLISHED
LOG        all      anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "ip6tables_INPUT_denied: "
REJECT     all      anywhere             anywhere             reject-with icmp6-port-unreachable

Chain FORWARD (policy DROP)
target     prot opt source               destination
LOG        all      anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "ip6tables_FORWARD_denied: "
REJECT     all      anywhere             anywhere             reject-with icmp6-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

V. iptables-persistent のインストール

この時点で iptables によるファイアウォールは確立されていますが、Linuxを再起動したときにその設定は保存されません。

再起動後にも有効にするために、従来はシェルスクリプトを作成していたと思います。(以下は一例。IPv4 のみ)


$ sudo vim /etc/network/if-pre-up.d/firewall

#!/bin/sh
/sbin/iptables-restore < /etc/iptables/tmpv4

しかし、現在では Debian/Ubuntu に iptables-persistent のパッケージが用意されたので、これを用いることができます。

まずは同パッケージをインストールします。


$ sudo apt-get install iptables-persistent

インストール時に、現在の IPv4、IPv6 のファイアウォールルールを保存するかどうか聞かれるので、yes と回答しておきます。
すると、現在の設定が保存され、次回サーバー起動時にその設定が維持されます。

なお、保存先のファイルは、


/etc/iptables/rules.v4
/etc/iptables/rules.v6

です。

VI. 一時ファイルの削除

最初に作成した、ルールセットファイル


/etc/iptables/tmpv4
/etc/iptables/tmpv6

は必要ないので、削除します。


$ sudo rm /etc/iptables/tmpv4
$ sudo rm /etc/iptables/tmpv6