78 FreeBSD连载:设置和使用ipfw/natd( 六 )


当打开natd_enable时,将在其他过滤规则之前添加这个过滤规则,但是其他规则同样也会生效,因为当数据包从natd发送回系统之后,系统再对其应用过滤规则 。
不过,由于在natd转换IP地址之后还应用过滤规则,因此这些数据包还有可能被过滤 。尤其在同时设置了firewall_type为simple以执行rc.firewall中的防火墙过滤设置的时候,就需要注意其中与natd相冲突的设置 。simple过滤规则中存在屏蔽外部计算机对RFC1918规定的IP地址进行访问的设置,然而natd将正常通信的数据包中的地址转换为了内部IP地址,因而缺省设置将阻止这些数据包发送到内部计算机中 。
为了和natd协作,必须修改其中过滤设置,以保证经natd转换过的数据包能发到内部计算机上 。一般情况下,可以简单的rc.firewall将针对发送到本地网络的过滤规则设置注释掉就可以了,而从本地网络发送到外部网络的数据包在应用过滤规则之前,就已经进行完地址转换了,因此就不受规则影响 。前一部分中介绍rc.firewall时,给出了进行注释的例子 。另一种方法是调整过滤规则和顺序,将屏蔽这些内部地址的规则放置到divert指令之前 。
natd的高级设置
使用-interface参数(或者使用其简写形式-n)启动的natd,可将所有内部网络向外的请求转换为该interface界面使用的IP地址,与外界进行通信 。这种方式中,所有的连接中的内部地址不但转换的IP地址,同时也要转换端口地址,以避免地址冲突,并且外部网络只能连接到防火墙,而不能访问内部计算机上的服务 。natd还有种种高级设置,使得系统能使用更复杂的地址转换功能 。更复杂的情况是防火墙拥有一个合法子网,具有多个可利用的IP地址,此时防火墙对外表现为一个路由器,负责一个内部子网 。
使用natd时,计算机至少必须拥有一个合法的外部地址,用于将内部地址转换为外部地址时使用,当使用-interface时,这个值被设置为该网络界面绑订的IP地址,如果该网络界面上的IP地址可能改变(例如它被设置为dhcp客户端,或者是PPP连接),-dynamic参数能使natd跟踪该界面上的地址更改 。如果不使用-interface参数指定网络界面,就必须直接使用-alias_address指定natd使用的外部IP地址 。alias_address定义的地址可以是防火墙本身外部网络界面上拥有的合法IP地址之一,也可以是作为路由器的防火墙的内部网络所拥有的合法IP地址之一 。
natd可以使用-redirect_address参数,设置静态IP地址转换,例如使用参数”-redirect_address iip oip”,将内部地址iip与外部地址oip进行映射,则所有发送给oip的连接将被转给内部的iip 。
# natd -alias_address 202.102.245.60 -redirect_address 192.168.3.2 202.102.245.17上面的命令将使得防火墙使用202.102.245.60作为内部计算机向外连接的缺省地址,而192.168.3.2被映射为202.102.245.17,可以允许外部网络上的计算机对其进行访问 。
此时外部网络应该将发送往这两个ip地址的数据都发送到这个防火墙上,一般情况下这个防火墙应对外表现为一个路由器,负责将包括这两个IP地址在内的网络连接到外部网络上,而外界网络上的路由器也具有达到它的正确路由 。但也可以通过Proxy ARP或在防火墙外部网络界面上绑订多个ip地址的方法来实现 。
为了让外部路由器了解这个防火墙负责的网络,除了在外部路由器上设置静态路由之外,还可以使用动态交换路由协议,将防火墙的路由数据与外部路由器动态交换 。这就需要使用与外部路由器相同的路由交换协议,常用的内部路由交换协议有rip, rip 2,以及ospf,其中routed用于支持rip协议,而gated可以支持其他种类的协议 。由于路由交换协议是整个网络统一规定的,因此必须根据统一使用 。

推荐阅读