Router(PPPOE + IPFILTER + IPNAT)

FreeBSDマシンをルーター化します。今までは市販のルーターを使っていましたが、unnumberedに対応していなかったり、SNMPが取れなかったり、フィルタリングやNATが貧弱だったり、スループットが出なかったりと、いろいろ不満がありました。そこでFreeBSDマシンをルーター化しようということになりました。接続ツールとしてはPPPOEを使うので、フレッツADSLやBフレッツに対応できると思います。高村さんのページを参考にさせていただきました(ほとんどそのままです)。深謝。なお、ここではファイアウォールにIPFILTER + IPNATを使う場合を記述してます。IPFIREWALL + NATDを使う場合は別に記載しました。

前提として、次のようなネットワークを仮定します。
Global IP address  202.***.***.16/29
Private IP address 192.168.1.0/24

        Internet
            |
            | rl0
    ________|_______
   |                |
   |      Router    |
   | 202.***.***.17 |
   | (192.168.1.1)  |
   |________________|
            |
            | rl1
            |_______________________
            |                       |  192.168.1.0/24
    ________|________          _____|_____
   |                 |        |           |
   |      Server     |        |  Clients  |
   | 202.***.***.18  |        |___________|
   | (192.168.1.2)   |
   |_________________|

1.Kernelの再構築

ルーターマシンのIPFILTERを有効にします。

# cd /usr/src/sys/i386/conf
# cp GENERIC MyKernel
# ee MyKernel
----------------
ident		Mykernel

options		IPFILTER
options		IPFILTER_LOG
options		IPFILTER_DEFAULT_BLOCK
options		TCP_DROP_SYNFIN
----------------
# config MyKernel
# cd ../../compile/MyKernel
# make depend
# make
# make install

NETGRAPH関係のoptionsはFreeBSD 4.7Rでは必要ありませんでした。

2.PPPの設定
PPPの設定ファイルを編集します。必要なファイルは、/etc/ppp/ppp.confと/etc/ppp/ppp.linkupです。次のようにしましたが、環境によってmodifyが必要でしょう。IPFILTERとIPFIREWALLの区別はありません。

ppp.conf

default:
 set device PPPoE:rl0
 set log Phase Chat LCP IPCP CCP tun command
 set speed sync
 set mru 1492
 set mtu 1454
 set ctsrts off
 set timeout 0
 accept CHAP
 add default HISADDR
 enable tcpmssfix
 disable deflate
 disable pred1
pppoe:
 set authname loginID@***.sphere.ne.jp
 set authkey himitsu

ppp.linkup

pppoe:
 ! ifconfig tun0 delete
 ! ifconfig tun0 202.***.***.208.17 netmask 255.255.255.248 HISADDR
 add! default HISADDR

このppp.linkupは、tun0に202.***.***.17を名乗らせるために必要のようです。でないと、tun0がネットワークアドレス(この場合202.***.***.16)を名乗ってしまう。

3.rc.confの設定
rc.confの追加事項は次のとおりになります。

rc.conf

network_interfaces="rl0 rl1 lo0"
tcp_extensions="YES"
ifconfig_rl0="media 10BaseT/UTP up"
# B fletsの場合は以下のようにする
# ifconfig_rl0="media 100baseTX mediaopt full-duplex up"
ifconfig_rl1="inet 202.***.***.17 netmask 255.255.255.248"
gateway_enable="YES"
ppp_enable="YES"
ppp_mode="ddial"
ppp_profile="pppoe"
ppp_nat="NO" # ipnatを使わない場合はYES

ipfilter_enable="YES"
ipfilter_rules="/etc/ipf.rules"
ipfilter_flags=""
ipmon_enable="YES"
ipmon_flags="-D /var/log/ipf.log"
ipnat_enable="YES"
ipnat_rules="/etc/ipnat.rules"

4.IPFILTERの設定
/etc/ipf.rulesをとりあえず、次のように書けばリブートすれば繋がるようになります。

pass in all
pass out all

もちろん、これでは丸裸同然ですので、適切なフィルタリングルールを書きます。一例を書きますので環境によって書き換えてください。なお、ここは木村博美さんのページを参考にしました。深謝。

ipf.rules

#  IPF+NAT 用のルールファイル(静的ルール)
# 2月13日 修正
# (group を指定していないルールはグループ 0)
# IP オプションが指定されたもの、断片化されたもの、
# 短いパケットなどはここで破棄
block in log quick from any to any with ipopts frag
block in log quick proto tcp from any to any with short

############################################
# 外部(Internet)からの入力(グループ 100)

pass in on tun0 all head 100

# アドレス偽装防止
block in from 127.0.0.0/8 to any group 100
block in from 202.***.***.17/32 to any group 100
block in from 192.168.1.1/24 to any group 100

# プライベートアドレスやマルチキャストなどの破棄
block in from 10.0.0.0/8 to any group 100
block in from 172.16.0.0/12 to any group 100
block in from 192.168.0.0/16 to any group 100
block in from 0.0.0.0/8 to any group 100
block in from 169.254.0.0/16 to any group 100
block in from 192.0.2.0/24 to any group 100
block in from 224.0.0.0/4 to any group 100
block in from 240.0.0.0/4 to any group 100

# NetBIOS (port 137-139)
block in quick from any port 136 >< 140 to any group 100
block in quick from any to any port 136 >< 140 group 100

# UDP パケットをデフォルトで拒否
block in proto udp all group 100

# 接続された TCP パケットを許可
pass in quick proto tcp all flags A/A group 100

# FTP
pass in proto tcp from any port = 20 to any flags S/SA group 100
pass in quick proto tcp from any to any port = 20 flags A/A group 100
pass in proto tcp from any port = 21 to any flags A/A group 100
pass in quick proto tcp from any to any port = 21 flags S/SA group 100

# 外部からの SSH 接続開始を許可
pass in quick proto tcp from any to any port = 22 flags S/SA group 100

# 外部からの SMTP 接続開始を許可
pass in quick proto tcp from any to any port = 25 flags S/SA group 100

# 外部からの POP3 接続開始を許可
pass in quick proto tcp from any to any port = 110 flags S/SA group 100

# 外部からのIMAP 接続開始を許可
pass in quick proto tcp from any to any port = 143 flags S/SA group 100

# IDENT には答えない
block return-rst in quick proto tcp from any to any port = 113 group 100

# DNS サーバを立てている場合
pass in quick proto tcp from any to any port = 53 flags S/SA group 100
pass in quick proto udp from any to any port = 53 group 100

# WWW サーバを立てている場合
pass in quick proto tcp from any to any port = 80 flags S/SA group 100
pass in quick proto tcp from any to any port = 443 flags S/SA group 100

# それ以外の外部からの TCP 接続を拒否し、ログに残す
block in log quick proto tcp all flags S/SA group 100

# 外部の DNS に問い合わせた帰りのパケット
pass in proto udp from any port = 53 to any group 100

# NTP の帰り
pass in proto udp from any port = 123 to any group 100

# 内部から外部への ping のみ許可
block in proto icmp all group 100
pass in proto icmp all icmp-type 0 group 100

# RFC2979
pass in proto icmp all icmp-type 3 group 100

############################################
# 外部への出力(グループ 200)

pass out on tun0 all head 200

# アドレス偽造防止
block out from 127.0.0.0/8 to any group 200
block out from any to 127.0.0.0/8 group 200
block out from any to 202.***.***.17/32 group 200

# プライベートアドレスやマルチキャストなどの破棄
block out from any to 10.0.0.0/8 group 200
block out from any to 172.16.0.0/12 group 200
block out from any to 192.168.0.0/16 group 200
block out from any to 0.0.0.0/8 group 200

block out from any to 169.254.0.0/16 group 200
block out from any to 192.0.2.0/24 group 200
block out from any to 224.0.0.0/4 group 200
block out from any to 240.0.0.0/4 group 200

# NetBIOS (port 137-139)
block out from any port 136 >< 140 to any group 200
block out from any to any port 136 >< 140 group 200

# 接続された TCP パケットを許可
pass out proto tcp all flags A/A group 200

# FTP
pass out proto tcp from any to any port = 20 flags A/A group 200
pass out quick proto tcp from any to any port = 21 flags S/SA group 200
pass out quick proto tcp from any port = 20 to any flags S/SA group 200
pass out quick proto tcp from any port = 21 to any flags A/A group 200

# 外部の DNS サーバへの問い合わせを許可
pass out proto tcp from any to any port = 53 flags S/SA group 200
pass out proto udp from any to any port = 53 group 200

# 外部への接続開始を許可
pass out proto tcp all flags S/SA group 200

# 外部の NTP サーバへの問い合わせを許可
pass out proto udp from any to any port = 123 group 200

# 内部から外部への ping のみ許可
block out proto icmp all group 200
pass out proto icmp all icmp-type 8 group 200

############################################
# 内部から来るパケット(グループ 300)

pass in on rl1 all head 300
block in from 127.0.0.0/8 to any group 300
block in from 192.168.1.1/32 to any group 300
block in from 202.***.***.17/0xffffff00 to any group 300

############################################
# 内部へ出ていくパケット(グループ 400)

pass out on rl1 all head 400
block out from 127.0.0.0/8 to any group 400
block out from any to 127.0.0.0/8 group 400
block out from any to 192.168.1.1/32 group 400

############################################
# ループバックへのルール(グループ 0)
# (最後にあっても OK)
pass in quick on lo0 all
pass out quick on lo0 all

次に、IPFILTERのnat機能を使い、クライアントから外へ出られたり、あるいは外から内のサーバーを見にゆけたり設定します。/etc/ipnat.rulesを編集します。

ipnat.rules

map tun0 192.168.1.0/24 -> 202.***.***.17/32 proxy port ftp ftp/tcp
map tun0 192.168.1.0/24 -> 202.***.***.17/32 portmap tcp/udp auto
map tun0 192.168.1.0/24 -> 202.***.***.17/32
bimap tun0 192.168.1.2/32 -> 202.***.***.18/32
rdr tun0 202.***.***.22/32 port 80 -> 192.168.1.12 port 8000

mapでは内から外へ出てゆくときのIPアドレスの変換をします。1行目は外のftp serverにアクセスする時に、PASVでなく通常モードでアクセスできるようにするためのものです。bimapは双方向natで、202.***.***.18宛のパケットはすべて192.168.1.2宛に変換されて流れます。rdrはport forwardingで、202.***.***.22 port 80宛のパケットは192.168.1.12 port 8000に流れます。

5.DHCPサーバー
市販のルーターには必ず備わっているDHCP機能をこのFreeBSDルーターにもインストールしましょう。まずportsを使ってインストールします。2002年12月現在、Version 3.0.1.rc9 です。

# cd /usr/ports/net/isc-dhcp3
# make
# make install

Sampleをコピーしてdhcpd.confを編集します。

#cd /usr/local/etc
# cp dhcpd.conf.sample dhcpd.conf

dhcpd.conf

# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#

# option definitions common to all supported networks...
option domain-name "fujie.org";
option domain-name-servers ns.fujie.org, ns2.fujie.org;

default-lease-time 600;
max-lease-time 7200;

# If this DHCP server is the official DHCP server for the local
# network, the authoritative directive should be uncommented.
#authoritative;

# ad-hoc DNS update scheme - set to "none" to disable dynamic DNS updates.
#ddns-update-style ad-hoc; ddnsを使わない場合noneは必須です。
ddns-update-style none;

# Use this to send dhcp log messages to a different log file (you also
# have to hack syslog.conf to complete the redirection).
log-facility local7;

# No service will be given on this subnet, but declaring it helps the
# DHCP server to understand the network topology.

# subnet 10.152.187.0 netmask 255.255.255.0 {
# }

# This is a very basic subnet declaration.

subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.20 192.168.1.99;
  option routers router.fujie.org;
}

このDHCPサーバーが自動で192.168.1.20から192.168.1.99までのIPアドレスを自動で割り振ってくれます。そして起動ファイルをコピーして再起動すればおしまいです。

# cd /usr/local/etc/rc.d/
# cp isc-dhcpd.sh.sample isc.dhcpd.sh

6.SNMPサーバー
ルーターのトラフィックデーターを知るためのSNMPDをインストールします。これはトラフィックデーター以外にも、CPU使用率やメモリー占有率などを知ることもできる優れもののようです。詳しくはZDNet/JAPAN のページ(大澤文孝さん)を参考にしてください。LINUX向けのページですがFreeBSDもほとんど同じです。まずSNMPをportsからインストールします。2002年12月現在のバージョンは5.0.6です。

# cd /usr/ports/net/net-snmp/ # make; make install

次に、EXAMPLEからコピーしてsnmpd.confを編集します。

# cd /usr/ports/net/net-snmp/work/net-snmp-5.0.6/
# cp EXAMPLE.conf /usr/local/share/snmp/snmpd.conf

snmpd.conf

####
# First, map the community name (COMMUNITY) into a security name
# (local and mynetwork, depending on where the request is coming
# from):

#       sec.name  source          community
com2sec local     localhost       PUBLIC
com2sec mynetwork 192.168.1.0/24      PUBLIC

####
# Second, map the security names into group names:

#               sec.model  sec.name
# group MyRWGroup       v1         local
# group MyRWGroup       v2c        local
# group MyRWGroup       usm        local
group MyROGroup v1         mynetwork
group MyROGroup v2c        mynetwork
group MyROGroup usm        mynetwork

syslocation FreeBSD router
syscontact FUJIE Masao 

ここで、PUBLIC はコミュニティ名になります。またセキュリティのため、読み出しは mynetwork に可能ですが、書き出しは local でも不可能な設定にしました。

起動ファイルは、/usr/local/etc/rc.d/snmpd.sh にありますが、これだけでは起動できず、/etc/rc.confに次の1行を追加してください。

net_snmpd_enable="YES"

TOP PAGE