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


# 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端口的设置:
natd8668/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为YES,以使得自动启动natd守护进程,还需要指定natd使用的网络界面natd_interface的值,帮助将正确的数据包发送给natd,并使系统执行natd时使用正确的参数 。而设置项natd_flags用来指定其他natd需要的参数,例如用于指定natd设置文件等,简单情况下不需要使用这个设置项 。

推荐阅读