【 tulaoshi.com - Linux 】
ipf+ipnat+ipfw建立带流量控制的透明网关
FreeBSD新手,第一次写心得,不清楚之处还敬请原谅。有问题的地方还望不吝指教!谢谢! 近日因为宿舍的adsl猫的路由功能被电信屏蔽,因此使用FreeBSD5.1+ipf+ipnat+ipfw+双网卡+pppoe搞定带流量控制的透明网关。 原来使用ipfw+natd,因为pppoe得到的tun0的ip是动态的,无法做到端口映射。虽然可以成功代理和可控,但是没有达到预定目的,故弃用。 下面是我的配置过程: (1)当然是重新编译内核。(注:如果你是新装的系统,建议修改完cpu类型以后来一次make world,可以提高系统的效率。) 添加下列项目: options IPSTEALTH 是防火墙透明 options IPFILTER 打开ipf options IPFILTER_LOG 打开ipf的日志 options IPFILTER_DEFAULT_BLOCK ipf默认规则,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服务器 INTARNDNS="0.0.0.0" #DNS服务器 INTARNWEB="0.0.0.0" #WEB服务器 INTARNSSL="0.0.0.0" #SSL服务器 INTARNRTSP="0.0.0.0" #RTSP服务器 INTARNMYSQL="0.0.0.0" #MYSQL服务器 INTARNJABBER="0.0.0.0" #JABBER服务器 #ADSL拨号网络设备号tun0 ADSLDEV="tun0" ADSLIP=`ifconfig $ADSLDEV | grep inet | cut -d ' ' -f 2` until [ $ADSLIP ] do sleep 5 done #动态生成ipnat.rules规则 echo '######################################################' > /etc/ipnat.rules echo '#/etc/ipnat.rules #' >> /etc/ipnat.rules echo '######################################################' >> /etc/ipnat.rules echo '' echo '#把所有的内部网络IP伪装成ADSL拨号IP' >> /etc/ipnat.rules echo 'map '$ADSLDEV' '$INTARNNET' -> '$ADSLIP'/32 portmap tcp/udp 10000:65000' >> /etc/ipnat.rules if [ $INTARNFTP != "0.0.0.0" ] then echo '' echo '#把对ADSL拨号IP的FTP服务映射到服务网络的FTP服务器上'