LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1796|回复: 14

修正篇:利用 FreeBSD 组建安全的网关---修正ing...

[复制链接]
发表于 2004-7-5 12:02:31 | 显示全部楼层 |阅读模式
转者序:两星期前由于工作需要,学习IPFW,并答应Eg_zm斑竹将学习心得整理出来发到sir上来。由于生性愚钝,加上后天懒惰,我就把我做试验时参考的文章转贴出来吧。嗯,单纯的转帖有点儿不负责任,我再加上本人试验时加的注解。由于这篇文章写得比较早,一些环境和现在的不符,我也一并加上注解。文中红色部分是我的注解--我这个懒人就全当在作“短文改错”了哈(希望本文的原作者不会看到这句话:cool: )。
    要完成本次试验,你应该至少了解一下相关的基础知识:

1.包过滤防火墙的原理
2.NAT的定义和原理(可参见RFC1631)
3.chroot的定义和原理
4.FreeBSD/Linux相关知识及基础操作

由于我的实验尚未完成,只进行到修改NAT阶段,使用chroot启动BIND还没有开始,所以如果你的进度比我快的话可以自己查找一些资料先搞明白,或者一边在心里骂我一边等我的注解哈~~:p

  本次试验的最新进度可以在:http://www.ultratechnology.net/f ... &threadid=38853看到。

  我的实验环境是:FreeBSD5.0

  感兴趣的朋友可以搭一个环境试验一下,如果有问题的话,可以和我联系:ge_johnny@hotmail.com


--------------------------------以下为原文的正文部分--------

利用 FreeBSD 组建安全的网关

http://www.linuxaid.com.cn 02-04-12 17:33 3094p iceblood
--------------------------------------------------------------------------------


作者:iceblood
E-Mail: iceblood@163.com
写作日期:2002-03-03
FreeBSD在网络服务器的领域里占有一席之地,不管是在高端应用,还是小型企业里,使用FreeBSD做服务器都是不错的选择,但是如何才能建立一个安全的网络呢?

首先我们来做一个这样的假设,某公司有两台服务器,需要建立一个以FreeBSD为平台的网关,并且还能提供电子邮件、DNS、WEB等服务,看起来好象这是一个很简单的事情,然而要建立一个安全性高的却不简单,在此我将为大家介绍如何去做,首先我凭着自己对FreeBSD的熟练程度,做了以下设计:

Internet
____|____
| Gateway |
---------
____|_______
___|____ ____|___
| LAN | | WWW |
---------- ----------

以上是我为该公司设计的网络结构图,首先我们来分析一下这个图,由于Gateway是一个与Internet直接连接的服务器,糟受的攻击自然也是最多的,所以也是最危险了。而且由于该服务器担任着公司的网关,该服务器只要一出问题,也将影响到全公司。为了稳定性、安全性,我考虑该服务器要跑的服务越少越好。服务越少,那么漏洞出现的可能性也越少。而WWW服务器由于放在了Gateway里面,受Gateway的保护,所以一般来说遭受的攻击比较少,所以一般可以满足足够多的服务,但是这些服务怎么样才能让Internet上的人访问呢?这就会在下面我们详细介绍了。

首先我们来安装Gateway,Gateway要使用的Internet的IP为x.x.x.x网卡为xl0,内部IP为192.168.0.1网卡为xl1,由于Gateway起到网关的作用,所以为了安全性,在该服务器上做安全是非常重要的,FreeBSD有自带了一个ipfirewall防火墙,既然有,我们当然要利用上了,首先编译内核:

cd /sys/i386/conf
cp GENERIC ./kernel_IPFW

用编辑器打开kernel_IPFW这个文本文件,在该文件里加入以下内容:

options IPFIREWALL //通知操作系统的内核检查每个IP数据包,将它们与规则集进行比较 //此条语句为使用IPFW的必要条件,没有这句,IPFW无从说起。转者注
options IPDIVERT //启用由ipfw divert使用的转向IP套接字。这一选项需要与natd联合使用。 //如使用NATD做NAT,此条语句为必要条件。转者注    
options IPFIREWALL_VERBOSE //向系统的注册程序发送注册信息包。
options IPFIREWALL_VERBOSE_LIMIT=100 //限制一台机器注册的次数。
options IPSTEALTH //启动支持秘密转发的代码,这一选项在使防火墙不被traceroute和类似工具发现时很有用。
options ACCEPT_FILTER_DATA
options ACCEPT_FILTER_HTTP //接受过滤器中的静态连接
options ICMP_BANDLIM //ICMP_BANDLIM根据带宽限制产生icmp错误。一般情况下我们需要这个选项,它有助于你的系统免受D.O.S.攻击。//转者注:该选项在FreeBSD5.0以后已经无需手动加入,系统默认改选项就是打开的,所以如果你在编译内核时加入了改选项,内核编译是通不过的。  

把以上参数加入以后保存kernel_IPFW文件。

make depend
cd ../../compile/kernel_IPFW
make
make install

(注意!!!!!请不要使用远程方式来设置服务器!为什么?等下你就能知道了。)

以上完成以后,你就可以重新启动系统使用新的内核了。

使用新内核以后,如果该系统本来是连在网络上的,那么这时他的网络部分已经完全丧失,这表示系统新的内核已经起作用了,防火墙也起作用了,但由于FreeBSD的防火墙默认情况下是不允许任何机器访问,所以该机器的任何网络功能都暂时丧失。不过不要着急,接着往下看,你就会觉得非常有意思了。

既然该服务器担当是的网关,那么让网关启动起来是必须的。我们现在再:

cd /etc

用编译器编译rc.conf

加入如下参数:

gateway_enable="YES" //启动网关
##########IP-firewall#################
firewall_enable="YES" //激活firewall防火墙
firewall_script="/etc/rc.firewall" //firewall防火墙的默认脚本
firewall_type="/etc/ipfw.conf" //firewall自定义脚本
firewall_quiet="NO" //起用脚本时,是否显示规则信息。现在为“NO”假如你的防火墙脚本已经定型,那么就可以把这里设置成“YES”了。
firewall_logging_enable="YES" //启用firewall的log记录。
##########NATD#######################
natd_interface="xl0" //NATD服务启用在哪块网卡。
natd_enable="YES" //激活NATD服务
natd_flags="-config /etc/natd.conf" //NATD服务参数设置文件。

设置完成后我们再编译/etc/syslog.conf文件。

加入以下行:

!ipfw
*.* /var/log/ipfw.log

好了rc.conf文件设置完毕,然后就是其他文件了。

新建/etc/ipfw.conf 文件,在文件里写入以下内容:

add 00400 divert natd ip from any to any via xl0 //natd服务启动设置
add 00001 deny log ip from any to any ipoptions  rr //这条规则在启动时通不过,经长达两天的反复试验和资料查询,发现ipfw并不支持关键字ipopt,该关键字应为ipoptions。转者注
add 00002 deny log ip from any to any ipoptions  ts //这条规则在启动时通不过,经长达两天的反复试验和资料查询,发现ipfw并不支持关键字ipopt,该关键字应为ipoptions。转者注
add 00003 deny log ip from any to any ipoptions  ssrr //这条规则在启动时通不过,经长达两天的反复试验和资料查询,发现ipfw并不支持关键字ipopt,该关键字应为ipoptions。转者注
add 00004 deny log ip from any to any ipoptions  lsrr //这条规则在启动时通不过,经长达两天的反复试验和资料查询,发现ipfw并不支持关键字ipopt,该关键字应为ipoptions。转者注
add 00005 deny tcp from any to any in tcpflags syn,fin //这5行是过滤各种扫描包
#######tcp#########
add 10000 allow tcp from xx.xx.xx.xx to x.x.x.x 22 in //向Internet的xx.xx.xx.xx这个IP开放SSH服务。也就是只信任这个IP的SSH登陆。
add 10001 allow tcp from any to x.x.x.x 80 in //向整个Internet开放HTTP服务。
add 10002 allow tcp from any to x.x.x.x 25 in //向整个Internet开放smtp服务。
add 10003 allow tcp from any to x.x.x.x 110 in //向整个Internet开放pop3服务。
add 19997 check-state
add 19998 allow tcp from any to any out keep-state setup
add 19999 allow tcp from any to any out //这三个组合起来是允许内部网络访问出去,如果想服务器自己不和Internet进行tcp连接出去,可以把19997和19998去掉。(不影响Internet对服务器的访问)
######udp##########
add 20001 allow udp from any 53 to me in recv xl0 //允许其他DNS服务器的信息进入该服务器,因为自己要进行DNS解析嘛~
add 20002 allow udp from any to x.x.x.x 53 in recv xl0 //向整个Internet开放DNS服务。
add 29999 allow udp from any to any out //允许自己的UDP包往外发送。
######icmp#########
add 30000 allow icmp from any to any icmptypes 3
add 30001 allow icmp from any to any icmptypes 4
add 30002 allow icmp from any to any icmptypes 8 out
add 30003 allow icmp from any to any icmptypes 0 in
add 30004 allow icmp from any to any icmptypes 11 in //允许自己ping别人的服务器。也允许内部网络用router命令进行路由跟踪。
#######lan##########
add 40000 allow all from 192.168.0.0/16 to any
add 40001 allow all from any to 192.168.0.0/16 //允许内部网络访问Internet。

好了,还有natd没设置了,我们再次添加/etc/natd.conf这个文件,其内容如下:

log yes //启动natd的log记录。
redirect_port tcp 192.168.0.2:25 x.x.x.x:25 //把对服务器IP为x.x.x.x的smtp访问转到192.168.0.2的25上去。
redirect_port tcp 192.168.0.2:80 x.x.x.x:80 //把对服务器IP为x.x.x.x的http访问转到192.168.0.2的80上去。
redirect_port tcp 192.168.0.2:110 x.x.x.x:110 //把对服务器IP为x.x.x.x的pop3访问转到192.168.0.2的110上去。

好了,natd也设置完了~重新启动一下系统让防火墙和natd生效,现在就是该装的服务没装了,虽然防火墙已经让这些服务通行。

我们现在在Gateway上安装DNS服务,我现在选择的是bind 9.2.0,安装过程不是我们的重点,所以这里就不详细介绍了,我这里只对bind的安全设置做一个说明,假设bind的工作目录是/etc/namedb现在我们对bind设置一下,因为bind的大多数版本都存在问题,这个版本虽然目前没有,但还是提防为好,我在这里建议使用chroot技术来增强bind的安全,假设我们把chroot目录设在/chroot,我们做以下事情:

pw useradd bind -g 53 -u 53 -d /nologin -s /nologin
mkdir /chroot
mkdir /chroot/etc
mkdir /chroot/var
mkdir /chroot/var/run
cp -rp /etc/namedb /chroot/etc/namedb //建立bind的工作环境和目录。

然后再运行

$PATH/sbin/named -t /chroot -u bind

这样做了后运行ps -ax |grep named会发现bind是以bind这个权限很底的身份运行,我们到/chroot/var/run目录下看,会发现有named.pid这个文件,表示bind已经很成功的被chroot在/chroot这个目录里了,就算被“黑客”利用bind入侵了,由于权限很底,而且被限制在/chroot这个目录里,并且里面没有任何的shell,不给“黑客”任何的破坏条件。所以说bind这时已经相当安全了。

到此整个Gateway服务器就已经完全设置完毕。

现在就是内部服务器了,而内部服务器受到Gateway以及防火墙的保护,所以在安装上没有多大的问题,只要注意一下邮件服务软件以及HTTP服务软件是否有漏洞就行了,比如不要使用老版本的sendmail,因为sendmail的每个版本都存在一定的安全问题,我这里建议使用Qmail,关于Qmail的安装可以下载我提供的Qmail安装包http://www.linuxaid.com.cn/training...owtip.jsp?i=245 ,而在HTTP上就要注意不要使用带漏洞的新闻发布系统,论坛等。

好了,整个服务器都已经安装完了,以上本人已经在两台FreeBSD 4.5的机器上测试通过。使用FreeBSD4.5的朋友们,如果按以上方法去设置自己的服务器的话,基本能保证正常工作。

声明:该文章由iceblood本人原创,如有什么问题欢迎大家与我交流经验,文章如要转载,请保持文章的完整性,包括“声名”部分!
发表于 2004-7-5 12:17:04 | 显示全部楼层
酷。。。

学习。。
发表于 2004-7-5 12:46:33 | 显示全部楼层

感谢 ge_johnny 兄弟的大力支持。

对ipfw不是很熟悉,近几天还有点其他的事情,收藏先,然后学习中还要请教…………
发表于 2004-7-5 17:38:06 | 显示全部楼层
谢谢!
 楼主| 发表于 2004-8-11 13:37:08 | 显示全部楼层
我已经按文章中所说的全部做了实验,没什么要修改的了,大家有兴趣地可以按照文中内容试试吧!

PS:请斑竹将标题的修正ing... 去掉吧~~
发表于 2004-8-11 18:37:43 | 显示全部楼层
顶一下
发表于 2004-8-15 15:08:39 | 显示全部楼层
请教一下,我按这个做了,但能tracer,玩浩方,但不能开网页,dns解析是正确的,为什么?
 楼主| 发表于 2004-8-16 10:16:33 | 显示全部楼层
最初由 gamer 发表
请教一下,我按这个做了,但能tracer,玩浩方,但不能开网页,dns解析是正确的,为什么?


。。。先把ipfw show的结果贴出来看看吧
发表于 2004-8-16 17:02:00 | 显示全部楼层
ipfw show的结果:
00001   0     0 deny log logamount 100 ip from any to any ipopt rr
00002   0     0 deny log logamount 100 ip from any to any ipopt ts
00003   0     0 deny log logamount 100 ip from any to any ipopt ssrr
00004   0     0 deny log logamount 100 ip from any to any ipopt lsrr
00005   0     0 deny tcp from any to any in tcpflags fin,syn
00400   6   414 divert 8668 ip from any to any via vlan808
10001  53  2992 allow tcp from 10.1.1.0/24 to me 22 in
10003   0     0 allow tcp from 10.1.1.0/24 to me 21 in
10005   0     0 allow tcp from 10.1.1.0/24 to me 80 in
19997   0     0 check-state
19998   0     0 allow tcp from any to any keep-state out setup
19999  38  4148 allow tcp from any to any out
20001   0     0 allow udp from any 53 to me in
20002   7  2044 allow udp from any to me 8889 in
29999   0     0 allow udp from any to any out
30000   0     0 allow icmp from any to any icmptype 3
30001   0     0 allow icmp from any to any icmptype 4
30002   0     0 allow icmp from any to any out icmptype 8
30003   0     0 allow icmp from any to any in icmptype 0
30004   0     0 allow icmp from any to any in icmptype 11
40000   0     0 allow ip from 10.14.2.188 to me in
50002   0     0 allow ip from 10.14.2.188 to any
50003   0     0 allow ip from any to 10.14.2.188
60001 256 42543 deny ip from any to any
 楼主| 发表于 2004-8-16 17:13:58 | 显示全部楼层
删掉19999、20002条规则,增加以下规则:
ipfw add 19999 allow ip from any to any out
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表