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"