セキュリティ対策 - ファイアウォール IP Firewall - 基本設定

 クラウディア
1. 概要
2. カーネルの再構築
3. /etc/rc.conf 設定
4. タイプ
5. type ハ script ニ非ズ

1. 概要

 「IP Firewall」は、

/sbin/ipfw
 に存在します。  つまり、システムプログラムなので、特にインストールの必要はありませんが、うまく起動するためには、いくつかの基本設定が必要になります。

2. カーネルの再構築

 「ipfw」をうまく起動するには、カーネルの再構築が必要になります。  実は、これをやらないと起動できないと思っていましたが、「FreeBSD 12.4 RELEASE」で、試してみたところ、「ipfw」自体は、「/etc/rc.conf」で設定してやれば、動作しますが。  以下に述べる、カーネル再構築を行っていないと、「なぜか『IPv6』が制御できているように見えない」とか「デフォルトクローズであるため、コンソールからでないと操作が危険」などの問題が発生します。  なので、ここは、ぜひカーネルの再構築を行っておくべきです。  4つのオプションを設定します。  下記のオプションを定義することで、初めて「ipfw」に対する操作が有効になります(何度も言うが、起動だけであれば構わないが、困ったことになる)。

options IPFIREWALL
 下記を定義すると通信のログを取ることができます。

options IPFIREWALL_VERBOSE
 下記は上記でログを有効にしたとき、ログが大量に出力されることを防ぐためにあるそうです。  ここで定義した(単位がわかりませんが)量にログが達した場合、ログの出力が停止するとのこと。  出力が停止したら、コマンドで、ログの量をリセットしてやる必要があるそうです。  よって、この定義は有効にしない方がよさそうです。

options IPFIREWALL_VERBOSE_LIMIT=10
 「ipfw」のデフォルトの動作では、すべてのパケットを「deny」するそうで、これを定義するとデフォルトの動作が「allow」になるそうです。  これは気をつける必要があるようで、下記の定義を有効にするか、後で示す、もう一つの方法で、パケットを通過させるようにしておかないと、ファイアウォールを有効にして起動したら、自分自身のパケットもふさいでしまって何もできない状態に陥ることになります。

options IPFIREWALL_DEFAULT_TO_ACCEPT
 ということで、わたしのお勧めは、下記の状態です。

options IPFIREWALL
options IPFIREWALL_VERBOSE
#options IPFIREWALL_VERBOSE_LIMIT=10
options IPFIREWALL_DEFAULT_TO_ACCEPT
 オプションを設定したら、カーネルをコンパイルしてインストールします。  カーネル名を「HOGE」(カーネル名は大文字が慣習)とすれば。  コンパイル。

cd /usr/src
make buildkernel KERNCONF=HOGE
 インストール。

cd /usr/src
make installkernel KERNCONF=HOGE
 それぞれ、大量にログを表示出力しますし、結構時間がかかります。  インストールが終れば、下記のコマンドで、再起動してやれば、新しいカーネルが有効になります。

shutdown -r now
 まんがいち、新しいカーネルで起動できない場合は、「boot」のオプションで 3 を入力します。  コマンド入力モードになりますので、プロンプトが表示されたら

boot kernel.old
 で、ひとつ前のカーネルで起動することができます。

3. /etc/rc.conf 設定

 カーネルの構築までできたら、「/etc/rc.conf」を編集してファイアウォールを有効にし、念のため、タイプを設定します。  「root」ユーザ権限で。

sysrc firewall_enable=YES
sysrc firewall_type=open
 これで、下記の2行が追加されます。

firewall_enable="YES"
firewall_type="open"
 これで、起動時にファイアウォールが有効になり、デフォルトの動作を「allow」にします。  ここでいったんファイアウォールを起動してみます。

$ service ipfw start
Flushed all rules.
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 ip6 icmp6types 1
01000 allow ipv6-icmp from any to any ip6 icmp6types 2,135,136
65000 allow ip from any to any
Firewall rules loaded.

4. タイプ

 「/etc/rc.conf」の

firewall_enable="YES"
firewall_type="タイプ"
 には、下記のものがあるようです(参考サイトのまま)。
 設定値     意味     備考 
open すべてのトラフィックを渡します
client このマシンのみを保護します
simple ネットワーク全体を保護します
closed ループバックインターフェイスを除いて、IPトラフィックを完全に無効にします
workstation ステートフルルール(なんじゃそれは?)を使用してこのマシンのみを保護します
UNKNOWN ファイアウォールルールの読み込みを無効にします ※1
filename ファイアウォールルールセットを含むファイルのフルパス

 ※1 設定値を設定しない(デフォルト)場合はこれ(UNKNOWN)になるようです。

 参考サイトでは、すべてのタイプを試してみているようですが・・・。
 わたしは、「open」「closed」「UNKNOWN(設定なし)」を試してみました(コマンドの意味は後述)。

 「open」


$ ipfw -aN 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 localhost
00500    0      0 deny ip from localhost 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 icmp6types 1
01000    0      0 allow ipv6-icmp from any to any icmp6types 2,135,136
65000    0      0 allow ip from any to any
65535 3144 492607 allow ip from any to any
 「closed」

$ ipfw -aN 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 localhost
00500    0      0 deny ip from localhost 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 icmp6types 1
01000    0      0 allow ipv6-icmp from any to any icmp6types 2,135,136
65000    0      0 deny ip from any to any
65535 3144 492607 allow ip from any to any
 「UNKNOWN(設定なし)」

$ ipfw -aN list
00100    2    160 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 localhost
00500    0      0 deny ip from localhost 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 icmp6types 1
01000    0      0 allow ipv6-icmp from any to any icmp6types 2,135,136
65535 1289 160589 allow ip from any to any
 この時点で、「firewall_type」は、ルール「65000」に影響を与えていることがわかります。  カーネル構築時に設定した「IPFIREWALL_DEFAULT_TO_ACCEPT」は、ルール「65535」(最大の番号)に影響を与えていることがわかります。  フィルタのチェックは若い順にチェックします。  「deny」は、「200」~「500」しかないので、「500」まですり抜けてきたものは、最後の「65535」によって、判断されます。  基本的に、ループバックアドレスは、すべて通しています。

5. type ハ script ニ非ズ

 さて、今回(2023年1月13日)、本章を書き直すにあたって、勘違いしかけたことがあります。  「/etc/rc.conf」に設定する項目に

firewall_type="..."
firewall_script="..."
 ちゅうのがありまして。  以前のわたしの記述で

firewall_type="open"
firewall_type="/etc/firewall.conf"
 と書いているのがあちこちにあります。  「わわ、これは」

firewall_type="open"
firewall_script="/etc/firewall.conf"
 「と書き間違えていたか・・・」と思ったのですが。  さに非ず。

firewall_script="..."
 ちゅうのは、「ipfw」起動時のスクリプトだそうでありまして。  省略している場合は

/etc/rc.firewall
 を使用することになっています。  これは、「FreeBSD 12.4 RELEASE」であれば

/etc/rc.d/ipfw
 の下記で見ることができます。

        # set the firewall rules script if none was specified
        [ -z "${firewall_script}" ] && firewall_script=/etc/rc.firewall
 「/etc/rc.firewall」は、実行権限はないですが、シェバンがついていまして、なんかうまいことやってスクリプトとして実行しているようです。  これに対して

firewall_type="..."
 は、前項で掲載しているもの以外の値が設定されている場合は、それをファイルとみなして、そのファイル内に記述してある、「ipfw」のコマンドを実行するのであります。  なので、

touch /usr/local/etc/firewall.conf
sysrc firewall_type=/usr/local/etc/firewall.conf
service ipfw restart
 としてやれば、「firewall_type」設定なしの状態になります。  以降は、後述する内容で、設定したいルールを

/etc/rc.d/ipfw
 に記述しては、「ipfw」を再起動してやればいいことになります。  以前に書いた記事で

firewall_type="open"
firewall_type="/etc/firewall.conf"
 と書いてあるような場合、「firewall_type」の設定が降着優先で書き変わって、「/etc/firewall.conf」を使用しているわけです。
ハイスピードプラン世界最大級のオンライン英会話EF English Liveメンズミレット【usus ウズウズ】マイニングベースPoint anytime