当前所在位置:FreeBSD使用大全>> |
FreeBSD连载(78):设置和使用ipfw/natd(2) |
---|
作者:王波 |
RFC1918中定义了一些只用于内部网络的IP地址,这些地址不能用于Internet上的计算机,而只能用于内部网络中。这里禁止从外部网络界面上向内部地址进行数据传输,以防止外部网络向内部网络的地址进行连接,也是防火墙的重要功能之一。 注意,上例中与系统提供的缺省设置是不同的,将其中对应于实际使用的内部地址的一行加上了注释。这是因为该设置与natd相互冲突,使得natd发送的数据(具备内部网络地址)也被过滤。可以简单的注释对应本地网络地址的设置项,以使得它们能够相互协议,而将保护功能留给natd来完成。如果不使用natd,就不必使用上面的注释。 # Allow TCP through if setup succeeded $fwcmd add pass tcp from any to any established # Allow setup of incoming email $fwcmd add pass tcp from any to ${oip} 25 setup # Allow access to our DNS $fwcmd add pass tcp from any to ${oip} 53 setup # Allow access to our WWW $fwcmd add pass tcp from any to ${oip} 80 setup # Reject&Log all setup of incoming connections from the outside $fwcmd add deny log tcp from any to any in via ${oif} setup # Allow setup of any other TCP connection $fwcmd add pass tcp from any to any setup 此后屏蔽除了email,www,dns之外的其他向内部网络的TCP连接请求,而只允许向外进行连接。当实际内部网络要向外提供服务时,再添加连接许可。 # Allow DNS queries out in the world $fwcmd add pass udp from any 53 to ${oip} $fwcmd add pass udp from ${oip} to any 53 # Allow NTP queries out in the world $fwcmd add pass udp from any 123 to ${oip} $fwcmd add pass udp from ${oip} to any 123 # Everything else is denied as default. 然后定义UDP连接的限制,同样也只允许DNS和NTP数据包通过,这可以用于屏蔽类似BO之类的远程操纵程序。 elif [ "${firewall_type}" != "UNKNOWN" -a -r "${firewall_type}" ]; then $fwcmd ${firewall_type} fi 如果使用者喜欢自己定制过滤规则,而不是在系统提供的规则基础上更改,那么可以将规则放入一个文件中,在rc.conf文件中设置firewall_enable=”YES”的基础上,将firewall_type的值改为放置ipfw规则的文件名。这样系统启动时就能够使用ipfw自动执行这些配置。但如果只是对过滤规则的少量更改,就可以直接修改rc.firewall文件。 使用natd设置地址转换 natd与ipfw相互配合,能够实现网络地址翻译的能力。内核通过一个特定的divert类型的端口,将需要转换的数据包交给natd,而natd转换之后,再发送回内核,由内核再进行转发。它的好处不但是能提供防火墙能力,还能使得内部计算机能共享外部网络地址,这在IP地址空间比较紧张的当前是一个非常有用的技术。 当应用网络地址翻译时,可供选择的内部IP有:10.0.0.0到10.255.255.255,172.16.0.0到 172.31.255.255,192.168.0.0到192.168.255.255。这些地址由RFC1918中定义为内部地址,不会出现在Internet上。 FreeBSD下有几种软件能实现部分或全部NAT功能,功能最简单的是用户级ppp提供的alias功能,使用alias参数启动ppp将使ppp将所有来自其他网络介面的数据包中的源IP地址改变为tun0网络界面的IP ,转发到ppp连接上去。这种IP伪装的方式虽然功能简单,但对于拨号将内部网络和Internet连接的用户非常适合。 设置natd需要以下的步骤,首先设置好包过滤支持,包括内核中的IPFIREWALL和rc.conf中的 gateway_enable参数设置。它需要内核支持IPDIVERT选项,如果没有设置这个选项,就需要重新编译支持这些选项的内核;然后需要为natd指定一个divert端口,用于接收和发送从内核转发过来的包。这需要在/etc/services 中增加一个divert端口的设置: natd 8668/divert 然后需要将所有的数据包都发送给相应的divert端口natd,然后由监听这个端口的守护进程natd 接收并转换。 # /sbin/ipfw -f flush # /sbin/ipfw add divert natd all from any to any via fxp0 # /sbin/ipfw add pass all from any to any 上面的命令中使用了一个新的ipfw指令divert,这个指令就对符合这个规则的数据包通过divert规定的端口natd进行地址转换。但是divert指令和log和count指令相似,它并没有终止过滤规则,而是继续进行数据包过滤,只是此后的过滤将是针对转换后的数据包进行的了。 执行了这些ipfw指令之后,而由于还没有启动natd守护进程,那么网络的正常连接都不再能进行了,发送到 divert的端口natd的数据包就被丢掉。直到启动natd进程,通过它进行处理之后,数据包才会正常发送。 最简单的启动natd的指令为: # natd -interface fxp1 此时,natd将内部的向外连接中的内部地址转换为fxp1上的IP地址,而内部网络的计算机必须设置这个防火墙为它们的路由器,以便将数据包交给它进行转发。但由于整个网络对外只表现为一个地址,外部网络并不需要了解这台防火墙的路由能力。 如果要在系统启动时自动设置地址转换,就需要将这些ipfw/natd的过滤规则与系统启动文件结合在一起。缺省的启动文件已经支持了ipfw/natd,因而仅仅需要打开启动文件中相关设置就可以了。这不但需要在rc.conf 中设置gateway_enable,firewall_enable,还需要设置natd_enable为YE S,以使得自动启动natd守护进程,还需要指定natd使用的网络界面natd_interface的值,帮助将正确的数据包发送给natd,并使系统执行natd时使用正确的参数。而设置项natd_flags用来指定其他natd 需要的参数,例如用于指定natd设置文件等,简单情况下不需要使用这个设置项。 当打开natd_enable时,将在其他过滤规则之前添加这个过滤规则,但是其他规则同样也会生效,因为当数据包从natd发送回系统之后,系统再对其应用过滤规则。 不过,由于在natd转换IP地址之后还应用过滤规则,因此这些数据包还有可能被过滤。尤其在同时设置了 firewall_type为simple以执行rc.firewall中的防火墙过滤设置的时候,就需要注意其中与na td相冲突的设置。simple过滤规则中存在屏蔽外部计算机对RFC1918规定的IP地址进行访问的设置,然而n atd将正常通信的数据包中的地址转换为了内部IP地址,因而缺省设置将阻止这些数据包发送到内部计算机中。 为了和natd协作,必须修改其中过滤设置,以保证经natd转换过的数据包能发到内部计算机上。一般情况下,可以简单的rc.firewall将针对发送到本地网络的过滤规则设置注释掉就可以了,而从本地网络发送到外部网络的数据包在应用过滤规则之前,就已经进行完地址转换了,因此就不受规则影响。前一部分中介绍rc.firewall时,给出了进行注释的例子。另一种方法是调整过滤规则和顺序,将屏蔽这些内部地址的规则放置到divert指令之前。 natd的高级设置 使用-interface参数(或者使用其简写形式-n)启动的natd,可将所有内部网络向外的请求转换为该interface界面使用的IP地址,与外界进行通信。这种方式中,所有的连接中的内部地址不但转换的IP地址,同时也要转换端口地址,以避免地址冲突,并且外部网络只能连接到防火墙,而不能访问内部计算机上的服务。natd还有种种高级设置,使得系统能使用更复杂的地址转换功能。更复杂的情况是防火墙拥有一个合法子网,具有多个可利用的IP地址,此时防火墙对外表现为一个路由器,负责一个内部子网。 使用natd时,计算机至少必须拥有一个合法的外部地址,用于将内部地址转换为外部地址时使用,当使用 -interface时,这个值被设置为该网络界面绑订的IP地址,如果该网络界面上的IP地址可能改变(例如它被设置为d hcp客户端,或者是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可以支持其他种类的协议。由于路由交换协议是整个网络统一规定的,因此必须根据统一使用。 另一个非常有用的参数是-redirect-port,它是用于将对某个IP地址固定端口的连接请求,转发至指定内部计算机中。这个参数非常灵活,针对tcp或udp进行设置。例如将对-alias_address定义地址的 http请求转发到内部地址192.168.3.3的另一个端口8080上。 # natd -alias_address 202.102.245.60 -redirect_port tcp 192.168.3.3:8080 80 当然也可以为其他地址,如202.102.245.17,设置映射。 # natd -alias_address 202.102.245.60 \ -redirect_port tcp 192.168.3.3:8080 202.102.245.17:80 进一步可以使用-redirect_port为特定的外部计算机的特定连接进行映射。 还可以使用-f或-config参数指定natd的配置文件,从文件中而非从命令行读取natd的设置,使得设置更为清晰明了。下面的设置文件例子中使用了另外几个很有用的参数。 alias_address 202.102.245.60 deny_incoming yes unregistered_only yes same_ports yes use_sockets yes deny_incoming用于拒绝向alias_address发起的所有连接请求,用来保护网络内部安全,这个参数可以和-redirect_port参数结合,控制提供的网络服务。 unregistered_only用于只对RFC1918定义的内部网址进行地址转换,防止出现错误设置影响正常的路由设置。 same_ports在网络转换时尽量选择与原有数据包相同的端口,这样来保证一些与端口相关的服务能够被尽可能满足,但这并不表示普通的地址转换会百分之百使用同样的端口,在将多个内部转换为一个外部地址时,总会有端口冲突发生的可能,真正要避免冲突,还必须使用-redirect_port直接指定。 use_sockets允许natd查看ftp、irc等连接的数据内部,以根据内容设置正确的端口,这将占用较多的系统资源,因此一般不要使用这个选项。然而和same_port协作使用,可以支持更复杂的客户程序。 其他还有一些设置选项,如log参数指定natd将日志记录到/var/log/alias.log文件中, dynamic参数用于和interface参数协作,跟踪网络界面的IP地址改变的信息,等等。 在设置文件中指定的参数,其形式与在命令行中使用的方式相似,不同之处在于有的参数在配置文件中需指定yes 或no,而在命令行中不需特别指定就意味着使用了yes属性。如直接使用-log而非-log yes。设置好这个设置文件之后,就可以启动natd了。 # natd -f filename 未完,待续。。。 |
来源:http://freebsd.online.ha.cn/ |