努力したWiki

推敲の足りないメモ書き多数

ユーザ用ツール

サイト用ツール


documents:freebsd:freebsd-030

文書の過去の版を表示しています。


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

更に追加修正する。以下の例は、

  1. テーブル80 を作り、
  2. テーブル80 へ /etc/ipfw.table80 の内容を取込み、
  3. ルール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 に保存処理を書いておきましょう。
documents/freebsd/freebsd-030.1777568375.txt · 最終更新: by k896951

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki