FreeBSDのファイアーウォール

はじめに

FreeBSDではIPFWを用いてパケットフィルタリングを行うことが可能である。利用方法についてこの記事で書いていく(備忘録的な意味合いが強い)

IPFWの準備

FreeBSDのインストール時に通常はipfwは入っているのでインストールの話は触れません。

# ipfw -h

このコマンドでCommand not foundとでなければipfwはすぐに使えます。もしなかった場合はカーネル再構築の必要があるのでここ等を参考にしてインストールしてください。

IPFWを利用するには/etc/rc.confIPFWを利用する記述を行います。

/etc/rc.conffirewall_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
# /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

と設定されています。