Origami Devices

USB充電本作ったりしてます。

Raspberry Pi と iptables

  • Raspbian には iptables は入っている

Raspbian には iptables が標準で入りますが、RHEL 系とは違って /etc/sysconfig/iptables に相当するものがありません。

起動時点で iptables のルールを設定するためには、iptables-persistent というパッケージを別途インストールする必要があります。 /etc/init.d の下に専用のスクリプトを自分で作って突っ込んでいる場合はそれはそれでいいですが…

ここでは、Debian の流儀でちゃんとやります。

まず、現在 iptables のルールが設定されているかを確認しましょう。

# sudo /sbin/iptables -L

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

こんな表示だったら、いま設定されているルールはありません。既にルールが設定されている場合は、どこで設定したかを思い出してください。 /etc/rc.local あたりに何か書いてあるかもしれません。

さて、まずは iptables-persistent をインストールします。

# sudo aptitude install iptables-persistent

インストール時点で「Save current IPv4 rules?」「Save current IPv6 rules?」と聞かれますが、どちらも Yes で答えてください。

あとは /etc/iptable/rule.v4 および /etc/iptables/rule.v6 を書き換えるだけです。

iptables-persistent が正常に起動しない場合

# sudo /etc/init.d/iptables-persistent restart
[FAIL] Loading iptables rules... IPv4... IPv6...failed.

rules.v4 または rules.v6 のどちらかに記述エラーがあると思われます。ただ、このメッセージからは rules.v4 なのか rules.v6 なのかどちらかわかりません。

/etc/init.d/iptables-restore は、ルールの読み込みを /sbin/iptables-restore と /sbin/ip6tables-restore にやらせています。このどちらかでエラーが起きていると上記の表示が出るので、 --test と --verbose をオプションに付けてテストさせ切り分けをしましょう。

# /sbin/iptables-restore  --test --verbose < /etc/iptables/rules.v4
# /sbin/ip6tables-restore --test --verbose < /etc/iptables/rules.v6 
# /sbin/iptables-restore  --test --verbose < /etc/iptables/rules.v4
# Generated by iptables-save v1.4.14 on Mon Dec 22 14:23:59 2014
iptables-restore: line 2 failed

--test --verbose オプションを付けると、1行ずつ実行しながらエラー時にそこで表示をしてくれます。ちなみに、読み込ませたルールファイルのコメント行も表示してきます。上記の例では、2行目に何かいるということです。このときは2行目だけ改行コードがなぜか CRLF になってしまっていて、それが原因でエラーになってしまっていました。iptables のルールファイルは、行末に CRLF がいるとエラーになるのです…

iptables は他にも「空行は許されるが、スペース文字しかない行は許されない」などもありますので、スペース文字が変なところに隠れていないか気を付けてください。

# /sbin/iptables-restore  --test --verbose < /etc/iptables/rules.v4
# Generated by iptables-save v1.4.14 on Mon Dec 22 14:23:59 2014
Flushing chain `INPUT'
Flushing chain `FORWARD'
Flushing chain `OUTPUT'
# BASIC
# Service
# Asterisk
# LOG
# DROP AND REJECT
# Completed on Mon Dec 22 14:23:59 2014
# Generated by iptables-save v1.4.14 on Mon Dec 22 14:23:59 2014
Flushing chain `PREROUTING'
Flushing chain `INPUT'
Flushing chain `OUTPUT'
Flushing chain `POSTROUTING'
# Completed on Mon Dec 22 14:23:59 2014

うまくいけば、コメント行と、ルールのフラッシュ内容がこんな形で出てきます。あとはもう一度、 sudo /etc/init.d/iptables-persistent restart してあげれば大丈夫でしょう。