ファイアーウォール構築メモ(ipfw + natd)

2001年11月 暫定版

はじめに

目的
内部LANのどのマシンからも、不自由なく外部にアクセスが可能で 外部から、内部のLANにはアクセスできない。
また、外側から見ると、全てのアクセスはファイアウォールのマシンから来たように見える
・・・というような、ファイアーウォールを作るんだぁ
資料
内側用NICed0  211.5.xxx.77
外側用NICrl0   192.168.yyy.77
OSFreeBSD 4.4-RELEASE

まずは、カーネルの再構築

カーネルの設定ファイルをコピーする
# cd /usr/src/sys/i386/conf
# cp GENERIC SERABI   何でもいいのですが、今回は自分のホスト名にしました。
ipfwを有効にするオプションを追加
# vi SERABI
options IPFIREWALL       ipfw を有効にする
options IPFIREWALL_VERBOSE syslogdを通じてパケットログを取れるようになります
options IPDIVERT        NATを有効にする
カーネルの再構築
# /usr/sbin/config SERABI
# cd /usr/src/sys/compile/SERABI
# make depend
# make
# make install
# reboot

/etc/rc.confを設定

NATが働くようにする
gateway_enable="YES"
natd_enable="YES"
natd_interface="ed0"
natd_flags="-f /etc/natd.conf"   何でもいいのですが、/etc/natd.conf を定義ファイルにします。
ipfwが働くようにする
firewall_enable="YES"
firewall_script="/etc/rc.firewall"
firewall_type="simple"
ネットワークの定義
network_interfaces="ed0 rl0 lo0"
ifconfig_rl0="inet 192.168.yyy.2 netmask 255.255.255.0"
ifconfig_ed0="inet 211.5.xxx.67 netmask 255.255.255.224"
defaultrouter="211.5.xxx.65"
hostname=" serabi.XXX.ne.jp"

/IPフィルターのルールを定義

ポリシーを決める
・内側からのアクセスは全て許す
・外側からのアクセスは全て許さない
・pingは、どこからどこへでも許可
  ・外部からもSSHでは、ログインできるようにしたい(これはnatdの設定)
/etc/rc.firewall の定義
/etc/rc.firewallから、/etc/rc.conf の firewall_type に指定した、エントリを探します。
独自エントリを作成することも可能ですが、今回は、既存のsimpleエントリを書き換えて しまいました。
独自エントリを作成する場合には、etc/rc.firewallから、/etc/rc.conf の firewall_typeの 修正も忘れずに。
[Ss][Ii][Mm][Pp][Ll][Ee])
        ############
        # This is a prototype setup for a simple firewall.  Configure this
        # machine as a named server and ntp server, and point all the machines
        # on the inside at this machine for those services.
        ############

        # set these to your outside interface network and netmask and ip
        oif="ed0"
        onet="211.5.xxx.65"
        omask="255.255.255.224"
        oip="211.5.xxx.77"

        # set these to your inside interface network and netmask and ip
        iif="rl0"
        inet="192.168.yyy.0"
        imask="255.255.255.0"
        iip="192.168.yyy.77"

        # Network Address Translation.  This rule is placed here deliberately
        # so that it does not interfere with the surrounding address-checking
        # rules.  If for example one of your internal LAN machines had its IP
        # address set to 192.0.2.1 then an incoming packet for it after being
        # translated by natd(8) would match the `deny' rule above.  Similarly
        # an outgoing packet originated from it before being translated would
        # match the `deny' rule below.
        case ${natd_enable} in
        [Yy][Ee][Ss])
                if [ -n "${natd_interface}" ]; then
                        ${fwcmd} add divert natd all from any to any via ${natd_interface}
                fi
                ;;
        esac

        # Allow IP fragments to pass through
        ${fwcmd} add pass all from any to any frag

	#もうすでに、確定しているTCPセッションは許可
        ${fwcmd} add pass tcp from any to any established

	#ping は どこからどこへでも許可
        ${fwcmd} add pass icmp from any to any

	#sshでの接続は、どこからでも許可
        ${fwcmd} add pass tcp from any to any 22

	#外側NICからやってきた接続要求は全部断る
        ${fwcmd} add deny tcp from any to any in via ed0 setup

	#上記以外のIPパケは、なんでもオッケー
        ${fwcmd} add pass ip from any to any

        ;;
/etc/natd.confの設定
log no
deny_incoming yes
redirect_port tcp 192.168.yyy.zzz:22 22   F/W内側でサービスするホストのIP(22はssh)
interface ed0

設定の確認

ルールリストとカウンタの表示
   # ipfw -a list

   00100    8570     450856 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 2659991 1734996503 divert 8668 ip from any to any via ed0
   00500 5123779 3443355159 allow tcp from any to any established
   00600     648     811296 allow ip from any to any frag
   00700    2547     970898 allow icmp from any to any
   00800     308      16488 allow tcp from any to any 22
   00900     127       6604 deny tcp from any to any in recv ed0 setup
   01200   78233    6125351 allow ip from any to any
   65535       3        144 deny ip from any to any

注意

ここに書いてある内容は、サンプルであり、最も簡単な例を書いたものです。
この例の場合は、natd がいくつかの防御を受け持つことになります。
natd を利用しない場合、もっと細かくルールを定義する必要があるでしょう。

例えば、上記の例では 01200 番のルールで、IPパケットを全て通していますが、
この行を抜くだけで、不必要なものは通らない、ガチガチの firewall になります
但し、DNSなども通らなくなるので不便です(;;)
そのようなものは、ちゃんと記述して通してあげます。

不必要なものを通さない例
   # ipfw -a list

   00100    8570     450856 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 2659991 1734996503 divert 8668 ip from any to any via ed0
   00500 5123779 3443355159 allow tcp from any to any established
   00600     648     811296 allow ip from any to any frag
   00700    2547     970898 allow icmp from any to any
   00800     308      16488 allow tcp from any to any 22
   00900    6493      34233 allow tcp from any to any 53	    # dns
   01000     127       6604 allow udp from any to any 53	    # dns
   01100   10342     382932 allow tcp from any to any 80 via ed1    #  http
   01200     130       7022 deny tcp from any to any in recv ed0 setup
   65535 8322134 6836458323 deny ip from any to any