/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