Origami Devices

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

Raspberry Pi と iptables (2)

いま自分の /etc/iptables/rules.v4 は今こんな感じになっています。SSH は 8022/tcp を使う、OpenVPN を使う、Fusion IP-Phone Smart に Asterisk から接続する、という前提でのフィルタルールです。

*filter
:INPUT ACCEPT [4652:603240]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [509:67851]
# BASIC
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type any -j ACCEPT
-A INPUT -p 50 -j ACCEPT
-A INPUT -p 51 -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# NetBIOS DROP without LOG
-A INPUT  -p tcp -m multiport --dports 135,137,138,139,445 -j DROP
-A INPUT  -p udp -m multiport --dports 135,137,138,139,445 -j DROP
-A OUTPUT -p tcp -m multiport --sports 135,137,138,139,445 -j DROP
-A OUTPUT -p udp -m multiport --sports 135,137,138,139,445 -j DROP
# Dropbox DROP without log
-A INPUT  -p udp --dport 17500 -j DROP
# BOOTP
-A INPUT -i eth0 -p udp --sport bootpc --dport bootps -j ACCEPT
# Service
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 433 -j ACCEPT
# -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8022 -j ACCEPT
-A INPUT -p udp --dport 1194 -j ACCEPT
# Asterisk
-A INPUT -p tcp -s 61.213.230.153 --dport 5060 -j ACCEPT
-A INPUT -p udp -s 61.213.230.153 --dport 5060 -j ACCEPT
-A INPUT -p udp -s 61.213.230.153 --dport 50600:50900 -j ACCEPT
# DROP AND LOG
-A INPUT -j LOG --log-level info --log-prefix iptables:DROP: ! -i lo -p tcp
-A INPUT -j DROP ! -i lo -p tcp
-A INPUT -j LOG --log-level info --log-prefix iptables:DROP: ! -i lo -p udp
-A INPUT -j DROP ! -i lo -p udp
# REJECT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
*nat
:PREROUTING ACCEPT [2394:272073]
:INPUT ACCEPT [1625:233719]
:OUTPUT ACCEPT [131:9942]
:POSTROUTING ACCEPT [131:9942]
-A POSTROUTING -o eth0 -s  192.168.253.0/24 -j MASQUERADE
#-A POSTROUTING -s 192.168.253.0/24 -o eth0 -j SNAT --to-source 192.168.0.XXX
COMMIT

(192.168.0.XXX は、Raspberry Pi 自体の IP アドレス(LAN内)です)

このフィルタルールでは、 DROP の記録をそのまま /var/log/messsage に書くことになります。(--log-level info にした場合、kern.info の扱いになるため)

DROP ログをほかのファイルに出力したい場合は、 /etc/rsyslog.conf を編集してください。別ファイルにした場合はローテートの設定をお忘れなく。

  • 「NetBIOS DROP without LOG」節

NetBIOS の内向き・外向き両方向のパケットを drop し、なおかつログに残さない設定です。LAN 内に Windows PC がある場合、NetBIOS 関連のパケットがよく飛んできて /var/log/messages を埋めかねないので、ここではそうしています。実際に設定するかはお好みでどうぞ。

  • Dropbox DROP without log」節

Dropbox が動作している PC が LAN 内にいる場合、同じく大量のパケットが飛んでくるので、ログに残さず Drop しています。Dropbox 側の設定で Dropbox の「基本設定」→「バンド幅」→「LAN 同期を有効にする」*1をオフにしておけば LAN 内にパケットをばらまくことはなくなりますが、LAN 同期を無効にできない環境の場合は必要になるでしょう。

NAT の 「-A POSTROUTING -o eth0 -s 192.168.253.0/24 -j MASQUERADE」で、IPマスカレードをやっています。ただし、フィルタ側にも「-A INPUT -p udp --dport 1194 -j ACCEPT」を書いておかないと外から 1194/udp の接続が通らないので忘れないようにしてください。

Raspbian の場合は SNAT でも MASQUERADE でもどちらも使えます。MASQUERADE のほうが一般的なので、そちらを使ったほうがよいでしょう。

61.213.230.153 に対してフィルタを開けているのは、これは Fusion IP-Phone Smart を使うことを前提としています。必ず相手先の SIP サーバに限定してフィルタを開けてください。最近は SIP を狙った不正なアクセスが大変多いので、これをやっておかないとかなり面倒なことになります。

  • SSH のポートについて

上記の例では SSH 用に 8022/tcp を使っています。22/tcp は気が遠くなるくらいに不正アクセスの試行が多いので、もはや外に向けて 22/tcp を開けておく必然性はないと思ったほうがいいです。可能であれば、もはや SSH のポートを直接外にさらすのはやめて、 OpenVPN を介するくらいのほうがちょうどいいのかもしれません。

*1:Dropbox v3.0.3 にて確認