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


FreeBSD新手,第一次写心得,不清楚之处还敬请原谅 。有问题的地方还望不吝指教!谢谢!
近日因为宿舍的ADSL猫的路由功能被电信屏蔽,因此使用FreeBSD5.1 ipf ipnat ipfw 双网卡 pppoe搞定带流量控制的透明网关 。
原来使用ipfw natd,因为pppoe得到的tun0的ip是动态的,无法做到端口映射 。虽然可以成功代理和可控,但是没有达到预定目的,故弃用 。
下面是我的配置过程:
(1)当然是重新编译内核 。(注:如果你是新装的系统,建议修改完CPU类型以后来一次make world,可以提高系统的效率 。)
添加下列项目:
optionsIPSTEALTH是防火墙透明
optionsIPFILTER打开ipf
optionsIPFILTER_LOG打开ipf的日志
optionsIPFILTER_DEFAULT_BLOCKipf默认规则,deny all
然后编译内核 。
注意:如果要ipf和ipfw同时使用,切记要将ipf编译到内核里面,然后再kld ipfw 。
如果将两者都编译进内核会导致系统启动的时候卡在一个检测网络接口的地方 。
(2)安装新内核以后,就是详细配置相关规则了 。
(a):ppp拨号的设置比较简单,下面就给出一个示范性的ppp.conf文件,内容如下:
default:
set log Phase Chat LCP IPCP CCP tun command
set redial 15 28800
set reconnect 15 28800
pppoe:
#加入在kernel中配置的会连接ADSL设备的网卡的名称,我的是rl0
set device PPPoE:rl0
set mru 1492
set mtu 1492
set speed sync
enable lqr
set lqrperiod 5
set cd 5
set dial
set login
set timeout 0
set authname Your UserName used to login
set authkey Your PassWord used to login
set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0
add default HISADDR# Add a (sticky) default route
enable dns
(b):在rc.conf中添加下列项目:
ppp_enable="YES"
ppp_mode="ddial"断线自动重拨
ppp_mode="background"
ppp_profile="pppoe"根据你的ppp.conf文件设置,这里我使用的是pppoe
ipfilter_enable="YES"
ipnat_enable="YES"
gateway_enable="YES"
然后重新启动系统使系统自动拨号,启用ipf防火墙 。
注意:因为默认的ipf规则是block all,因此使用网络管理配置的此时会失去与系统的联系 。
因此需要预先在/etc目录中添加暂时性的ipf.rules项目 。
暂时性的ipf.rules内容如下:pass in all
pass out all
(c):重新启动以后就可以看到ipf已经起到作用了 。又因为我们使用的是pppoe拨号,
因此得到的是动态ip 。我们要想详细配置防火墙和端口映射就需要写一个脚本(ipf.sh)来自动生成ipf.rules和ipnat.rules 。
然后把它放到自启动目录中,加上可执行属性,使系统启动以后可以自动生成规则集 。
示范性脚本如下:
#!/bin/sh
##########################################
#ipf.sh 是一个自动检测ADSL分配的IP地址和利用这个IP地址动态创建IPFILTER过
#滤规则的脚本 。
#使用方法:
#步骤一:要确定使用ipf.sh脚本的服务器能正常使用ADSL拨号和IPFILTER能正常运
#行 。
#步骤二:把ipf.sh脚本修改成你的实际网络情况 。修改如下:
#内部网卡设备号、内部网段、服务器IP地址、ADSL拨号网络设备号或自己增加网络设备
#和相应的过滤规则 。
#步骤三:把ipf.sh移动到 /usr/local/etc/rc.d中,记得加上可执行属性 。
################################################################内部网卡设备号vr0
INTARNDEV="vr0"
INTARN=`ifconfig $INTARNDEV | grep inet | cut -d " " -f 2`
#内部网段192.168.0.0/24
INTARNNET="192.168.0.0/24"
#服务器IP地址
#注意:服务器IP地址为0.0.0.0时是不会做相应的服务映射,只在填写了正确的IP地址后才会映射到该IP地址上 。
INTARNFTP="0.0.0.0" #FTP服务器
INTARNSSH="0.0.0.0" #SSH服务器
INTARNEMAIL="0.0.0.0" #EMAIL服务器

推荐阅读