当前所在位置: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/

声明:本站的文章和软件是本人从网上收集整理的(除本人的作品之外),所有版权属于作者,
如有侵犯您的权益,请指出,本站将立即改正,谢谢.

Copyright 2000 www.newok.com