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内)です)
- iptables の DROP ログ
このフィルタルールでは、 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 同期を無効にできない環境の場合は必要になるでしょう。
- OpenVPN を使う場合
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 のほうが一般的なので、そちらを使ったほうがよいでしょう。
- Asterisk を使う場合
61.213.230.153 に対してフィルタを開けているのは、これは Fusion IP-Phone Smart を使うことを前提としています。必ず相手先の SIP サーバに限定してフィルタを開けてください。最近は SIP を狙った不正なアクセスが大変多いので、これをやっておかないとかなり面倒なことになります。
- SSH のポートについて
上記の例では SSH 用に 8022/tcp を使っています。22/tcp は気が遠くなるくらいに不正アクセスの試行が多いので、もはや外に向けて 22/tcp を開けておく必然性はないと思ったほうがいいです。可能であれば、もはや SSH のポートを直接外にさらすのはやめて、 OpenVPN を介するくらいのほうがちょうどいいのかもしれません。