追記 [2007-09-09]

追記だから普通は下の方にかくんだろうけど!
外向きの回線をyahooからB Fletsにした。でもってしばらくはハイパーファミリー。
なので、Firewall君もブリッジタイプからPPPoEタイプへ変更。

しばらくはまっていたのでそこだけメモ

/etc/rc.conf

:
ifconfig_out_interface = "dhcp"
:

としていてこれをコメントアウトしたけど、

ifconfig_OUT-IF = "up"

こうしなくっちゃいけなかったらしい。

/etc/rc.conf

:
natd_interface="OUT-IF"
:

:
natd_interface="tun0"
:

だそうだ。

ipfw -a listでルールをチェックして行くうちに見つかった。


&hr;


FreeBSD 5.3のときにFirewallを作ったときの記録です。

Firewallの構築

まずは、ファイアウォール!

Firewallの構築

といっても、とっても難しかったです。まず、BSD MagazineのVol.18を参考に作ってみる。
今ひとつとういかローカル側から外に対して接続できません。これを書いている今現在(Sep 24, 2004)では、Flet's ADSL/ B Flet'sで固定IPアドレスを取得していることを前提に書かれています。従って、NATを行うのはPPPoEのNATで構築する手順が書かれてます。しかーし、うちの回線は、安さに惹かれてYahoo BB!。
Yahoo BB!はADSLモデムからDHCPでIPが割り当てられます。とりあえず、インストール時のPPP/SLIPのコンフィグでDHCPを割当とこっと。

実際のインストール

といり合えず、STANDARD + USERでインストールをしました。WEBで検索するとFreeBSD 5.2でNIC2枚差しルータというページを発見。それとFreeBSDによるインターネットサーバーの構築を発見。どちらもPPPoEだけど、IPFW + NATというところで参考になるかと。
んっ?カーネルのリビルドが必要なのか?そのようです。

本当のインストール

カーネルを再構築するためには、STANDARD + KERN-DEVELOPERでインストールします。
で、カーネルの再構築。

# cd /sys/i386/conf
# cp GENERIC RT
  • まず、カーネルのコンフィグGENERICを今回作成するカーネルの名称RTにコピーします。(名前はなんでもいいみたい)
  • 次にコピーしたカーネルコンフィグファイルRTを編集します。編集する場所は
    ident GENERIC
    idnet RT
    それとIPFWとNATを使うので以下のoptionを追加します。
    options IPFIREWALL                     # firewall
    options IPFIREWALL_VERBOSE             # enable logging to syslogd
    options IPFIREWALL_VERBOSE_LIMIT=100   #log limit
    opitons IPV6FIREWALL                   # firewall IPv6
    options IPV6FIREWALL_VERBOSE           # enable logging to syslogd
    options IPV6FIREWALL_VERBOSE_LIMIT=100 # log limit
    options IPDIVERT                       # for NAT Device
    で、コンフィグとメイクと
    # config RT
    kernel build directory is ../compile/RT
    Don't forget to do a ' ' make depend ' '
    # cd ../compile/RT
    # make depend && make && make install
    一気にインストールまでやってしまいましょ。ここでいったん寝ました。なんといっても試しに使っているマシンはCeleron 300MHz Memory 128MB して、リブート
    # reboot
    新しいカーネルになっているらしい。

rc.confの設定

rc.confにIPFW + NATの設定を追加します。

#
# add wikiki
#
ifconfig_xl0="192.168.0.1 netmask 255.255.255.0" # inter interface
ifconfig_ed0="DHCP"                              # outer interface

firewall_enable="YES"
firewall_quied="YES"
firewall_type="open"
firewall_script="/etc/ipfw.nat"
gateway_enable="YES"
natd_enable="YES"
natd_ingerface="xl0"
#natd_flags="-dynamic"

次に/etc/ipfw.confを作成します。これがファイアウォールのルールとなる(らしい)

# Firewall rules 

fwcmd="/sbin/ipfw -q"

# Initialize all rules
${fwcmd} -f flush

# Denial of fragmentation packet
${fwcmd} add 100 deny ip from any to any via xl0 frag

# Denial of ping
${fwcmd} add 200 deny icmp from any to any recv xl0

# Allow loopback
${fwcmd} add 300 allow ip from any to any via lo0

# Allow local communication
${fwcmd} add 400 allow ip from 192.168.0.0/24 to any via ed1
${fwcmd} add 500 allow ip from any to 192.168.0.0/24 via ed1

# Denial local address from outside
${fwcmd} add 600 deny all from 192.168.0.0/24 to any recv xl0
${fwcmd} add 700 deny all from 172.16.0.0/12  to any recv xl0
${fwcmd} add 800 deny all from 10.0.0.0/8     to any recv xl0
${fwcmd} add 900 deny all from 127.0.0.0/8    to any recv xl0

# Denial to local addres from outside
${fwcmd} add 1000 deny all from any to 192.168.0.0/24 via xl0
${fwcmd} add 1100 deny all from any to 172.16.0.0/12  via xl0
${fwcmd} add 1200 deny all from any to 10.0.0.0/8     via xl0
${fwcmd} add 1300 deny all from any to 127.0.0.0/8    via xl0

# Denial of NetBios
${fwcmd} add 3000 deny udp from any 137-139,445 to any
${fwcmd} add 3100 deny tcp from any 137-139,445 to any
${fwcmd} add 3200 deny udp from any to any 137-139,445
${fwcmd} add 3300 deny tcp from any to any 137-139,445

# Set Nat
${fwcmd} add 4000 divert natd all from any to any via xl0

# Allow connect established
${fwcmd} add 5000 allow tcp from any to any established

# Allow goto outside
${fwcmd} add 5100 allow ip from any to any out via xl0

# Allow DNS
${fwcmd} add 6000 allow udp from any to any 53 out
${fwcmd} add 6100 allow udp from any 53 to any in

# Allow NTP
${fwcmd} add 6200 allow udp from any to any 123 out
${fwcmd} add 6300 allow udp from any 123 to any in

# Allow WWW
${fwcmd} add 6400 allow tcp from any to any 80 setup

# Allow SSH
${fwcmd} add 6600 allow tcp from any to any 22 setup

# Denial another communication with log
${fwcmd} add 9000 log tcp from any to any
${fwcmd} add 9100 log udp from any to any
${fwcmd} add 9200 log icmp from any to any

という設定にします。 うごきませーん。内部から外側にアクセスできません。 ifconfigで確認してみると外側のインタフェースxl0と内側のインタフェースed1にちゃんとアドレスは割りあたってる。どうなってんだ。
でさらにWEB上をさまよう。本当にさまよった。ipfw.confの設定をすべてコメントにしても通信できない。
んっ?どうやらrc.confのfirewall_script="/etc/ipfw.conf"を読みこんいるかららしい。とわかるまでに2日かかりました。その行をコメントにするとあら不思議通。内側から外側にぬけるじゃない。なんでだ?

# ipfw list

で現在のルールを確認できることがわかった。

00050 divert 8668 ip from any to any via xl0
00100 allow ip form any to any via xl0
00200 deny ip from any to 127.0.0.0/8
00300 deny ip from 127.0.0.0/8 to any
65000 allow ip from any to any
65535 deny ip from any to any

となってます。だれが設定しているんだ?
/etcディレクトリをみているとrc.firewallがあります。デフォルトであるんじゃん。
がしかし、なにもfirewallになってない。 さらにWEB上を彷徨うこと半日
Firewall構築ガイドにたどりつきました。
ここで、ipfwコマンドで一つ一つ確認しながらルールを追加できることを知りました。それと、

# /sbin/natd -n xl0 -v &

でnatが変換している様子をモニタすることが可能であることを知りました。 で、ちくちくルールを作っていきました。できたルールは...そのまんまじゃん。

# Script for IPFW + NAT rules ( static nat rules)

# Suck in the configuration variables.
if [ -r /etc/defaults/rc.conf ]; then
        . /etc/defaults/rc.conf
        source_rc_confs
elif [ -r /etc/rc.conf ]; then
        . /etc/rc.conf
fi

fwcmd="/sbin/ipfw -q"

# Initialize all rules
${fwcmd} -f flush

############################
# Internet (outside) interface
oif="xl0"
#onet="1.2.3.0/24"
#oip="1.2.3.4"

# private (inside) interface
iif="ed1"
inet="192.168.0.0/24"
iip="192.168.0.1"

############################
# rule for loopback
${fwcmd} add pass all from any to any via lo0
${fwcmd} add deny all from any to 127.0.0.0/8

# Drop fragmentation packet
${fwcmd} add deny ip from any to any via ${oif} frag

# Drop NetBIOS
${fwcmd} add deny udp from any 137-139 to any
${fwcmd} add deny tcp from any 137-139 to any
${fwcmd} add deny udp from any to any 137-139
${fwcmd} add deny tcp from any to any 137-139

# Denail impersonation packet
#${fwcmd} add deny all from ${inet} to any in via ${oif}
#${fwcmd} add deny all from ${onet} to any in via ${iif}

# Denial private address or multicast
${fwcmd} add deny all from any to 10.0.0.0/8 via ${oif}
${fwcmd} add deny all from any to 172.16.0.0/12 via ${oif}
${fwcmd} add deny all from any to 192.168.0.0/16 via ${oif}
${fwcmd} add deny all from any to 0.0.0.0/8 via ${oif}
${fwcmd} add deny all from any to 169.254.0.0/16 via ${oif}
${fwcmd} add deny all from any to 192.0.2.0/24 via ${oif}
${fwcmd} add deny all from any to 224.0.0.0/4 via ${oif}
${fwcmd} add deny all from any to 240.0.0.0/4 via ${oif}

############################
# NAT 
${fwcmd} add divert natd all from any to any via ${natd_interface}

# Denial private address and multicast
${fwcmd} add deny all from 10.0.0.0/8 to any via ${oif}
${fwcmd} add deny all from 172.16.0.0/12 to any via ${oif}
${fwcmd} add deny all from 192.168.0.0/16 to any via ${oif}
${fwcmd} add deny all from 0.0.0.0/8 to any via ${oif}
${fwcmd} add deny all from 169.254.0.0/16 to any via ${oif}
${fwcmd} add deny all from 192.0.2.0/24 to any via ${oif}
${fwcmd} add deny all from 224.0.0.0/4 to any via ${oif}
${fwcmd} add deny all from 240.0.0.0/4 to any via ${oif}

# Allow TCP connection established
${fwcmd} add pass tcp from any to any established

# Allow SSH
${fwcmd} add pass tcp from any to ${oip} 22 setup

# Allow SMTP
${fwcmd} add pass tcp from any to ${oip} 25 setup
# reset IIDENT
${fwcmd} add reset tcp from any to any 113

# Allow DNS
${fwcmd} add pass tcp from any to ${oip} 53 setup
${fwcmd} add pass udp from any to ${oip} 53
${fwcmd} add pass udp from ${oip} 53 to any

# Allow WWW connection
${fwcmd} add pass tcp from any to ${oip} 80 setup

# Denial another TCP connect and logging
${fwcmd} add deny log tcp from any to any in via ${oif} setup

# Allow TCP connection from inside
${fwcmd} add pass tcp from any to any setup

# Allow DNS toiawase
${fwcmd} add pass udp from any to any 53
${fwcmd} add pass udp from any 53 to any

# Allow NTP query
${fwcmd} add pass udp from any 123 to ${oip}
${fwcmd} add pass udp from ${oip} to any 123

# Allow ping from inside to outside
${fwcmd} add pass icmp from any to any via ${iif}
${fwcmd} add pass icmp from any to any out via ${oif} icmptypes 8
${fwcmd} add pass icmp from any to any in via ${oif} icmptypes 0

# RFC2979
${fwcmd} add pass icmp from any to any in via ${oif} icmptypes 3

# Denial another icmp and logging
${fwcmd} add deny log icmp from any to any

# Denial another

コメントは日本語でしたが、日本語環境がないところでエディットするためアルファベット^^;に直してます。

# sh ipfw.nat

おっできた。
ちゃんとルールを見直そっと。それとrc.confの記述を直すってことだな。

スピードテストをしてみた。

スピードテスト | USENの回線速度

freebsd router box : Max. 6.038Mbps Ave. 4.890Mbps Min. 1.867Mbps
Direct             : Max. 6.199Mbps Ave. 6.129Mbps Min. 5.985Mbps

ちなみに契約は12Mbps。距離はNTTの開示情報で1050m 損失は19dbです。
まえは、ダイレクトだと8Mくらいでてたんだけどなー。でも思ったより悪くならないのね。無線ルータ経由だと4Mbpsくらいだったからまいいか。


Last-modified: 2013-03-01 (金) 11:07:07 (2389d)