IPFilter メモ

IPFW ( 以後 ipfw ) もなんとなく動作原理がわかったので次は IPFilter ( 以後 ipf ) を使ってみます。
Web 上では ipfw より ipf のが動作も早いし、高性能らしいです。
そんなに知識がないから使いこなせないだろうけど。


まずは ipf がカーネルに読み込まれているか確認します。

$ kldstat

ipf を使った事 ( 設定した事 ) が無ければ読み込まれていないはずです。
また、先日の ipfw のエントリーを参考にした方は ipfw が読み込まれていないかどうかも確認してください。読み込まれている場合は /etc/rc.conf から該当箇所をコメントアウトして再起動してください。


次に /usr/local/etc/ipf.rule.sample の作成です。
作成するには下記のコマンドをタイプします。

$ perl mkfilters | grep -v inet6 > /usr/local/etc/ipf.rules.sample


/usr/local/etc/ipf.rules.sample が作成されていることを確認したらひとまず中身を見てみることにします。

$ less /usr/local/etc/ipf.rules.sample


多分下記のような感じで出力されていると思います。

#
# The following routes should be configured, if not already:
#
# route add 192.168.1.10 localhost 0
#
block in log quick from any to any with ipopts
block in log quick proto tcp from any to any with short
pass out on rl0 all head 150
block out from 127.0.0.0/8 to any group 150
block out from any to 127.0.0.0/8 group 150
block out from any to 192.168.1.10/32 group 150
pass in on rl0 all head 100
block in from 127.0.0.0/8 to any group 100
block in from 192.168.1.10/32 to any group 100


これを元にしてファイアウォールの設定を行います。
まずはネットワーク構成の確認から。

プライベートネットワーク 192.168.1.0/24
ルーター 192.168.1.1
サーバ 192.168.1.10
クライアント DHCP


下記が上記の内容を踏まえた上で作成したルールセットです。

#
# The following routes should be configured, if not already:
#
# route add 192.168.1.10 localhost 0
#
block in log quick from any to any with ipopts
block in log quick proto tcp from any to any with short

pass out on rl0 all head 150
block out from 127.0.0.0/8 to any group 150
block out from any to 127.0.0.0/8 group 150
block out from any to 192.168.1.10/32 group 150

pass out quick proto tcp/udp from 192.168.1.10/32 to any keep state group 150
block out quick all group 150

pass in on rl0 all head 100
block in from 127.0.0.0/8 to any group 100
block in from 192.168.1.10/32 to any group 100

block in quick from 10.0.0.0/8 to any group 100
block in quick from 172.16.0.0/12 to any group 100
block in quick from 0.0.0.0/8 to any group 100
block in quick from 169.254.0.0/16 to any group 100
block in quick from 224.0.0.0/4 to any group 100
block in quick from 240.0.0.0/4 to any group 100

# HTTP
pass in quick proto tcp from any to 192.168.1.10/32 port = 80 group 100
# HTTPs
pass in quick proto tcp from any to 192.168.1.10/32 port = 443 group 100
# SMTPs
pass in quick proto tcp from any to 192.168.1.10/32 port = 465 flags S/SA group 100
# POP3s
pass in quick proto tcp from any to 192.168.1.10/32 port = 995 flags S/SA group 100
# Subversion with SSH
pass in quick proto tcp from any to 192.168.1.10/32 port = 22 flags S/SA group 100
# FTP
pass in quick proto tcp from any to 192.168.1.10/32 port = 20 flags S/SA keep state group 100
# FTP date
pass in quick proto tcp from any to 192.168.1.10/32 port = 21 flags S/SA keep state group 100
# NTP
pass in quick proto tcp from any to 192.168.1.10/32 port = 123 flags S/SA group 100

# SSH
pass in quick proto tcp from 192.168.1.0/24 to 192.168.1.10/32 port = 5622 keep state flags S/SA group 100
# SMTP
pass in quick proto tcp from 192.168.1.0/24 to 192.168.1.10/32 port = 25 flags S/SA group 100
# POP3
pass in quick proto tcp from 192.168.1.0/24 to 192.168.1.10/32 port = 110 flags S/SA group 100
# IMAP4
pass in quick proto tcp from 192.168.1.0/24 to 192.168.1.10/32 port = 143 flags S/SA group 100

# DNS
pass in quick proto tcp/udp from 192.168.1.0/24 to 192.168.1.10/32 port = 53 flags S/SA group 100

block in log quick all group 100

# Loopback
pass in quick on lo0 all
pass out quick on lo0 all


基本的に出て行くポートは制限せずに、入ってくるポートを精査します。
ポリシーとして外部に公開するのは下記の通りです。

HTTP 80
HTTPs 443
SMTPs 465
POP3s 995
SVN with SSH 22


SVN with SSHSubversion レポジストリを公開する際、匿名アクセスは HTTP か HTTPs で、コミッターは SSH で作業する為です。
もしかしたら HTTPs でまとめる可能性もありまりますが、その時は SSH を完全に塞ぎ、なおかつ listen ポートを変更して外部に管理用ポートを空ける、ということになると思います。


ipfw の時もそうでしたが、前段にルータを構えているのでよっぽどの事が無い限りはクラックされる事はないかと思います。
事実ルータ越えでクラックされたとしたらネットワークごと物理的に遮断してしまった方が被害はそれ以上出ませんし、何より個人サーバをクラックするコストに対して見返りが少ないと思います。


かと言ってセキュリティに気を配らないのは・・・とジレンマに陥りそうですが、あくまで自宅サーバは自己責任であり、且つ自分の思い通りに出来ます。
結局は自分の意識の問題なのかもしれませんね。