Linux -- 系统安全之NAT及防火墙的混合应用

LINUX凭借其稳定性、安全性和代码开放在这几年中,风靡全球;作为一种类UNIX系统,Linux正在互联网的各个层面得到应用,从科学计算到银行取款机,从网络web服务到高层的Oracle 数据库应用。都可以看到linux的影子。而由于Linux遵循于GPL协议(公共软件许可证),任何人可以得到并且修改它的源代码,所以他的安全性相较于其他的非开源系统来说要高的多;并且它可以从网络中免费下载。从这2点来说他非常适合用于网络信息闸(软路由或网关)和自制防火墙(事实上国内的硬件防火墙厂商都是用工业X86硬件和linux来做他们的产品,虽然那不是真正意义上的硬件防火墙)。现在学校过于注重对windows及其windows平台上的软件、开发工具的学习。但是学生们没有意识到,真正撑起这个互联网的正是UNIX系统;就从我对Linux的见解为大家展示UNIX系统的一角吧。


什么是NAT?
NAT英文全称是Network Address Translation,称是网络地址转换,它是一个IETF标准,允许一个机构(包括多个网络节点)以一个地址出现在Internet上。NAT将每个局域网节点的地址转换成一个IP地址,反之亦然。它也可以应用到防火墙技术里,把个别IP地址隐藏起来不被外界发现,使外界无法直接访问内部网络设备,同时,它还帮助网络可以超越地址的限制,合理地安排网络中的公有Internet 地址和私有IP地址 的使用。
为什么要进行NAT
假设校园网提供园区Internet接入服务,为了方便管理,校园网络中心分配给园区用户的IP地址都是伪IP(内部IP),但是部分用户要求建立自己的WWW服务器对外发布信息,这时候我们就可以通过NAT来提供这种服务了。我们可以在防火墙的外部网卡上绑定多个合法IP地址或端口,然后通过NAT技术使发给其中某一个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。
实验环境介绍
本文所有到的实验环境如下:
LINUX系统主机一台(服务端):双网卡 REDHAT 9.0 主机名:host
WINDOWS 98 系统主机一台(客户端):单网卡主机名:test
联想D-link 8口 10M/100M交换机一个
【正文】
网络的拓朴结构:

一、 RED HAT 9.0 安装和注意点
Linux是一个独立的操作系统,所以不能在其他操作系统下进行安装,他有自己的启动方式,可以采用以下两种方法进行安装。
● 从CD-ROM进行安装
● 从FTP服务器进行安装
由于Linux系统安装(第一种方法),有随机参考手册,难度不大,所以我们着重介绍从ftp安装。
在安装之前制作启动盘:
1. 在windows操作系统下将安装盘放入光驱;
2. 运行 e:\dosutils\rawrite.exe(e盘为光驱)
3. 在运行后的界面中输入e:\images\bootnet.img
4. 指定目标盘,输入用户软盘盘符:a
这样一张安装程序的启动盘就建好了。
 
用软盘引导计算机,进入蓝色界面后,输入FTP服务器地址和ftp上的用户名及口令就可以下在安装了。
RED HAT 9.0安装界面为中文,安装中文说明基本可以完成系统定制,在此要强调的是,分区的时候,/swap(交换分区)大小要是内存大小的2倍;既然是作nat 网关,要把/var(日志分区)单分出来,并且不要少于500M,有充裕的空间存储日志,也为将来将来系统故障或受到攻击做到有据可查。
二.LINUX的网络设置和nat原理
2.1网络设置
我们把linux系统安装完后,整个设置平台算是搭建完毕,但是还要设置网络;设置网络之前,或者说让linux上网前,应该把和这台服务器应该起到作用的无关服务关掉。
可以在命令行下敲入setup回车,会出现一个文本菜单,里面有“系统服务”一项,直接用空格键取消服务前面的勾然后重新启动系统就行了。
假如是UNIX的熟练用户,可以在取消服务后,不用重新启动,在命令行行打入
psaux
会显示现在在后台运行的所有服务,看到要杀死的进程后,打入
kill -9 
(-9代表强制杀掉进程)杀死进程。
然后进入/etc/sysconfig/network-scripts/目录
viifcfg-eth0会出现以下内容
device=eth0
onboot=yes
bootproto=none
IPADDR=192.168.0.1 #(内网网卡IP)
netmask=255.255.255.0
TYPE=ETHERNET
USERCTL=NO
PEERDNS=NO
NETWORK=192.168.0.0(网络号)
Broadcast=192.168.0.255(广播号)
上面的设置的意思是:eth0对内的内网网卡,ip地址为192.168.0.1,子网掩码为:255.255.255.0;
viifcfg-eth1会出现以下内容
device=eth1
onboot=yes
bootproto=none
IPADDR=202.204.208.5 #(外网网卡IP)
netmask=255.255.255.128
TYPE=ETHERNET
USERCTL=NO
PEERDNS=NO
NETWORK=202.204.208.0(网络号)
Broadcast=202.204.208.127(广播号)
上面的设置的意思是:eth1是对外的外网网卡,ip地址为202.204.208.5。
网卡的设置就完成了
加入nat客户端ip和名称
vi /etc/hosts
格式为:
ip地址 主机名
127.0.0.1 host
指定内网网关
vi /etc/sysconfig/network
gateway=202.204.208.7 #(网关地址,假如服务端的外网为拨号,就不要指定)
设置DNS服务器
vi /etc/resolv.conf
格式为
nameserver ip地址
nameserver 202.106.196.115
都设置好后,从新启动系统,在命令行下打入
route -a #察看路由表,看一下默认网关是否为202.204.208.7
假如是的话,服务端的网络配置就已经全部完成。
下面是客户端的网络配置
因为是win 98系统,所以只给出配置参数,配置方法略
ip地址为192.168.0.2
子网掩码:255.255.255.0
域名服务器:202.106.196.115
网关:192.168.0.1
全部网络设置完成

2.2 NAT原理
2.2.1在进入NAT设置之前,我们要先讨论一下NAT的工作原理
在引言部分,我们已经提到了一个NAT应用实例,从这个实例中可以看出NAT和防火墙是一体的,换句话说,NAT就是防火墙。NAT对防火墙来说是子集的关系。
在本节,我们会深入讨论NAT的原理部分,为了更清晰的认识NAT,我们借用INTERNET标准化组织发布的RFC3022文档的部分内容。
NAT有三种类型:静态NAT(Static NAT)、网络地址端口转换DNAT(destination- NAT)、动态地址NAT(Pooled NAT)。我们主要讨论前面2种nat.
静态nat解决问题的办法是:在内部网络中使用内部地址,通过NAT把内部地址翻译成合法的IP地址在Internet上使用,其具体的做法是把IP包内的地址域用合法的IP地址来替换。NAT设备维护一个状态表(路由表,所以也称NAT为软路由),用来把非法的IP地址映射到合法的IP地址上去。每个包在NAT设备中都被翻译成正确的IP地址,发往下一级,这意味着给处理器带来了一定的负担。但对于一般的网络来说,这种负担是微不足道的。
网络地址端口转换NAT,也叫做反向NAT,他解决问题的方法是:在内部网络中,使用内部地址的计算机开设了网络服务(80,21等),当外部ip想访问这些服务时,NAT网关把外部访问ip翻译成内部ip,也就是说,把内部开设的服务,映射到一个合法的ip和端口上,已供外部访问。
假如想进一步了解他的工作原理,NAT其实就是一种IP包欺诈,也可以说是对IP报头的修改,请看下表
4位版本
4位首部长度
8位服务类型
16位总长度(字节数)
16位标识
3位标志
13位片偏移
8位生存时间(ttl)
8位协议
16位首部校验和
32位源ip地址
32位目的ip地址
其他选项
携带数据
IP数据包格式和报头中的各字段
NAT网关(外202.204.208.5;内192.168.0.1)收到本地局域网内的客户机(192.168.0.2),发来的ip数据,先判断是否是本地子网中发来的,假如通过,则按照她的目的ip地址查找本地路由表进行转发,NAT在包被继续向前送出之前转换32位源地址 192.168.0.1成202.204.208.5。相应的,IP包往回传时依据相同的地址进行转换。
2.2.2 NAT设置
我们知道了NAT的原理,就可以进行NAT的配置了,我们前面说过了NAT就是防火墙,在RED HAT9.0下自带防火墙 IPTABLS
我们在做好网络设置后,假如要实现客户端(win98)通过服务端上网(静态NAT),可以在命令行下直接打入
iptables -t nat -A POSTROUTING -o eth1 -j SNAT - to 202.204.208.5
说明:
-t nat : 调用nat表,调用这个表说明遇到了产生新的连接的包。
-A :该命令将一条规则附加到链的末尾。
POSTROUTING:指定正当信息包打算离开防火墙时改变它们的规则。
-o eth1:输出接口为ETH1
-j SNAT:跳转,也叫触发条件,当满足Snat规则是便发生跳转
整条语句的意思为: 当防火墙遇到产生新的连接的包,则在他要离开防火墙时改变他的源ip为202.204.208.5并且从ETH1出口送出。
nat的规则指定完成后,还要打开IP转发功能:
echo 1 > /proc/sys/net/ipv4/ip_forward
这样,客户端就可以通过208.5上网了。
假如208.5的客户端192.168.0.2开设了80端口的web服务,如何让外部访问到这个局域网内部的服务呢?
这就用到了Dnat(也叫反向nat,端口跳转),在命令行下打入:
iptables -t nat -A PREROUTING -i eth1 -d 202.204.208.5 -p tcp -dport 80 -j DNAT -to-destination 192.168.0.2:80
语句说明:当有通过eth1接口的tcp协议访问202.204.208.5的80端口的时候,则触发跳转,跳转至局域网的192.168.0.2的80端口。
但是这同时也出现一个问题,在同一局域网内的机器,无法访问202.204.208.5的80端口。以下是原因:
假设192.168.0.3不通过http://192.168.0.2:80这种方式进行浏览
在命令行下打入:
iptables -t nat -A POSTROUTING -p tcp -s 192.168.0.0/24 -d 192.168.0.2/32 -j SNAT -to 192.168.0.1
语句解释:当192.168.0.1-255这个范围的ip访问192.168.0.2这个ip的时候,当数据包离开的时候修改源ip地址为 192.168.0.1,这相当于在局域网内部,又作了一次NAT转换。局域网内部通过192.168.0.1作为转发,而不是直接进行通信,这就避免了无法访问局域网内部ip的情况。
目前,nat的功能就已经实现,但是并没有对包进行过滤。
三.网络攻击和防火墙
3.1什么事网络攻击
当混乱的Internet和你良好的、有序的Linux服务器网络之间进行连接时,你最好能知道哪些东西可以进入你的大门。这就需要制定包过滤策略,既然是包过滤,肯定是要过滤掉那些对网络有害的或者是无用的包,但哪些包是有害的呢?我们既然是在防守,不妨听听敌人的想法。
作为一个老练的入侵者,他并不会盲目的展开攻击和入侵,他首先会确定自己的目标,当然,确定目标的方法有2种,一是根据个人的好恶或审美观点确定目标,二是根据广义扫描器(反馈结果简单,但是速度很快的扫描器)的反馈结果,选择整体安全性不高的网络作为攻击目标。
接下来要做的就是了解这个网络服务器,就象和人交往一样,你对那个人越了解,就越清楚那个人的弱点,从而你对它的伤害就越致命。对人的了解通过交谈,对服务器的了解要通过扫描;首先要确定的是这台服务器都开有什么服务,这很简单,通过tcp协议的3次握手:
1. 当请求端对要扫描的服务器端口送一个包含SYN标志的TCP报文,这个报文指明客户端使用的端口以及TCP连接的初始端口。
2.服务器在接受到客户端的SYN包问候,假如客户端请求连接的端口存在,则返回一个SYN+ACK的报文,表示客户端的请求被接受。同时TCP序号被加一。那么扫描器接受到SYN+ACK报文后,会向入侵者报告,扫描的这个端口是打开的,从而使入侵者判断这是什么服务。
3. 客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。
4. 假如服务器的这个端口不存在,或者没有返回SYN+ACK报文,则扫描端发出一个FIN标志报文,撤销这个TCP连接。
当确定了服务器开设了什么端口以后,有经验的入侵者可以从端口判断出这台服务器开设的具体服务,然后就是按照不同的服务进行漏洞攻击或入侵了。
从以上攻击步骤看出,不要让服务器完全暴露在网络中,是非常重要的,也就是首先对端口进行过滤,只允许指定的服务通过制定的端口穿越防火墙。这也就引出了RFC2979规定的互联网防火墙规则配置的基本准则之一:
一切未被允许的就是禁止的。
基于该准则,防火墙应该封锁所有的信息流,然后对希望提供的服务逐项开放。这是一种非常实用的方法,可以造成一种十分安全的环境,因为只有经过仔细挑选的服务才被允许实用。
3.2如何防御网络攻击
从我们上例来看,我们只开设了web服务使用标准的80端口。
那我们要在防火墙中进行如下设置:
iptables -P INPUT -j DROP #我们用-P来拦截主机上所有通讯
iptables -A INPUT -p tcp -dport 80 -j ACCEPT #打开80端口的tcp协议
假如我们在将来还要还要添加适当端口,可以用上句的格式逐一添加
这样我们就实现了对网络服务器主机的端口过滤功能,这种方法也只是降低受到攻击的次数要防御这种攻击,还要分别制定防火墙策略。
1. 死亡之ping (ping of death)
ping,这个软件是测试网络间是否畅通用的,他应用于icmp协议,但并不依赖于哪个端口,由于在早期的阶段,路由器对包的最大尺寸都有限制,许多操作系统对TCP/IP栈的实现在ICMP包上都是规定64KB,并且在对包的标题头进行读取之后,要根据该标题头里包含的信息来为有效载荷生成缓冲区,当产生畸形的,声称自己的尺寸超过ICMP上限的包也就是加载的尺寸超过64K上限时,就会出现内存分配错误,导致TCP/IP堆栈崩溃,致使接受方当机。
为了解决这个问题,我们可以在防火墙中加入以下内容
iptables -A INPUT -p icmp -icmp-type echo-request -i eth1 -j DROP
这句话的意思是,从接口eth1进入的icmp协议的请求全部丢弃。
2. SYN Flood (拒绝服务攻击)
SYN Flood 是目前最流行的拒绝服务攻击与分布式拒绝服务攻击的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽的攻击方式。
前面已经提过TCP的三次握手,问题就出在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器一般会重试(再次发送SKY+ACK给客户端)并等待一段是句丢弃这个未完成的连接,这段时间的长度我们称为(SYN Timeout),一般来说这个时间是分钟为单位(半分钟-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗很多的CPU资源与时间,何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬合法请求(客户端的正常请求相较于非法请求来说非常小),此时从正常连接的角度来说,服务器失去了响应,这种情况我们称为服务器收到了洪水攻击。
从防御角度来说,可以缩短SYN- Timeout时间,由于SYN FLOOD攻击效果取决于服务器上保持的SYN半连接数,这个值等于SYN攻击的频度* SYN Timeout,所以通过缩短从接受到SYN报文到区定这个报文物校并丢弃连接的时间,,可以降低服务器的负荷。
我们可以在用IPTABLES执行如下语句:
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
在所有的IPTABLES规则制定完后,可以用$ iptables-save > iptables-script把写入的全部的规则写入到文件,然后 在 /etc/rc.d/rc.local
加入:iptables-restore iptables-script
这样每次重新启动系统将自动载入iptables设定好的规则。
【结论】
本设计实现了Linux服务器在局域网内的代理上网应用和网络防火墙应用,大量使用了Linux下的防火墙iptables。并且对tcp/ip协议作了透彻的讲解,对网络的典型攻击方式进行了明确的阐述。证明Linux在作为网络网关服务器有充分的方式,不仅系统强壮,并且配置性很强。希望给广大喜欢网络及网络管理的同学提供了新的思路。


备注:

Linux系统下安全配置六招

1、用防火墙关闭不须要的任何端口,别人PING不到服务器,威胁自然减少了一大半

防止别人ping的方法:

1)命令提示符下打

echo 1 > /proc/sys/net/ipv4/icmp_ignore_all

2)用防火墙禁止(或丢弃) icmp 包

iptables -A INPUT -p icmp -j DROP

3)对所有用ICMP通讯的包不予响应

比如PING TRACERT

2、更改SSH端口,最好改为10000以上,别人扫描到端口的机率也会下降

vi /etc/ssh/sshd_config

将PORT改为1000以上端口

同时,创建一个普通登录用户,并取消直接root登录

useradd ‘username‘

passwd ‘username‘

vi /etc/ssh/sshd_config

在最后添加如下一句:

PermitRootLogin no #取消root直接远程登录

3、删除系统臃肿多余的账号: userdel adm userdel lp userdel sync userdel shutdown userdel halt userdel news userdel uucp userdel operator userdel games userdel gopher userdel ftp 如果你不允许匿名FTP,就删掉这个用户帐号 groupdel adm groupdel lp groupdel news groupdel uucp groupdel games groupdel dip groupdel pppusers

4、更改下列文件权限,使任何人没有更改账户权限: chattr +i /etc/passwd chattr +i /etc/shadow chattr +i /etc/group chattr +i /etc/gshadow

5、chmod 600 /etc/xinetd.conf

6、关闭FTP匿名用户登陆


参考: http://netsecurity.51cto.com/art/200512/14443.htm 

      http://netsecurity.51cto.com/art/200907/133600.htm 

本文出自 “Ricky's Blog” 博客,请务必保留此出处http://57388.blog.51cto.com/47388/1555056

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。