一、需求说明
本人需要在一台装有FreeBSD8.3的服务器上搭建NAT防火墙做地址转换,服务器有两个网卡bge0和bge1,bge0通过思科三层交换机端口fa0/6与内网相连,bge1连接至公网,假设其IP为3.3.3.3,网络拓扑如下所示:
二、NAT搭建
1、设定内核
首先,我们必须先确定核心有支持 NAT 及防火墙功能。FreeBSD 预设的 GENERIC 核心并未加入此功能,因此,请先编辑您的核心设定档,加入下列设定,并重新编译核心。如果您不知道如何修改核心设定,请参考「编译核心」一章的说明。假设 我们要修改的核心设定档为 /usr/src/sys/i386/conf/GENERIC,先 cd /usr/src/sys/i386/conf/,再 ee GENERIC 加入下列几行:
# 防火墙
options IPFIREWALL
# 支持 NAT
options IPDIVERT
# 下面这一行是预设允许所有封包通过,如果没有这一行,
# 就必须在 /etc/rc.firewall 中设定封包的规则。
# 这条规则内定编号是 65535,也就是所有规则的最后一条
# 如果没有加这一条规则,内定就是拒绝所有封包,
# 只允许规则中允许的封包通过。
options IPFIREWALL_DEFAULT_TO_ACCEPT
# 这一行是让你可以在 ipfw 中设定要记录哪些封包,
# 如果没有这一行,就算设定了要留下记录也不会有作用。
options IPFIREWALL_VERBOSE
# 这一行是限制每一条规则所要记录的封包数量,
# 因为同样的规则可能有许多记录,加上这一条可以使
# 同样的记录重复数减少,以避免记录文件爆增。
options IPFIREWALL_VERBOSE_LIMIT=10
# 下面这一行是用来支援封包转向,
# 当你要使用 fwd 动作时必须要有这一项设定。
options IPFIREWALL_FORWARD
# 如果要使用 pipe 来限制频宽,必须加入下列选项以支持 dummynet。
options DUMMYNET
我们在上述设定中加入了许多项目,基本上,一定要有的项目为 IPFIREWALL 及 IPDIVERT,其它项目是为了支持限制频宽或记录信息使用。编辑完核心设定后,请重新编译并安装新的核心,重开机之后核心就己经支持防火墙及 NAT 了。
2、修改rc.conf
设定连接至外网的网卡bge1,并确定可以上网,这里暂不设置bge0,由于要划分VLAN,所以在后面设置。我们要修改 /etc/rc.conf 以启动 NAT 功能:
#设定默认路由
defaultrouter="3.3.3.1"
# 设定外网卡的 IP
ifconfig_bge1="inet 3.3.3.3 netmask 255.255.255.0"
# 设定启用 gateway 的功能。
gateway_enable="YES"
# 设定启用防火墙功能,并设定防火墙类型为 OPEN。
# FreeBSD 的防火墙设定档会自动为 NAT 加入相关的设定。
firewall_enable="YES"
firewall_type="OPEN"
# 设定 NAT 所使用的对外网络卡
natd_interface="bge1"
natd_enable="YES"
编辑结束之后,重启网络/etc/netstart restart,在你的网关以及DNS设置正确的情况下应该是可以正常上网的。
3、编辑/etc/rc.local
如果没有,就新建该文件。由于我想在bge0上划分多个vlan,所以我在该文件中写入以下配置,以便开机能够自动运行。我在bge0上划分了两个vlan,分别是vlan3(192.168.0.69)和vlan99(192.168.2.69):
/sbin/ifconfig vlan3 create
/sbin/ifconfig vlan3 vlan 3 vlandev bge0
/sbin/ifconfig vlan3 192.168.0.69 255.255.255.0
/sbin/ifconfig vlan3 mtu 1500
/sbin/ifconfig vlan3 up
/sbin/ifconfig vlan99 create
/sbin/ifconfig vlan99 vlan 99 vlandev bge0
/sbin/ifconfig vlan99 192.168.2.69 255.255.255.0
/sbin/ifconfig vlan99 mtu 1500
/sbin/ifconfig vlan99 up
同时你还可以在该文件中加入你的路由配置!
如/sbin/route add 192.168.0.0/16 192.168.0.1(这是我的路由,根据个人实际情况设置)
之后记得要用命令/etc/netstart restart重启网络。
在我重启网络之后,将思科三层交换机上的相应端口模式设置为trunk,同时并允许所有vlan通过,但我在服务器是还是ping不通交换机192.168.0.1、内网192.168.0.0/24网段和192.168.2.0/24网段的主机,从交换机也ping不通服务器。刚开始我一直怀疑是NAT服务器上的vlan网卡(即bge0)的问题,我甚至尝试将bge0设置为promiscuous(混杂)模式,但还是不行,后来我仔细检查了交换机端口fa0/6的配置:
interface FastEthernet0/6
description 159_7_bge0
switchport access vlan 3
switchport trunk encapsulation dot1q
switchport mode trunk
snmp trap mac-notification added
!
发现为什么端口上既有access模式,又有trunk模式,我怀疑之前端口是access模式,我在将其设置为trunk模式的的时候,并没有将access模式删除,于是我尝试在fa0/6上删除一下access模式,运行命令
no switchport access vlan 3
switchport trunk encapsulation dot1q
switchport mode trunk
之后端口上的配置为
interface FastEthernet0/6
description 159_7_bge0
switchport trunk encapsulation dot1q
switchport mode trunk
snmp trap mac-notification added
!
然后再从服务器上ping交换机地址192.168.0.1和内网地址192.168.2.0/24都能互相ping通。
之后,将内网段的主机网关指向192.168.0.69或者192.168.2.69就都能够接入互联网了。
4、编辑 rc.firewall
我们在 /etc/rc.conf 中设定 firewall_type="OPEN",如果是使用原本 /etc/rc.firewall 的话,这样就已经就已经驱动了 NAT 的功能。如果想要加上更多的防火墙规则,可以编辑 /etc/rc.firewall ,并在档案最后加上您的设定。修改完后,执行 sh /etc/rc.firewall 就可以更新防火墙的设定了。其它关于防火墙规则的详细说明,请 man ipfw 。