设置和使用ipfilter-FreeBSD 技术文摘
另外,natd的功能还不能满足有些要求,natd能做静态地址转换和使用一个伪装地址为多个内部地址服务,但其不能从一个给定的地址池中,为内部地址自动分配IP地址。毕竟natd是一个较早的网络地址转换工具,当前的发展已经比较迟缓。但是由于ipfw是FreeBSD系统的一部分,并且过滤和地址转换是由不同的部分来完成的,结构清晰,因此对于大部分情况都很适合,因此一般仍应使用ipfw/natd。
如果ipfw/natd不能满足使用者的需要,能避免ipfw/natd缺点的另一个网络地址转换和数据包过滤的工具是ipfilter。虽然FreeBSD是其支持的主要系统,但它其实是一个支持多平台的独立软件,不仅能运行在FreeBSD上,也能运行在其他多种Unix系统中。由于它被包括进FreeBSD基本系统中,因此在FreeBSD 下配置ipfilter同样也非常轻松。
ipfilter的网址为http://cheops.anu.edu.au/~avalon/, FreeBSD 3.0之前它不包括在FreeBSD的基本系统中,需要手工设置。
由于ipfilter与ipfw同为在内核级对IP数据包进行处理的系统,因此他们相互冲突,不能同时并存在一个内核内,否则内核的TCP/IP功能就不能正常执行。为了使用ipfilter,就需要重新定制内核,删除所有 IPFIREWALL的设置,而添加IPFILTER的设置。
#optionsIPFIREWALL#optionsIPDIVERToptionsIPFILTERoptionsIPFILTER_LOG |
选项IPFILTER为支持IPFILTER的基本代码,IPFILTER_LOG为支持IPFILTER的统计记录能力。需要增加这些选项,并注释IPFIREWALL、IPDIVERT及其相关选项。此后,就可以重新定制、安装新内核。然而在重新启动之前,还需要在rc.conf中设置firewall_enable的值为NO,当系统内核不存在IPFIREALL功能又设置了firewall_enable的时候,启动文件就会自动载入支持这个功能的可加载模块ipfw.ko,载入ipfw.ko之后的系统内核就等同于使用IPFIREWALL内核选项的系统,与 ipfilter发生冲突。然而ipfilter仍然需要设置gateway_enable,以打开系统内核的数据包转发功能。
使用新内核启动系统之后,如果本地计算机的网络功能正常,此时再使用ipfw就会报告错误。这就能使用ipfilter 来设置包过滤和网络地址转换了。
- 设置地址转换
为了在ipfilter下设置网络地址转换,首先要创建一个地址转换设置文件,例如/etc/ipflter .nat。与ipfw/natd的相似,最基本的用法为使用一个外部地址来转换所有内部地址,此时必须进行端口转换,因此ipfilter.nat中应该包含的NAT规则为:
map fxp1 192.168.3.0/24 -> 202.102.245.60/32 portmap tcp/udp 10000:65000
这个设置中,首先使用map关键字指明是进行地址转换的设置,此后的fxp1为连接外部网络的网络界面,在这个网络界面上执行数据包的IP地址和端口地址转换,第三个参数为进行转换的内部地址的范围,此后跟随的一个-> 符号表示进行地址转换,第五个参数为要转换为的外部地址,当指定子网掩码长度为32时就表示这只是一个主机而非子网范围,后面portmap关键字对tcp/udp协议进行端口转换,其使用的映射端口范围为在10000到65000之间,也可以对tcp或udp协议分别指定转换端口的范围。
如果使用者拥有的不仅是一个主机,而是一个具备多个合法IP地址的子网,这样就能设置使用地址池,为内部向外连接的计算机动态分配合法的外部IP地址,这样的设置更为简单,因为不需要指定portmap进行地址转换。
map fxp1 192.168.3.0/24 -> 202.102.245.0/26
显然内部计算机的数量显然要多于系统拥有的合法地址的数量,上例中内部地址最多254个,而合法的外部地址仅仅有62个,这样如果向外连接的计算机一多,必然出现地址资源用光的问题。因此动态分配IP一般和端口转换结合起来,以避免出现地址消耗完毕的问题。
map规则是用于转换外出数据包的源地址,使得被转换后的地址好象是从外部地址中发起的。而另一个规则rdr 用于转换数据包中的目的地址,这样就能使得一个数据包被转发到某个特定计算机上进行处理,这可用于构建端口映射关系。
rdr fxp1 202.102.245.60 port ftp -> 192.168.3.2 port ftp
上面的规则将指定ipfilter在fxp1网络界面上将发送给202.102.245.60,端口为ftp 的数据包,转换为发送给内部地址192.168.3.2。
rdr的另一个重要用途是可以用以构建透明的代理服务器,普通代理服务器都需要在客户机上进行设置,如果不进行设置,客户机将直接访问Internet上的计算机而不通过代理服务器,然而防火墙可以将这些应用请求转发给代理服务器,完成代理工作。此时对外界发送请求是在内部网络界面fxp0上发起的,因此也要在这里进行地址转换,而使用0.0.0.0/0 代表对所有目的地址,并且是80端口的浏览请求都转发到127.0.0.1上去,而127.0.0.1 必须运行代理服务器软件,以提供代理服务。
rdr fxp0 0.0.0.0/0 port 80 -> 127.0.0.1 port 80
虽然不是所有的应用代理服务都能使用透明代理的方法来减轻客户设置的负担,但绝大多数代理完全可以使用这种方法,使得客户不需要修改软件设置,就能利用代理服务器,而代理服务器具备大量的缓冲区,能够节约内部网络的Internet 访问流量并加速Internet访问速度。
因此,一个简单的不支持透明代理服务器的设置文件ipnat.conf例子为:
map fxp1 192.168.3.0/24 -> 202.102.245.0/26 portmap tcp/udp 10000:65000map fxp1 192.168.3.0/24 -> 202.102.245.0/26rdr fxp1 202.102.245.60 port ftp -> 192.168.3.2 port ftp |
在这样的设置下,tcp和udp在地址资源消耗完毕之后将进行端口转换,而其他协议,如icmp,将直接进行地址转换而不必进行端口转换。此后就可以将这个转换规则加入系统中,需要执行ipnat命令:
# ipnat -C# ipnat -f /etc/ipnat.conf |
当前使用-C参数用于清除现有的转换规则,-f用于从配置文件中读取转换规则。设置了转换规则之后,就可以使用-l参数查看当前设置的转换规则和已经激活的转换关系。
# ipnat -lList of active MAP/Redirect filters:map fxp1 192.168.3.0/24 -> 202.102.245.0/26 portmap tcp/udp 10000:65000map fxp1 192.168.3.0/24 -> 202.102.245.0/26 rdr fxp1 202.102.245.60/32 port 21 -> 192.168.3.2 port 21 tcpList of active sessions:RDR 192.168.3.2 21 <- -> 202.102.245.60 21 [202.102.245.25 35635] 863992 0 407MAP 192.168.3.2 1024 <- -> 202.102.245.60 10000 [202.102.245.25 9999] 863993 0 1f09 |

