IPFW + Bridge(動的ルール)

FreeBSD 5.1R で IPFW(IP Firewall) と bridge を使ってみました。

ipfw4b.gif

既存のマシンの IP アドレスを変更せずに、そっくり Firewall に移行できます(LAN の一部あるいは全部)。
Snort などの IDS を動かすのにも使用できます。

ただし、NIC が promiscuous(無差別受信)モードで動作しますので、マシン自身の security が重要になります。
ですから、サーバと兼用にしてはいけません。

FreeBSD 4.X では、IP 以外のパケットは素通しになりますが、 FreeBSD 5.X では、IP 以外のパケットもブロックできます。
(ただし、NETGRAPH を使ったブリッジでは、5.X でも IP 以外のパケットは素通しになります)

マシンの設定

FreeBSD 5.1R の Kern-Developer というセットをインストールします。
ネットワークボードを2枚刺し、片方にだけ IP アドレスを割り当てます(私は外側に付けました)。
bridge を有効にするために /boot/loader.conf を編集します。

   bridge_load="YES"

/etc/rc.conf を編集します

   firewall_enable="YES"
   firewall_type="/etc/ipfw.bridge"
   firewall_logging="YES"

/etc/sysctl.conf を作成します

   net.link.ether.bridge=1
   net.link.ether.bridge_ipfw=1
   net.link.ether.bridge_cfg=fxp0,fxp1  <= NIC を指定する

IPFW の設定

アクセス制限を掛けるために /etc/ipfw.bridge を作成します。
NAT ありの場合と違って、自分自身も内部のマシンも同じ ネットワークということを忘れないように

# IPFW + Bridge のルール設定スクリプト(動的ルール)

fwcmd="/sbin/ipfw -q"

me="1.2.3.x"         <= 自分自身の IP アドレス
net="1.2.3.0/24"     <= LAN のネットワークアドレス
server="1.2.3.y"     <= サーバの IP アドレス
bc="1.2.3.255"       <= LAN のブロードキャストアドレス

# 全てのルールを破棄
${fwcmd} -f flush

# 動的ルールのチェック
${fwcmd} add check-state

# SSH や telnet のセッションが途切れないようにする
# 稼働中にルールを変更する場合には必要
#${fwcmd} add pass tcp from any to any established

# IP 以外のパケットをブロック。例えば DECnet (DNA,LAT,LAVC)
# mac-type は ethereal を使えば容易に確認できる
#${fwcmd} add deny mac-type 0x6002,0x6003,0x6004,0x6007

# ARP などの IP 以外のパケットを許可
${fwcmd} add pass layer2 not mac-type ip

# LAN へのブロードキャストを許可
# 必須のルールではないが、動的ルールの増加を抑えることができるので
${fwcmd} add pass ip from ${net} to ${bc}

# 内から外への TCP と UDP とその帰りを許可
# 動的ルールを生成させる
${fwcmd} add pass tcp from ${net} to any setup keep-state
${fwcmd} add pass udp from ${net} to any keep-state

# ループバックを許可(忘れがちだが重要)
${fwcmd} add pass all from any to any via lo0

# プライベートアドレスなどを拒否
${fwcmd} add deny all from 10.0.0.0/8 to any
${fwcmd} add deny all from 172.16.0.0/12 to any
${fwcmd} add deny all from 192.168.0.0/16 to any
${fwcmd} add deny all from 169.254.0.0/16 to any
${fwcmd} add deny all from 192.0.2.0/24 to any
${fwcmd} add deny all from 224.0.0.0/4 to any
${fwcmd} add deny all from 240.0.0.0/4 to any

# 外部からの SSH, SMTP, WWW の接続開始を許可
${fwcmd} add pass tcp from any to ${server} 22,25,80 keep-state
 
# DNS サーバの場合
${fwcmd} add pass udp from any to ${server} 53 keep-state
${fwcmd} add pass tcp from any to ${server} 53 keep-state

# ICMP
${fwcmd} add pass icmp from ${net} to any
${fwcmd} add pass icmp from any to ${net} icmptype 0,3,11
${fwcmd} add deny icmp from any to any

# 残りは拒否
${fwcmd} add deny log all from any to any

リブート後に設定が有効になります。 ルールの表示は

   # ipfw -ad list

ルールの再設定は

   # sh /etc/ipfw.bridge

添付ファイル: fileipfw4b.gif 2823件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2004-10-29 (金) 14:31:12 (5494d)