FreeBSDのファイアーウォール
はじめに
FreeBSDではIPFWを用いてパケットフィルタリングを行うことが可能である。利用方法についてこの記事で書いていく(備忘録的な意味合いが強い)
IPFWの準備
FreeBSDのインストール時に通常はipfwは入っているのでインストールの話は触れません。
# ipfw -h
このコマンドでCommand not found
とでなければipfwはすぐに使えます。もしなかった場合はカーネル再構築の必要があるのでここ等を参考にしてインストールしてください。
IPFWを利用するには/etc/rc.conf
にIPFWを利用する記述を行います。
/etc/rc.conf
にfirewall_enable="YES"
を記述します。
# vi /etc/rc.conf keymap="jp.106.kbd" ifconfig_re0="DHCP" ifconfig_re0_ipv6="inet6 accept_rtadv" sshd_enable="YES" apache24_enable="YES" firewall_enable="YES" # Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable dumpdev="AUTO"
IPFWの起動と終了
- IPFWの起動方法
# /etc/rc.d/ipfw start
- IPFWの停止方法
# /etc/rc.d/ipfw stop
- IPFWの再起動
# /etc/rc.d/ipfw restart
フィルタの見方
/etc/rc.conf
の書き込み時にfirewall_enable
のみの書き込みをするとフィルタリングの設定は/etc/rc.firewall
から引っ張ってきます。
デフォルトの設定はこのようになっています。
00100 0 0 allow ip from any to any via lo0 00200 0 0 deny ip from any to 127.0.0.0/8 00300 0 0 deny ip from 127.0.0.0/8 to any 00400 0 0 deny ip from any to ::1 00500 0 0 deny ip from ::1 to any 00600 2 136 allow ipv6-icmp from :: to ff02::/16 00700 0 0 allow ipv6-icmp from fe80::/10 to fe80::/10 00800 0 0 allow ipv6-icmp from fe80::/10 to ff02::/16 00900 0 0 allow ipv6-icmp from any to any ip6 icmp6types 1 01000 0 0 allow ipv6-icmp from any to any ip6 icmp6types 2,135,136 65535 210437 31011115 deny ip from any to any
1フィールド目がフィルタの番号、4フィールド目がルールになります。番号の小さい順にルールが適用されていき最後の65535番のルールで残ったパケットを拒否します。
デフォルトの設定だと他の計算機からのアクセスを拒絶します。
フィルタの設定(既に起動しているipfwにルールを追加する)
ipfwが起動している場合はipfwコマンドを利用して新規にルールを追加していきます。
コマンドは下記のようなフォーマットで作成していきます。
# ipfw add 300 allow ip from 133.68.18.100 to any ipfw (命令) (番号) (許可/拒否) (対象)
ルールを追加する際は命令をaddに、ルールを消去する際は命令をdeleteにしていくという感じになります。
fromは送信元の指定、toは送信先への指定となります
- パケット許可のルール例
# ipfw add 350 allow ip from 133.68.18.100 to any # ipfw add 450 allow tcp from 133.20.11.3 to 133.20.11.3 # ipfw add 65000 allow ip from any to any
- パケット拒絶のルール例
# ipfw add 350 deny ip from 133.68.18.100 to any # ipfw add 450 deny tcp from 133.68.20.11.3 to any
フィルタの設定(ipfwの起動前にルールを設定する)
この場合は/etc/rc.firewall
に記述する必要があります。/etc/rc.firewall
はシェルスクリプトなので、上のコマンドを記述すれば問題ありません。
# vi /etc/rc.firewall setup_loopback setup_ipv6_mandatory ${fwcmd} add 1100 deny ip from 133.68.18.105 to any ${fwcmd} add 1200 allow tcp from any to any
デフォルトのファイルにfwcmd="/sbin/ipfw -q"
となっていたのでこんな記述方式になります。
書き込んだ後、ipfwを再起動すると
# ipfw -a list 00100 0 0 allow ip from any to any via lo0 00200 0 0 deny ip from any to 127.0.0.0/8 00300 0 0 deny ip from 127.0.0.0/8 to any 00400 0 0 deny ip from any to ::1 00500 0 0 deny ip from ::1 to any 00600 0 0 allow ipv6-icmp from :: to ff02::/16 00700 0 0 allow ipv6-icmp from fe80::/10 to fe80::/10 00800 0 0 allow ipv6-icmp from fe80::/10 to ff02::/16 00900 0 0 allow ipv6-icmp from any to any ip6 icmp6types 1 01000 0 0 allow ipv6-icmp from any to any ip6 icmp6types 2,135,136 01100 0 0 deny ip from 133.68.18.105 to any 01200 59 4520 allow tcp from any to any 65535 629543 92603950 deny ip from any to any
と設定されています。