====== FreeBSD 11のipfwでパケットフィルタリング ======
WIP
===== 試した環境 =====
* FreeBSD 11.2-RELEASE-p7
* ipfw自体は相当昔から搭載されているので、かなり前のバージョンでも殆ど一緒だと思われる。
* FreeBSD 12.0-RELEASE-p4
===== ipfwサービスの有効化 =====
''/etc/rc.conf''に''firewall_enable''と、ファイヤウォールのルール設定''firewall_type''を追加する。ルール設定には以下の値が指定可能。
^ firewall_type ^ 意味 ^
| open | 全てのトラフィックを通過 |
| client | 自ホストのみを保護 |
| simple | 自ネットワークを保護 |
| closed | ループバックインタフェース以外のIPトラフィックを全て無効化 |
| workstation | ステートフルルールで自ホストのみを保護 |
| UNKNOWN | ファイアウォールのルールを読み込まない |
| ファイルパス | ファイアウォールのルールファイルのフルパス |
ここでの設定値の処理は''/etc/rc.firewall''スクリプト内で行われる。client, simple, workstationを指定した場合、追加で自ネットワークなどの設定が必要となるが、この時に使う変数名の解説などは全て同ファイル内に記載がある。
ひとまず''open''とし全パケットを通過させる。
# sysrc firewall_enable=YES
# sysrc firewall_type="open"
''firewall_type="open"''となっていることを再度確認のこと。ipfwのデフォルト設定は全パケット拒否なので、特にリモートで操作している場合に大変残念なことになる…。そして必ずシステムを再起動する。前述の通り、''firewall_type''の処理はrcスクリプトで行われるため、サービスの再起動ではopen設定が行われず、ipfwが起動したとたんに通信が遮断されてしまう。
# reboot
システム再起動後、''ipfw -a list''で以下のようなフィルタルールが表示されればおk。
# 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 3 216 allow ipv6-icmp from any to any ip6 icmp6types 2,135,136
65000 399 39044 allow ip from any to any
65535 0 0 deny ip from any to any
===== フィルタルールの設定 =====
==== ルールファイル ====
ファイルを用いたipfwのルール適用方法として、FreeBSDには2つの方法が用意されている。
=== firewall_type を使う方法 ===
冒頭の表にあるとおり、''firewall_type''にファイルパスを指定すると''rc.firewal''でルールファイルの読み込みが行われるようになる。
ルールファイルにはipfwのサブコマンドを記述する。
=== firewall_script を使う方法 ===
ファイアウォール設定スクリプト用の変数''firewall_script''にファイルパスを指定する。指定されたシェルスクリプトはrcスクリプト実行中に呼び出される。デフォルト値は''/etc/rc.firewall''が指定されており、システム標準のipfw用シェルスクリプトとなっている。
独自のシェルスクリプトを指定することで、ipfwのルール設定はもちろんのこと、他のファイアウォールの設定が行えるようになる。
===== 参考サイト =====
* [[https://www.freebsd.org/doc/handbook/firewalls-ipfw.html|30.4. IPFW]]
* [[http://www.usupi.org/info/ipfw.html|How to IPFW]]