> /etc/ipf.rules echo "pass out proto gre from any to any keep state" >> /etc/ipf.rules echo "pass in on "$ADSLDEV" all" >> /etc/ipf.rules echo "pa。Ipf+ipnat+ipfw建立带流量控制的透明网关( 四 )。" />

Ipf+ipnat+ipfw建立带流量控制的透明网关( 四 )


echo "pass in proto gre from any to any keep state" >> /etc/ipf.rules
echo "pass out proto gre from any to any keep state" >> /etc/ipf.rules
echo "pass in on "$ADSLDEV" all" >> /etc/ipf.rules
echo "pass out on "$ADSLDEV" all" >> /etc/ipf.rules
【Ipf ipnat ipfw建立带流量控制的透明网关】/sbin/ipf -Fa -f /etc/ipf.rules
/sbin/ipnat -CF -f /etc/ipnat.rules
##END IPF.SH###########
(d):因为我们采用的是pppoe拨号,有断线重拨的可能 。因此有不断监视和更新ipf、ipnat规则的需要
(我们前面已经在rc.conf里面设置ppp断线重拨了,重播以后tun0得到的ip会改变) 。
因此我们在crontab的root文件里面加上一条规则,使ipf.sh能每隔一段时间(3-5min)自动执行一次 。
(e):然后就是启用ipfw来进行流量管理了 。干脆写一个脚本来进行了事了 。示例脚本如下:
#!/bin/sh
#load ipfw in ipf env
#by fzfh
/sbin/kldload /boot/kernel/dummynet.ko
#加载ipfw和dummynet模块,默认deny all
/sbin/ipfw -f flush
#清空所有ipfw规则
/sbin/ipfw add 00050 pipe 1 all from any to ip
/sbin/ipfw pipe 1 config bw 400Kbit/s
#限制任意地址到ip的总流量不超过400Kbit/s
/sbin/ipfw add 00060 pipe 2 all from ip to any
/sbin/ipfw pipe 2 config bw 400Kbit/s
#限制ip到任意地址的总流量不超过400Kbit/s
/sbin/ipfw add 100 all from any to any
#任意连接通过
然后把ipfw.sh加上可执行属性,放到ipf.sh同一个目录里面在开机时自动执行即可 。(/usr/local/etc/rc.d)
注意:加载ipfw模块以后会马上生效,默认是deny all,位置在65535 。
因此,通过网络进行设置的话需要写一个脚本加载ipfw模块,务必使加载ipfw模块以后要生成一条在65535前通过所有连接的规则 。
建议序号在10000之前 。
(3):到此,已经完成配置 。测试达到个人的预定目的 。

#########################################
重要增加:
注明:本文在配置的时候参考文章《使用FreeBSD配置基于ADSL的VPN防火墙(IPFILTER)网关 》
陈永光(Charlin) < charlin@88vip.com >
http://cvs.cnfug.org/cgi-bin/cvs.cgi?4@02
引用其中动态生成ipf.rules和ipnat.rules的脚本文件 。特此说明并感谢!
#########################################
如果个人使用就不需要那么复杂 。可以大大精简 。下面给出本人自己的精简脚本文件 。
动态生成ipf.rules和ipnat.rules的脚本文件:
#!/bin/sh
#power by fzfh
#定义变量
INTARNNET="192.168.0.0/24"
#截取adsl的动态ip
ADSLDEV="tun0"
ADSLIP=`ifconfig $ADSLDEV | grep inet | cut -d " " -f 2`
until [ $ADSLIP ]
do
sleep 3
done
#make ipnat.rules
echo "##################" > /etc/ipnat.rules
echo "#/etc/ipnat.rules #" >> /etc/ipnat.rules
echo "##################" >> /etc/ipnat.rules
echo "map "$ADSLDEV" "$INTARNNET" -> "$ADSLIP"/32 proxy port ftp ftp/tcp" >> /etc/ipnat.rules
echo "map "$ADSLDEV" "$INTARNNET" -> "$ADSLIP"/32 portmap tcp/udp 10000:50000"
>> /etc/ipnat.rules #这里的10000:50000可以用auto代替 。
echo "map "$ADSLDEV" "$INTARNNET" -> "$ADSLIP"/32" >> /etc/ipnat.rules
echo "rdr "$ADSLDEV" "$ADSLIP"/32 port X -> IP port X" >> /etc/ipnat.rules #这里的端口号X和IP可以相应更改 。每一个一行 。
#make ipf.rules
echo "#############################" > /etc/ipf.rules
echo "#/etc/ipf.rules #" >> /etc/ipf.rules
echo "#############################" >> /etc/ipf.rules
echo "block in log quick all with short" >> /etc/ipf.rules
echo "block in log quick all with ipopts" >> /etc/ipf.rules
echo "block in log quick all with frag" >> /etc/ipf.rules
echo "block in log quick all with opt lsrr" >> /etc/ipf.rules
echo "block in log quick all with opt ssrr" >> /etc/ipf.rules
echo "" >> /etc/ipf.rues
echo "pass in quick on "$ADSLDEV" proto tcp from any to any port = X keep state"

推荐阅读