Chinaunix首页 | 论坛 | 博客
  • 博客访问: 111741
  • 博文数量: 13
  • 博客积分: 637
  • 博客等级: 中士
  • 技术积分: 323
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-20 17:10
文章分类

全部博文(13)

文章存档

2013年(3)

2012年(10)

分类: BSD

2012-09-12 09:45:32

作者:刘宏光(iceblood)

日期:2005-8-18

Email:

主页:

 

2002年3月我写过一篇《利用FreeBSD组建安全的网关》,在当时由于FreeBSD才出到4.5,所以现在看来文章已经过时,虽然有很多朋友还是照那篇文章做,但由于FreeBSD版本跨越太大,所以导致的错误也非常多,于是今天再次写下这篇文章,完善以前的,以及增加了一些新的功能。

现在FreeBSD主要有三个版本:FreeBSD 4.x、FreeBSD 5.x、FreeBSD 6.x,主要用来投入生产的为4.x和5.x,6.x在我写这篇文章的时候还是6.0-BETA2,但为了让我的这篇文章适应性更强,所以我这里的内容都在5.x和6.x下经过测试,我相信如果没有特别大的改动的话,本文的内容的适用性应该能一直持续到6.x这个分支发展完成。

从FreeBSD 5.3开始,系统就有了三种防火墙让大家选择,分别是:IPFIREWALL(第二代版本,不适应于4.x早期版本)、IPFILTER、Packet Filter这三种防火墙。IPFIREWALL是FreeBSD开发团队为FreeBSD制定的,IPFILTER是引入的一个专门的包过滤防火墙,至于Packet Filter(以后简称PF)是FreeBSD 5.3开始从OpenBSD引入进来的。我以前的文章研究的内容以IPFIREWALL为主,随着时间的推移,我也转变到了IPFILTER。至于PF为刚刚引入,其效率目前来说我无法评价,所以建议大家可以缓缓,不用太超前,毕竟PF不是FreeBSD自己的东西,而又刚刚引入进来。

要实现本文你的硬件必须为I386类型的CPU,同时你的网卡必须为两块以上,如果你的条件一定达到,就可以开始了。首先需要安装FreeBSD系统,安装过程这里不是我的讨论范围,但有一个必要的提醒,就是安装的时候记得把KERNEL SOURCE带上(如果你已经懂得使用cvsup,请根据你自己的习惯做),否则你无法进行后面的工作。安装完FreeBSD以后,就可以正式开始防火墙的建设了。

使用root用户登陆进入系统,然后:

cd /usr/src/sys/i386/conf        #进入内核配置目录

cp GENERIC IPF_IPFW        #把标准内核配置文件复制为一个新的文件名

ee IPF_IPFW        #开始编辑内核配置文件

在配置文件最后面加上如下设置:

options         IPFILTER        #内核启动IPFilter防火墙

options         IPFILTER_LOG        #内核启动IPFilter日志

options         IPFILTER_DEFAULT_BLOCK        #设置默认为拒绝所有包

options         IPFIREWALL        #内核启动IPFirewall防火墙

options         IPFIREWALL_DEFAULT_TO_ACCEPT        #设置IPFirewall防火墙默认允许所有包

options         DUMMYNET        #启动IPFirewall的带宽限制

看到这里相信有很多人有疑问:

一、IPFilter和IPFirewall为什么并存?

答:其实这两个防火墙很早就可以开始并存了,只是不能并存的只是IPDIVERT部分,而本文主要是以IPFilter为主,IPFirewall为辅。所以内核配置这么加上是不会有问题的。

二、为什么一个设置默认为拒绝所有,一个设置为打开所有?那不是冲突了么?

答:因为我们主要是要使用IPFilter的包过滤以及内核级的NAT,使用IPFirewall的带宽限制,所以IPFilter需要严格,而IPFirewall则开放所有不要紧,因为同时两个防火墙同时工作,IPFirewall的开放其实并不存在,在将来的设置里还可以少设置一条规则。

设置完以上后保存配置文件,使用如下命令重新编译内核:

config IPF_IPFW

cd ../compile/IPF_IPFW

make depend

make

make install

reboot

切记!!以上操作请在本地做,不要远程操作。除非你已经非常熟悉,知道预计发生什么事情,并且能灵活的使用本文,并避免过去。

系统重新启动以后,重新登陆系统,这时FreeBSD所有的网络通信都已经被防火墙过滤,任何机器都无法连接它,它也无法连接任何其他系统。现在我们假设一个这样的网络环境:

首先我来说明一下,202.115.99.99是我随便乱想的一个IP地址,如果不幸你的IP地址和这个一样,我深感荣幸,假设FreeBSD的两个网卡为fxp0对外和fxp1对内,办公区的网络为192.168.1.x,而服务器区的网络为192.168.2.x,整个网络的带宽为10M,其中办公区最多只允许使用5M,那么我们可以开始配置这个防火墙了。

编辑/etc/rc.conf文件,在里面加入如下内容:

gateway_enable="YES"

#

# IP Filter

#

ipfilter_enable="YES"         #启动ipfilter防火墙

ipnat_enable="YES"        #启动ipnat

ipmon_enable="YES"       #启动ipfilter日志

ipmon_flags="-D /var/log/ipf.log"        #设置日志文件

 

#

# IP firewall set

#

firewall_enable="YES"        #启动firewall防火墙

firewall_script="/etc/rc.firewall"        #设置系统防火墙规则

firewall_type="/etc/ipfw.rules"        #设置用户自定义防火墙规则

firewall_quiet="YES"               #系统启动不显示防火墙规则

# IP firewall end

设置完以上系统启动配置后,开始定义防火墙规则

touch /etc/ ipf.rules        #创建ipf.rules文件

ee /etc/ ipf.rules           #编辑ipf.rules

在里面加上如下内容:

block in log quick all with short

block in log quick all with ipopts

block in log quick all with frag

block in log quick all with opt lsrr

block in log quick all with opt ssrr

#以上五条为阻止一些扫描动作

pass in quick on lo0 all

pass out quick on lo0 all

#以上两条为允许本地loop

 

#

# Allow LAN network

#

pass in quick on fxp1 all keep state

pass out quick on fxp1 all keep state

#以上两条为允许内部网络上网

#

# Allow localhost to internet

#

pass out quick on fxp0 all keep state

#允许FreeBSD自身访问Internet

 

#

# Allow TCP in

#

pass in quick on fxp0 proto tcp from any to 192.168.2.1 port = 20 flags S/SA keep state

pass in quick on fxp0 proto tcp from any to 192.168.2.1 port = 21 flags S/SA keep state

#假设192.168.2.1是内部对外的一个ftp服务器,则需要开放Internet对它的访问权限

pass in quick on fxp0 proto tcp from any to 192.168.2.2 port = 25 flags S/SA keep state

pass in quick on fxp0 proto tcp from any to 192.168.2.2 port = 80 flags S/SA keep state

#假设192.168.2.2是内部的一台电子邮件服务器和HTTP服务器,同样需要开放它

 

#

# Allow UDP in

#

pass in quick on fxp0 proto udp from any to 202.115.99.99 port = 53 keep state

#假设公司把DNS服务放在FreeBSD上,这需要允许Internet访问UDP53

以上规则我基本一条条解释的,相信大家应该都能看明白。IPFilter防火墙规则设置完成以后就开始设置NAT规则了。

touch /etc/ipnat.rules

ee /etc/ipnat.rules

在ipnat.rules里加入如下规则:

rdr fxp0 202.115.99.99/32 port 22 -> 192.168.2.1 port 20 tcp

rdr fxp0 210.83.214.163/32 port 80 ->  port 80 tcp

rdr fxp0 210.83.214.162/32 port 8000 -> 10.4.8.47 port 8000 tcp

 

#

# Deny LAN IP

#

#map fxp0 10.4.8.120/32 -> 1.1.1.1/32 portmap tcp/udp auto

 

map fxp0 10.4.3.0/24 -> 210.83.214.162/32 proxy port 21 ftp/tcp

map fxp0 10.4.5.0/24 -> 210.83.214.163/32 proxy port 21 ftp/tcp

map fxp0 10.4.8.0/23 -> 210.83.214.164/32 proxy port 21 ftp/tcp

map fxp0 10.4.10.0/24 -> 210.83.214.165/32 proxy port 21 ftp/tcp

map fxp0 10.4.6.0/24 -> 210.83.214.166/32 proxy port 21 ftp/tcp

map fxp0 192.168.1.0/23 -> 210.83.214.162/32 proxy port 21 ftp/tcp

 

map fxp0 10.4.3.0/24 -> 210.83.214.162/32 portmap tcp/udp auto

map fxp0 10.4.5.0/24 -> 210.83.214.163/32 portmap tcp/udp auto

map fxp0 10.4.8.0/23 -> 210.83.214.164/32 portmap tcp/udp auto

map fxp0 10.4.10.0/24 -> 210.83.214.165/32 portmap tcp/udp auto

map fxp0 10.4.6.0/24 -> 210.83.214.166/32 portmap tcp/udp auto

map fxp0 192.168.1.0/23 -> 210.83.214.162/32 portmap tcp/udp auto

 

map fxp0 10.4.3.0/24 -> 210.83.214.162/32

map fxp0 10.4.5.0/24 -> 210.83.214.163/32

map fxp0 10.4.8.0/23 -> 210.83.214.164/32

map fxp0 10.4.10.0/24 -> 210.83.214.165/32

map fxp0 10.4.6.0/24 -> 210.83.214.166/32

map fxp0 192.168.1.0/23 -> 210.83.214.162/32

 

#rdr fxp1 10.4.3.1/32 port 20025 -> 203.131.192.197 port 20025 tcp

rdr fxp1 10.4.3.5/32 port 25 -> 127.0.0.1 port 2525 tcp

rdr fxp1 10.4.3.5/32 port 110 -> 127.0.0.1 port 1100 tcp

rdr fxp1 10.4.3.129/32 port 5999 -> 130.94.149.166 port 5999 tcp

阅读(2414) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~