FreeBSD/MPD+IPF+IPNAT の変更点
*MPD+IPF+IPNAT [#pc2f7826]
#contents
**mpdのインストール [#cb4d511b]
# cd /usr/ports/net/mpd
# make install
***/usr/local/etc/mpd/mpd.conf編集 [#tbd3d57b]
$ cat /usr/local/etc/mpd/mpd.conf
default:
load SAKURA
SAKURA:
new -i ng0 SAKURA PPPoE
set iface addrs 1.1.1.1 2.2.2.2
set iface route default
set iface disable on-demand
set iface idle 0
set iface mtu 1454
set iface up-script /usr/local/etc/mpd/script-SAKURA.sh
set bundle disable multilink
set bundle authname [ユーザ名]
set bundle password [パスワード]
set link no acfcomp protocomp
set link disable pap chap
set link accept chap
set link mtu 1454
set link mru 1454
set ipcp yes vjcomp
set ipcp ranges 0.0.0.0/0 0.0.0.0/0
open iface
***/usr/local/etc/mpd/script-SAKURA.sh作成 [#t74cc853]
$ cat /usr/local/etc/mpd/script-SAKURA.sh
#!/bin/sh
/sbin/ipf -y
/sbin/ipnat -CF -f /etc/ipnat.rules
***/usr/local/etc/mpd/mpd.links作成 [#s6b20e48]
PPPoE:
set link type pppoe
set pppoe iface fxp0
set pppoe service "whatever"
set pppoe disable incoming
set pppoe enable originate
***mpdの起動スクリプト作成 [#hfb95cdf]
$ cat /usr/local/etc/rc.d/mpd.sh
#!/bin/sh
mpd_command="/usr/local/sbin/mpd"
mpd_conf_file="/usr/local/etc/mpd/mpd.conf"
case "$1" in
start)
if [ -x ${mpd_command} -a -f ${mpd_conf_file} ]; then
${mpd_command} -b
echo "mpd start pppoe connection"
fi
sleep 5
/sbin/ipf -FA -Z -f /etc/ipf.rules
#/sbin/ipf -y
/sbin/ipnat -CF -f /etc/ipnat.rules
;;
stop)
echo "mpd stop pppoe connection"
/usr/bin/killall mpd
;;
*)
echo "Usage: mpd.sh {start|stop}"
exit 1
esac
exit 0
**カーネル再構築 [#l99c72bc]
カーネル再構築 ⇒ [[FreeBSD/カーネル再構築>FreeBSD/カーネル再構築]]~
下記を追加してカーネル再構築
# for net/mpd
options NETGRAPH
options NETGRAPH_BPF
options NETGRAPH_ETHER
options NETGRAPH_IFACE
options NETGRAPH_PPP
options NETGRAPH_PPPOE
options NETGRAPH_SOCKET
options NETGRAPH_VJC
# for IPFilter
options IPFILTER
options IPFILTER_LOG
options IPFILTER_DEFAULT_BLOCK
options TCP_DROP_SYNFIN
**/etc/rc.confの編集 [#t28ce05c]
ipfilter_enable="YES"
ipfilter_rules="/etc/ipf.rules"
ipfilter_flags=""
ipmon_enable="YES"
ipmon_flags="-D /var/log/ipflog"
ipnat_enable="YES"
ipnat_rules="/etc/ipnat.rules"
gateway_enable="YES"
portmap_enable="NO"
tcp_drop_synfin="YES"
**IPF [#vc8439b3]
とりあえず ipf.rules を作るという場合
# cat /etc/ipf.rules
pass in all
pass out all
***編集済み/etc/ipf.rules [#ac01c88d]
$ cat /etc/ipf.rules
#--- ipf.rules ---
block in log quick from any to any with ipopts frag
block in log quick proto tcp from any to any with short
## group 100
#
pass in on ng0 all head 100
block in from 127.0.0.0/8 to any group 100
block in from 192.168.10.0/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 192.168.0.0/24 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
block in quick proto tcp/udp from any port 136 >< 140 to any group 100
block in quick proto tcp/udp from any to any port 136 >< 140 group 100
block in proto udp all group 100
pass in quick proto tcp all flags A/A group 100
#ssh
pass in quick proto tcp from any to any port = 22 flags S/SA 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
#smtp
pass in quick proto tcp from any to any port = 25 flags S/SA group 100
#deny 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
block in log quick proto tcp all flags S/SA group 100
#return NTP
pass in proto udp from any port = 123 to any group 100
#ping icmp
pass in proto icmp all group 100
## RFC2979
#pass in proto icmp all icmp-types 3 group 150
##group200
#
pass out on ng0 all head 200
pass out quick proto icmp from any to any keep state group 200
pass out quick proto udp from any to any keep state group 200
pass out quick proto tcp from any to any flags S/SAFR keep state group 200
pass out proto tcp from any to any port = 53 group 200
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 udp from any to any port = 123 group 200
block out proto icmp all group 200
pass out proto icmp all icmp-type 3 group 200
#NetBIOS
block out quick proto tcp/udp from any port 136 >< 140 to any group 200
block out quick proto tcp/udp from any to any port 136 >< 140 group 200
##group250
#
pass out on ng1 all head 250
pass out quick proto icmp from any to any keep state group 250
pass out quick proto udp from any to any keep state group 250
pass out quick proto tcp from any to any flags S/SAFR keep state group 250
pass out proto tcp all flags A/A group 250
pass out proto tcp from any to any port = 53 group 250
pass out proto udp from any to any port = 123 group 250
block out proto icmp all group 250
pass out proto icmp all icmp-type 3 group 250
#NetBIOS
block out quick proto tcp/udp from any port 136 >< 140 to any group 250
block out quick proto tcp/udp from any to any port 136 >< 140 group 250
##group 300
#
pass in on rl1 all head 300
pass in quick proto icmp from any to any group 300
pass in quick proto udp from any to any group 300
pass in quick proto tcp from any to any flags S/SAFR group 300
##group 400
#
pass out on rl1 all head 400
pass out quick proto icmp from any to any group 400
pass out quick proto udp from any to any group 400
pass out quick proto tcp from any to any flags S/SAFR group 400
##group 0
#
pass in quick on lo0 all
pass out quick on lo0 all
#--- ipf.rules end ---
***IPFのルール追加 [#s99cd284]
# echo "@1 block in quick from 192.168.1.20 to any" | /sbin/ipf -f -
***ルールの削除 [#o03ae484]
# echo "block in quick from 192.168.1.20 to any" | /usr/sbin/ipf -r -f -
***設定の保存 現在の設定をファイルに書き込む [#b70ec9f2]
# ipfstat -io > /etc/ipf.rules
**IPNAT [#xabddc8b]
# cat /etc/ipnat.rules
map ng0 192.168.0.0/24 -> 0/32 proxy port ftp ftp/tcp mssclamp 1414
map ng0 192.168.0.0/24 -> 0/32 portmap tcp/udp auto mssclamp 1414
map ng0 192.168.0.0/24 -> 0/32 mssclamp 1414
***IPNATでリダイレクト(透過的に送る機能) [#o9950eaf]
rdr ng0 0.0.0.0/0 port 80 -> 192.168.1.7 port 80
***IPNATでの負荷分散 [#g9194d0b]
この例では、202.11.97.29 の Web に来たパケットは最初は 192.168.0.2 に送り、次に来たコネクションは 192.168.0.3 に、その次は 192.168.0.4 にと巡回的に送ります。~
パケットを振り分ける(round robin)
rdr ng0 202.11.97.29/32 port 80 -> 192.168.0.2 port 80 tcp round-robin
rdr ng0 202.11.97.29/32 port 80 -> 192.168.0.3 port 80 tcp round-robin
rdr ng0 202.11.97.29/32 port 80 -> 192.168.0.4 port 80 tcp round-robin
***IPF・IPNATの新しいルールの反映、確認のコマンド [#w441c1fa]
ipf -Fa -Z -f /etc/ipf.rules ipf.rulesに書き換えたルールを反映させるコマンド
ipfstat -i IPFilterのイン側の設定を見るコマンド
ipfstat -o IPFilterのアウト側の設定を見るコマンド
ipnat -l natの設定を確認するコマンド
ipnat -CF -f /etc/ipnat.rules ipnat.rulesに書き換えた内容を反映させるコマンド
http://x68k.net/nagai/pukiwiki/index.php?FreeBSD%2Frouter
http://x68k.net/diary/?200310b#200310200
http://www.fujie.jp/freebsd/freebsd_router_ipfilter.html