文書の過去の版を表示しています。
目次
FreeBSDのIPFW2を使う 設定編
2026-05-01
思い違いをしていて、/usr/local/etc/rc.shutdown は実行されない場合がある。なので /etc/rc.shutdown.local へ移動する。
2026-04-30
まだ書いてなかったなと思い出して作成
https://docs.freebsd.org/en/books/handbook/firewalls/index.html#firewalls-ipfw
日本語の記述はまだない模様です。
設定後はFreeBSDのIPFW2を使う 運用編を参照してください。
これは何?
これは
- WebサイトにアクセスしてくるIPアドレスを
- HTTPサービスの前にBANするために
- IPFW2を使う
際の設定例です。
手順
/etc/rc.confへ追加1
/etc/rc.confに以下の2行を追加してIPFW2を有効にする。firewall_type=“open”はフルオープン状態の定義を指定している。
firewall_enable="YES" firewall_type="open"
追加したらOSを再起動する。IPFW2が有効な状態で起動される。
/etc/ipfw.rulesを作成
rootにスイッチして現在の定義を確認する。その後この内容をカスタムスクリプトになる /etc/ipfw.rules に書き出す。
root@bsdgate:~ # ipfw list 00100 allow ip from any to any via lo0 00200 deny ip from any to 127.0.0.0/8 00300 deny ip from 127.0.0.0/8 to any 00400 deny ip from any to ::1 00500 deny ip from ::1 to any 00600 allow ipv6-icmp from :: to ff02::/16 00700 allow ipv6-icmp from fe80::/10 to fe80::/10 00800 allow ipv6-icmp from fe80::/10 to ff02::/16 00900 allow ipv6-icmp from any to any icmp6types 1 01000 allow ipv6-icmp from any to any icmp6types 2,135,136 65000 allow ip from any to any 65535 count ip from any to any not // orphaned dynamic states counter 65535 deny ip from any to any root@bsdgate:~ # ipfw list > /etc/ipfw.rules
取得した /etc/ipfw.rules をテキストエディタで開いて、置換をかける。この例だと、行頭に“${fwcmd} add “を付与している。
- /etc/ipfw.rules
${fwcmd} add 00100 allow ip from any to any via lo0 ${fwcmd} add 00200 deny ip from any to 127.0.0.0/8 ${fwcmd} add 00300 deny ip from 127.0.0.0/8 to any ${fwcmd} add 00400 deny ip from any to ::1 ${fwcmd} add 00500 deny ip from ::1 to any ${fwcmd} add 00600 allow ipv6-icmp from :: to ff02::/16 ${fwcmd} add 00700 allow ipv6-icmp from fe80::/10 to fe80::/10 ${fwcmd} add 00800 allow ipv6-icmp from fe80::/10 to ff02::/16 ${fwcmd} add 00900 allow ipv6-icmp from any to any icmp6types 1 ${fwcmd} add 01000 allow ipv6-icmp from any to any icmp6types 2,135,136 ${fwcmd} add 65000 allow ip from any to any ${fwcmd} add 65535 count ip from any to any not // orphaned dynamic states counter ${fwcmd} add 65535 deny ip from any to any
更に追加修正する。以下の例は、
- テーブル80 を作り、
- テーブル80 へ /etc/ipfw.table80 の内容を取込み、
- ルール2000を定義してテーブル80に存在するIPアドレスからのパケットを破棄、
する処理を実施したもの。
- /etc/ipfw.rules
#!/bin/sh fwcmd="/sbin/ipfw" xargscmd="/usr/bin/xargs" ${fwcmd} -q flush ${fwcmd} -q table 80 create type addr ${fwcmd} table 80 flush ${xargscmd} ${fwcmd} table 80 add < /etc/ipfw.table80 ${fwcmd} add 00100 allow ip from any to any via lo0 ${fwcmd} add 00200 deny ip from any to 127.0.0.0/8 ${fwcmd} add 00300 deny ip from 127.0.0.0/8 to any ${fwcmd} add 00400 deny ip from any to ::1 ${fwcmd} add 00500 deny ip from ::1 to any ${fwcmd} add 00600 allow ipv6-icmp from :: to ff02::/16 ${fwcmd} add 00700 allow ipv6-icmp from fe80::/10 to fe80::/10 ${fwcmd} add 00800 allow ipv6-icmp from fe80::/10 to ff02::/16 ${fwcmd} add 00900 allow ipv6-icmp from any to any icmp6types 1 ${fwcmd} add 01000 allow ipv6-icmp from any to any icmp6types 2,135,136 ${fwcmd} add 02000 deny ip from "table(80)" to any ${fwcmd} add 65000 allow ip from any to any ${fwcmd} add 65535 count ip from any to any not // orphaned dynamic states counter ${fwcmd} add 65535 deny ip from any to any
作ったカスタムスクリプト /etc/ipfw.rules に権限設定する。
root@bsdgate:~ # ls -l /etc/ipfw* -rwxr-xr-x 1 root wheel 998 Apr 30 09:46 /etc/ipfw.rules root@bsdgate:~ # chmod 744 /etc/ipfw.rules root@bsdgate:~ # ls -l /etc/ipfw* -rwxr--r-- 1 root wheel 998 Apr 30 09:46 /etc/ipfw.rules root@bsdgate:~ #
テーブル80に読み込む初期ファイル /etc/ipfw.table80 を作成する。
root@bsdgate:~ # ls -l /etc/ipfw* -rwxr--r-- 1 root wheel 998 Apr 30 09:46 /etc/ipfw.rules root@bsdgate:~ # touch /etc/ipfw.table80 root@bsdgate:~ # ls -l /etc/ipfw* -rwxr--r-- 1 root wheel 998 Apr 30 09:46 /etc/ipfw.rules -rw-r--r-- 1 root wheel 0 Apr 30 09:56 /etc/ipfw.table80 root@bsdgate:~ #
/etc/rc.confへ追加2
/etc/rc.confに以下の1行を追加する。カスタムスクリプト /etc/ipfw.rules が実行されるようになる。
firewall_script="/etc/ipfw.rules"
追加したらOSを再起動して定義が反映された事を確認する。
root@bsdgate:~ # ipfw list 00100 allow ip from any to any via lo0 00200 deny ip from any to 127.0.0.0/8 00300 deny ip from 127.0.0.0/8 to any 00400 deny ip from any to ::1 00500 deny ip from ::1 to any 00600 allow ipv6-icmp from :: to ff02::/16 00700 allow ipv6-icmp from fe80::/10 to fe80::/10 00800 allow ipv6-icmp from fe80::/10 to ff02::/16 00900 allow ipv6-icmp from any to any icmp6types 1 01000 allow ipv6-icmp from any to any icmp6types 2,135,136 02000 deny ip from table(80) to any 65000 allow ip from any to any 65535 count ip from any to any not // orphaned dynamic states counter 65535 deny ip from any to any root@bsdgate:~ #
テーブル80の保存処理
OSを再起動/シャットダウンするとテーブル80に登録した内容が消えてしまうので、/etc/rc.shutdown.local に /etc/ipfw.table80 の保存処理を記述する。
- /etc/rc.shutdown.local
#!/bin/sh fwcmd="/sbin/ipfw" TABLE_FILE="/etc/ipfw.table80" ${fwcmd} table 80 list > ${TABLE_FILE}
作った /etc/rc.shutdown.local に権限設定する。
root@bsdgate:~ # chmod 744 /etc/rc.shutdown.local root@bsdgate:~ # ls -l /etc/rc.shutdown.local -rwxr--r-- 1 root wheel 101 Apr 30 06:55 /etc/rc.shutdown.local root@bsdgate:~ #
確認のため、ダミーのIPアドレスをテーブル80に登録してからOSを再起動する。
root@bsdgate:~ # ipfw table 80 add 192.168.0.0 added: 192.168.0.0/32 0 root@bsdgate:~ # ipfw table 80 list 192.168.0.0/32 0 root@bsdgate:~ # reboot
再起動後、テーブル80が復元されていることを確認する。
root@bsdgate:~ # ipfw table 80 list 192.168.0.0/32 0 root@bsdgate:~ # reboot
注意
- ルール65000を外すと基本的にすべてのアクセスが叩き落されるので、これを外す場合はSSHやhttpのようなサービスのアクセスに関してallowになるルール追加が必要です。
- /usr/local/etc/rc.shutdown はOS停止動に shutdown コマンドを使うと呼ばれるけど reboot コマンドを使った時は呼ばれない模様。なので /etc/rc.shutdown.local に保存処理を書いておきましょう。
