[原创]用ipfilter在动态ip环境下做重定向

发表于:2007-06-09来源:作者:点击数: 标签:
[这个贴子最后由bsdbase在2002/11/2902:28pm编辑] fromhttp://www.bsdbase.com/doc/ipfilter-dynamic-ip-rdr.txt 用ipfilter在动态ip环境下做重定向 阿土tutu@bsdbase.com 2002.11.28 欢迎斧正,转载必须保留版权信息 在ipfilter的nat规则中,如果出口ip地址

[这个贴子最后由bsdbase在 2002/11/29 02:28pm 编辑]

from http://www.bsdbase.com/doc/ipfilter-dynamic-ip-rdr.txt

          用ipfilter在动态ip环境下做重定向 
              阿土 tutu@bsdbase.com
                  2002.11.28
                  
欢迎斧正,转载必须保留版权信息                 

    在ipfilter的nat规则中,如果出口ip地址是动态ip,比如PPPoE拨号或DHCP,那么可以使用类似
map tun0 192.168.0.0/24 -> 0.0.0.0/32 的语法进行地址(端口)映射;可是类似
rdr tun0 0/32 port rtsp -> 192.168.2.100 port rtsp tcp/udp这样的语法却是不对的,因为rdr
规则要求第三个域是ip包的目的地址,通常是该出口网卡的地址,显然,当别人访问你的机器的时候tcp/udp包的目的地址是你的当前地址,而不是
0/32,所以,rdr tun0 0/32 ...这样的规则是不会生效的,你必须以该网卡的当前ip地址来做这个规则;
ipfilter本身没有提供这样的定义使得我们可以方便的做这样的规则,下面是我做的脚本,用来动态的获得
当前出口网卡地址,并一次刷新ipfilter规则。

1。内核中编译ipfilter的支持,不能让ipfilter以模块的形式载入;
因为我没有在/etc/rc.conf中指定ipfilter_enable="yes";
2。编制如下shell script;

#!/bin/sh
#vi /usr/local/sbin/ipf.sh
#此脚本用来刷新ipf规则;
#注意/etc/ipf.rules是根据/etc/ipf.rules.template这个模板自动生成的;
#所以,如果你要改规则,应该改/etc/ipf.rules.template这个模板;
#For dynamic ip ipf rules
#$EXT_NIC is the inte.net connected NIC
#$EXT_ADDR is the internet connected NIC ADDRESS.

#get dynamic nic.
#获得默认路由经过的网卡,即所谓的外网网卡;
EXT_NIC=`netstat -arn | grep "default\>" | awk '{print $6 }'`
if [ -z $EXT_NIC ];
then
echo "ERROR default gateway NO found !!!"
exit 1
else
export EXT_NIC
#get dynamic nic and ip.
#获得外网卡地址;
EXT_ADDR=`ifconfig $EXT_NIC | grep "inet\>" | awk '{print $2}'`
if [ -z $EXT_ADDR ];
then
echo "ERROR:EXT_ADDR NO found !!!"
exit 1
else
export EXT_ADDR
#根据上述信息参照模板生成规则;
echo "#NOTE:" >/etc/ipf.rules 
echo "#DON'T modify /etc/ipf.rules for your ipf rules ,Just modify /etc/ipf.rules.template instance !!!" >>/etc/ipf.rules
echo "#Read /usr/local/sbin/ipf.sh for detail." >>/etc/ipf.rules
echo "#." >>/etc/ipf.rules  
                echo "#Reflashed date:`date`." >>/etc/ipf.rules
sed s/\$EXT_NIC/$EXT_NIC/g /etc/ipf.rules.template >/etc/ipf.rules.nic
sed s/\$EXT_ADDR/$EXT_ADDR/g /etc/ipf.rules.nic >>/etc/ipf.rules
#刷新规则;
/sbin/ipf -Fa
/sbin/ipf -y -f /etc/ipf.rules
fi
fi
#end /usr/local/sbin/ipf.sh

#!/bin/sh
#vi /usr/local/sbin/ipnat.sh
#此脚本用来刷新ipnat规则;
#注意/etc/ipnat.rules是根据/etc/ipnat.rules.template这个模板自动生成的;
#所以,如果你要改规则,应该改/etc/ipnat.rules.template这个模板;
#For dynamic ip ipnat rules
#$EXT_NIC is the internet connected NIC
#$EXT_ADDR is the internet connected NIC ADDRESS.

#get dynamic nic.
#获得默认路由经过的网卡,即所谓的外网网卡;
EXT_NIC=`netstat -arn | grep "default\>" | awk '{print $6 }'`
if [ -z $EXT_NIC ];
then
echo "ERROR default gateway NO found !!!"
exit 1
else
export EXT_NIC
#get dynamic nic and ip.
#获得外网卡地址;
EXT_ADDR=`ifconfig $EXT_NIC | grep "inet\>" | awk '{print $2}'`
if [ -z $EXT_ADDR ];
then
echo "ERROR:EXT_ADDR NO found !!!"
exit 1
else
export EXT_ADDR
#根据上述信息参照模板生成规则;
echo "#NOTE:" >/etc/ipnat.rules 
echo "#DON'T modify /etc/ipnat.rules for your nat rules ,Just modify /etc/ipnat.rules.template instance !!!" >>/etc/ipnat.rules
echo "#Read /usr/local/sbin/ipnat.sh for detail." >>/etc/ipnat.rules
echo "#." >>/etc/ipnat.rules  
                echo "#Reflashed date:`date`." >>/etc/ipnat.rules
sed s/\$EXT_NIC/$EXT_NIC/g /etc/ipnat.rules.template >/etc/ipnat.rules.nic
sed s/\$EXT_ADDR/$EXT_ADDR/g /etc/ipnat.rules.nic >>/etc/ipnat.rules
#刷新规则;
/sbin/ipnat -C
/sbin/ipnat -v -f /etc/ipnat.rules
fi
fi
#end /usr/local/sbin/ipnat.sh

#!/bin/sh
#vi /usr/local/sbin/ipfrenew
#调用预先编制的脚本刷新ipf以及ipnat规则;
/usr/local/sbin/ipf.sh
/usr/local/sbin/ipnat.sh
#显示当前状况;
/sbin/ipnat -l |grep -v '<- -> '
echo List of active sessions have been cutted.
/sbin/ipfstat -if
/sbin/ipfstat -of
#end of /usr/local/sbin/ipfrenew

#设置可执行;
chmod 700 /usr/local/sbin/*

3。在会更换ip的程序中调用/usr/local/sbin/ipfrenew
PPPoE:

#vi /etc/ppp/ppp.linkup
default:
pppoe:
  shell "/usr/local/sbin/ipfrenew"
#end of /etc/ppp/ppp.linkup
  
#假设你的PPPoE配置名称叫pppoe;

DHCP(Cable modem):

#!/bin/sh
#vi /etc/dhclient-exit-hooks
/usr/local/sbin/ipfrenew
#end of /etc/dhclient-exit-hooks

#至于说调用的语法,自己查man,都说的很清楚了;

#罗嗦一句,如果你不怕麻烦,这个方法用在固定ip的环境也是可以的,就是要在/etc/rc.local中调用/usr/local/sbin/ipfrenew,不能依赖
#/etc/rc.conf中的ipfilter_enable设置;因为当系统处理ipfilter_enable设置时,还没有设置default gateway;

#begin of /etc/ipnat.rules.template
rdr $EXT_NIC $EXT_ADDR/32 port 5022 -> 192.168.1.82 port 22
rdr $EXT_NIC $EXT_ADDR/32 port 5023 -> 192.168.1.82 port 23
rdr $EXT_NIC $EXT_ADDR/32 port 9900 -> 192.168.1.82 port 9900

# For 192.168.0.0/24
# ------------------------------------------------------------ 
# Use ipfilter FTP proxy for hosts behind NAT doing transfer 
# mode active. 
# ------------------------------------------------------------ 
map $EXT_NIC 192.168.0.0/24 -> $EXT_ADDR/32 proxy port ftp ftp/tcp 


# ----------------------------------------------------------- 
# Use ipfilter IKE proxy for ESP packets for hosts behind NAT 
# IP Filter 3.4.21 and beyond only. 
# ----------------------------------------------------------- 
map $EXT_NIC 192.168.0.0/24 -> $EXT_ADDR/32 proxy port 500 ipsec/udp 


# ----------------------------------------------------------- 
# Use ipfilter RealAudio proxy for hosts behind NAT 
# ----------------------------------------------------------- 
map $EXT_NIC 192.168.0.0/24 -> $EXT_ADDR/32 proxy port 7070 raudio/tcp 

# ----------------------------------------------------------- 
# Use ipfilter H323 proxy for hosts behind NAT 
# ----------------------------------------------------------- 
map $EXT_NIC 192.168.0.0/24 -> $EXT_ADDR/32 proxy port 1720 h323/tcp 


# ----------------------------------------------------------- 
# Map all internal UDP and TCP traffic to the external IP address 
# ----------------------------------------------------------- 
map $EXT_NIC 192.168.0.0/24 -> $EXT_ADDR/32 portmap tcp/udp 40000:60000 


# ----------------------------------------------------------- 
# Map all other traffic e.g. ICMP to the external IP address 
# ----------------------------------------------------------- 
map $EXT_NIC 192.168.0.0/24 -> $EXT_ADDR/32 
#end of /etc/ipnat.rules.template

#begin of /etc/ipf.rules.template
#ipfilter default to pass;
block in log quick all with ipopts 
block in log quick all with short 
block in log quick all with frag  

block in log on $EXT_NIC all
block out log on $EXT_NIC all

block in quick on $EXT_NIC from 10.0.0.0/8 to any
block in log quick on $EXT_NIC from 192.168.0.0/16 to any
block in log quick on $EXT_NIC from 172.16.0.0/12 to any
block in log quick on $EXT_NIC from 127.0.0.0/8 to any
block in log quick on $EXT_NIC from 169.254.0.0/16 to any

pass in on $EXT_NIC proto icmp from any to any icmp-type echo
pass in on $EXT_NIC proto icmp from any to any icmp-type echorep

#for http and https
pass in quick on $EXT_NIC proto tcp from any to any port = 80 keep state
pass in quick on $EXT_NIC proto tcp from any to any port = 443 keep state

#for mail 
pass in quick on $EXT_NIC proto tcp from any to any port = 25 keep state
pass in quick on $EXT_NIC proto tcp from any to any port = 110 keep state

pass out quick on $EXT_NIC proto tcp/udp from any to any keep state 
pass out quick on $EXT_NIC proto icmp from any to any keep state 

block return-rst in log on $EXT_NIC proto tcp from any to any 
block return-icmp-as-dest(port-unr) in log on $EXT_NIC proto udp from any to any 
#end of /etc/ipf.rules.template



 B2Sun 回复于:2003-05-05 22:42:55
大侠,你好,有问题请教您

 B2Sun 回复于:2003-05-05 22:46:39
如何在Openbsd中邦定MAC地址防止IP占用上网 
-------------------------------------------------------------------------------- 
-------------------------------------------------------------------------------- 我想用OPENBSD3.2建立一个防火墙PF 
我想在防火墙中加入地址邦定功能,:MAC和IP地址邦定一起! 
这样就可以搞定限制了别个不会去冒充上网,(当然防君子不防小人)如果有人改MAC地址,那另当别说了我们只能作到一定程度的防范。。。
 
如:IP:192.168.4.1-192.168.4.100/24这个段可以上网 
而IP:192.168.4.101-254/24这个段不可以上网 
如果没有MAC地址和IP邦定的话,那就很难办了!如果不能上网的机器在能上网的机器开机之前启动的话,它就可以上网了,这也是我们不想的事情! 
如果192.168.4.101的机器把自己的IP改为192.168.4.1就可以上网了 
如果我们做了MAC地址邦定的话,就是改了IP地址也没有用,不能上网。 
(但还是可以冒充IP!如果可以限制不能改IP地址就好了!)[另外
我看到有人说用 交换机的端口可以设置MAC邦定,但我用的是HUB,不好意思,这个办法否了!
我看了您的贴子,感觉您才是真的有水平的人,能不能帮助在下解决问题,
 来日定当重谢!

 我的邮件:along@b2sun.com

 B2Sun 回复于:2003-05-05 22:54:37
??

原文转自:http://www.ltesting.net