FreeBSD 11のipfwでパケットフィルタリング

WIP

  • FreeBSD 11.2-RELEASE-p7
    • ipfw自体は相当昔から搭載されているので、かなり前のバージョンでも殆ど一緒だと思われる。
  • FreeBSD 12.0-RELEASE-p4

/etc/rc.conffirewall_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のルール設定はもちろんのこと、他のファイアウォールの設定が行えるようになる。

  • freebsd/freebsd_11_ipfw.txt
  • 最終更新: 2020-03-23 08:01
  • by Decomo