Firewall+natd+dhcpの設定

内容は無保証です。自分の責任で行なって下さい(^^;)

ご家庭内LANをインターネットに接続する場合、Firewall+natd+dhcpの機能をもった ルータが欲しいというのは良くあるお話です。最近私が構築した事例を紹介します。 構築したネットワークは以下の図のようなものでした。

上位回線は常時接続型のもので、PCにグローバルアドレスが割り振られています。ゲートウェイとなるPCにはFreeBSD3.4-stable(SMP)がインストールされており、これに対してFirewall, natd, dhcpサーバを構築します。ハードウェアはDECの21140が外向けのネットワークカードとして使用されていたのでこれをそのまま使用しました。当然ゲートウェイとして使用するので内向け用にIntelのPRO/100+を新たに追加しました。

カーネルコンフィグレーション

まずファイヤーウォールを設定するにはカーネルを対応させなければならないので、以下のようなオプションを付加しコンパイル、インストールします。
options         IPFIREWALL              #firewall
options         IPFIREWALL_VERBOSE      #print information about
options         IPDIVERT
options         "IPFIREWALL_VERBOSE_LIMIT=100" #limit verbosity
pseudo-device   bpfilter 8      
当然ネットワークカードを2枚使用しているのでカーネルコンフィグには
device de0              # DEC/Intel DC21x4x (``Tulip'')
device fxp0             # Intel EtherExpress PRO/100B (82557, 82558)
があります。当然ここで紹介するネットワークカードと違うものを使用する場合、そのネットワークカードに対応したdeviceを指定します。

rc.confの設定

カーネルが再構築できたら、今度は/etc/rc.confを設定します。ここではネットワークカードを2枚使用していることを定義するほかにnatdとFirewallの起動および起動オプションも設定します。
#ホストネーム
hostname="AAA.BBB.CCC.jp"

#ネットワークインターフェースの指定
network_interfaces="lo0 de0 fxp0"

#グローバル側のネットワークカード
ifconfig_de0="inet AAA.BBB.CCC.DDD  netmask 255.255.255.0"  

#プライベート側のネットワークカード
ifconfig_fxp0="inet aaa.bbb.ccc.ddd  netmask 255.255.255.0"

#sendmailの起動スイッチ。必要でしたらYESにする。
sendmail_enable="NO"

#ゲートウェイとして動作させる。
gateway_enable="YES"

#NATDを動作させる。
natd_enable="YES"

#natdで外向けのネットワークカードを指定
natd_interface="de0"

#NATDの設定ファイル名を指定
natd_flags="-f /etc/natd.conf"

#Firewallの起動スイッチ
firewall_enable="YES"

#Firewallのタイプを指定。
firewall_type="simple"

#黙っているか喋りまくるか指定する。
firewall_quiet="NO"

/etc/natd.confの設定

/etc/natd.confにてnatdの設定を行ないます。通常は以下の通りで大丈夫でしょう。(本当かぁ?)
log no
verbose  no  #yesにすると詳しいログがとれるがバックグラウンドでは動かない
deny_incoming no  
log_denied yes    
use_sockets yes
same_ports yes
port 8668
unregistered_only yes

rc.firewallの設定

elif [ "${firewall_type}" = "simple" ]; then
から
elif [ "${firewall_type}" != "UNKNOWN" -a -r "${firewall_type}" ]; then
の上までを以下の通りに書き換えます。

    # set these to your outside interface network and netmask and ip
    oif="de0"
    onet="AAA.BBB.CCC.0"
    omask="255.255.255.0"
    oip="AAA.BBB.CCC.DDD"

    # set these to your inside interface network and netmask and ip
    iif="fxp0"
    inet="aaa.bbb.ccc.0"
    imask="255.255.255.0"
    iip="aaa.bbb.ccc.ddd"

    # Stop spoofing
    $fwcmd add deny all from ${inet}:${imask} to any in via ${oif}
    $fwcmd add deny all from ${onet}:${omask} to any in via ${iif}

    #  こちらからセッションを張るものは許可する
    $fwcmd add pass tcp from any to any established

    # 外側からの25番ポートへの接続を不可
    #### Can not use sendmail 
    #$fwcmd add pass tcp from any to ${oip} 25 setup
    $fwcmd add deny tcp from any to ${oip} 25 setup via ${oif}

    #SSH を許可する
    $fwcmd add pass tcp from any to ${oip} 22 setup

    # Tracerouteを使用可能にする。
    $fwcmd add pass udp from ${oip} to any 33434-33523 

    # 外側のネットワークカードに来るtcpは許可しない。しかもログをとる。
    $fwcmd add deny log tcp from any to any in via ${oif} setup

    # すべてのTCPコネクションを許す。(内向け用)
    $fwcmd add pass tcp from any to any setup

    # DNSの問い合わせを許す。
    $fwcmd add pass udp from any 53 to any
    $fwcmd add pass udp from any  to any 53
  
    # NTPを許す。
    $fwcmd add pass udp from any 123 to ${oip}
    $fwcmd add pass udp from ${oip} to any 123

    # PINGは許す。
    $fwcmd add pass icmp from any to any via ${iif}
    $fwcmd add pass icmp from any to any out via ${oif}
    $fwcmd add pass icmp from any to any in via ${oif}

    $fwcmd add allow icmp from ${oip} to any
    $fwcmd add allow icmp from any to ${oip} 
    $fwcmd add deny log icmp from any to any

    #DHCPを許す。
    $fwcmd add allow udp from any  to ${iip} 67 via ${iif}
    $fwcmd add allow udp from any  to ${iip} 68 via ${iif}
    $fwcmd add allow udp from ${iip}  to any  via ${iif}

DHCPの設定

DHCPの設定はこちらを参照してください。
yukiya@ee.t-kougei.ac.jp
Last modified: Fri Jun 23 23:42:43 JST 2000