免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2855 | 回复: 0
打印 上一主题 下一主题

用iptales实现包过虑型防火墙 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-04 15:20 |只看该作者 |倒序浏览
   
用iptales实现包过虑型防火墙
一、概述
1. 什么是NAT
在传统的标准的TCP/IP通信过程中,所有的路由器仅仅是充当一个中间人的角色,也就是通常所说的存储转发,路由器并不会对转发的数据包
进行修改,更为确切的说,除了将源MAC地址换成自己的MAC地址以外,路由器不会对转发的数据包做任何修改。NAT(Network Address
Translation网络地址翻译)恰恰是出于某种特殊需要而对数据包的源ip地址、目的ip地址、源端口、目的端口进行改写的操作。
2. 为什么要进行NAT
我们来看看再什么情况下我们需要做NAT。
假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP地址都是伪IP,但是部分用户要求建立自己的WWW服务器
对外发布信息,这时候我们就可以通过NAT来提供这种服务了。我们可以再防火墙的外部网卡上绑定多个合法IP地址,然后通过NAT技术使发给
其中某一个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。
再比如使用拨号上网的网吧,因为只有一个合法的IP地址,必须采用某种手段让其他机器也可以上网,通常是采用代理服务器的方式,但是代
理服务器,尤其是应用层代理服务器,只能支持有限的协议,如果过了一段时间后又有新的服务出来,则只能等待代理服务器支持该新应用的
升级版本。如果采用NAT来解决这个问题,
因为只在应用层以下进行处理,不但可以获得很高的访问速度,而且可以无缝的支持任何新的服务或应用。
还有一个方面的应用就是重定向,也就是当接收到一个包后,不是转发这个包,而是将其重定向到系统上的某一个应用程序。最常见的应用就
是和squid配合使用成为透明代理,在对http流量进行缓存的同时,可以提供对Internet的无缝访问。
3. NAT的类型
在linux2.4的NAT-HOWTO中,作者从原理的角度将NAT分成了两种类型,即源NAT(SNAT)和目的NAT(DNAT),顾名思义,所谓SNAT就是改变转发数
据包的源地址,所谓DNAT就是改变转发数据包的目的地址。
二、原理
下图是linux2.4的原理图:
点击打开新窗口
在“用iptales实现包过虑型防火墙”一文中我们说过,netfilter是Linux 核心中一个通用架构,它提供了一系列的"表"(tables),每个表由
若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组成。并且系统缺省的表是"filter"。但是在使用NAT的时候,我们所使用的
表不再是"filter",而是"nat"表,所以我们必须使用"-t nat"选项来显式地指明这一点。因为系统缺省的表是"filter",所以在使用filter功
能时,我们没有必要显式的指明"-t filter"。
同filter表一样,nat表也有三条缺省的"链"(chains),这三条链也是规则的容器,它们分别是:
PREROUTING:可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们
必须在路由之前就进行目的NAT;
POSTROUTING:可以在这里定义进行源NAT的规则,系统在决定了数据包的路由以后在执行该链中的规则。
OUTPUT:定义对本地产生的数据包的目的NAT规则。
三、操作语法
如前所述,在使用iptables的NAT功能时,我们必须在每一条规则中使用"-t nat"显示的指明使用nat表。然后使用以下的选项:
1. 对规则的操作
加入(append) 一个新规则到一个链 (-A)的最后。
在链内某个位置插入(insert) 一个新规则(-I),通常是插在最前面。
在链内某个位置替换(replace) 一条规则 (-R)。
在链内某个位置删除(delete) 一条规则 (-D)。
删除(delete) 链内第一条规则 (-D)。
2. 指定源地址和目的地址
通过--source/--src/-s来指定源地址(这里的/表示或者的意思,下同),通过--destination/--dst/-d来指定目的地址。可以使用以下四中方
法来指定ip地址:
a. 使用完整的域名,如“www.linuxaid.com.cn”;
b. 使用ip地址,如“192.168.1.1”;
c. 用x.x.x.x/x.x.x.x指定一个网络地址,如“192.168.1.0/255.255.255.0”;
d. 用x.x.x.x/x指定一个网络地址,如“192.168.1.0/24”这里的24表明了子网掩码的有效位数,这是 UNIX环境中通常使用的表示方法。
缺省的子网掩码数是32,也就是说指定192.168.1.1等效于192.168.1.1/32。
3. 指定网络接口
可以使用--in-interface/-i或--out-interface/-o来指定网络接口。从NAT的原理可以看出,对于 PREROUTING链,我们只能用-i指定进来的网
络接口;而对于POSTROUTING和OUTPUT我们只能用-o指定出去的网络接口。
4. 指定协议及端口
可以通过--protocol/-p选项来指定协议,如果是udp和tcp协议,还可--source-port/--sport和 --destination-port/--dport来指明端口。
四、准备工作
1. 编译内核,编译时选中以下选项,具体可参看“用iptales实现包过虑型防火墙”一文:
Full NAT
MASQUERADE target support
REDIRECT target support
2. 要使用NAT表时,必须首先载入相关模块:
modprobe ip_tables
modprobe ip_nat_ftp
iptable_nat 模块会在运行时自动载入。
五、使用实例
1. 源NAT(SNAT)
比如,更改所有来自192.168.1.0/24的数据包的源ip地址为1.2.3.4:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3.4
这里需要注意的是,系统在路由及过虑等处理直到数据包要被送出时才进行SNAT。
有一种SNAT的特殊情况是ip欺骗,也就是所谓的Masquerading,通常建议在使用拨号上网的时候使用,或者说在合法ip地址不固定的情况下使
用。比如
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
可以看出,这时候我们没有必要显式的指定源ip地址等信息。
2. 目的SNAT(DNAT)
比如,更改所有来自192.168.1.0/24的数据包的目的ip地址为1.2.3.4:
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 1.2.3.4
这里需要注意的是,系统是先进行DNAT,然后才进行路由及过虑等操作。
有一种DNAT的特殊情况是重定向,也就是所谓的 Redirection,这时候就相当于将符合条件的数据包的目的ip地址改为数据包进入系统时的网
络接口的ip地址。通常是在与squid配置形成透明代理时使用,假设squid的监听端口是3128,我们可以通过以下语句来将来自192.168.1.0/24
,目的端口为80的数据包重定向到 squid监听
端口:
iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.1.0/24 --dport 80
-j REDIRECT --to-port 3128
六、综合例子
1. 使用拨号带动局域网上网
小型企业、网吧等多使用拨号网络上网,通常可能使用代理,但是考虑到成本、对协议的支持等因素,建议使用ip欺骗方式带动区域网上网。
成功升级内核后安装iptables,然后执行以下脚本:
#载入相关模块
modprobe ip_tables
modprobe ip_nat_ftp
#进行ip伪装
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
2. ip映射
假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP地址都是伪IP,但是部分用户要求建立自己的WWW服务器
对外发布信息。我们可以再防火墙的外部网卡上绑定多个合法IP地址,然后通过ip映射使发给其中某一个IP地址的包转发至内部某一用户的WWW
服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。
我们假设以下情景:
该ISP分配给A单位www服务器的ip为:
伪ip:192.168.1.100
真实ip:202.110.123.100
该ISP分配给B单位www服务器的ip为:
伪ip:192.168.1.200
真实ip:202.110.123.200
linux防火墙的ip地址分别为:
内网接口eth1:192.168.1.1
外网接口eth0:202.110.123.1
然后我们将分配给A、B单位的真实ip绑定到防火墙的外网接口,以root权限执行以下命令:
ifconfig eth0 add 202.110.123.100 netmask 255.255.255.0
ifconfig eth0 add 202.110.123.200 netmask 255.255.255.0
成功升级内核后安装iptables,然后执行以下脚本:
#载入相关模块
modprobe ip_tables
modprobe ip_nat_ftp
首先,对防火墙接收到的目的ip为202.110.123.100和202.110.123.200的所有数据包进行目的NAT(DNAT):
iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT --to 192.168.1.100
iptables -A PREROUTING -i eth0 -d 202.110.123.200 -j DNAT --to 192.168.1.200
其次,对防火墙接收到的源ip地址为192.168.1.100和192.168.1.200的数据包进行源NAT(SNAT):
iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 202.110.123.100
iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT --to 202.110.123.200
这样,所有目的ip为202.110.123.100和202.110.123.200的数据包都将分别被转发给192.168.1.100和 192.168.1.200;而所有来自
192.168.1.100和192.168.1.200的数据包都将分别被伪装成由 202.110.123.100和202.110.123.200,从而也就实现了ip映射.
2006.3.7 21:42 作者:cao1215 引用:0 | 收藏 | 评论:0
iptable 使用实例
分类:默认栏目
iptable 使用实例
iptables使用实例
首先让我们看一下服务器/客户机的交互原理。服务器提供某特定功能的服务总是由特定的后台程序提供的。在TCP/IP网络中,常常把这个特定
的服务绑定到特定的TCP或UDP端口。之后,该后台程序就不断地监听(listen)该端口,一旦接收到符合条件的客户端请求,该服务进行TCP握
手后就同客户端建立一个连接,响应客户请求。与此同时,再产生一个该绑定的拷贝,继续监听客户端的请求。
举一个具体的例子:假设网络中有一台服务器A(IP地址为1.1.1.1)提供WWW服务,另有客户机B(2.2.2.2)、 C(3.3.3.3)。首先,服务器A运行提
供WWW服务的后台程序(比如Apache)并且把该服务绑定到端口80,也就是说,在端口80进行监听。当 B发起一个连接请求时,B将打开一个大于
1024的连接端口(1024内为已定义端口),假设为1037。A在接收到请求后,用80端口与B建立连接以响应B的请求,同时产生一个80端口绑定的拷
贝,继续监听客户端的请求。假如A又接收到C的连接请求(设连接请求端口为1071),则A在与C建立连接的同时又产生一个80端口绑定的拷贝
继续监听客户端的请求。如下所示,因为系统是以源地址、源端口、目的地址、目的端口来标识一个连接的,所以在这里每个连接都是唯一的

服务器 客户端
连接1:a.b.c.1:80  a.b.c.4:1037
连接2:a.b.c.1:80  a.b.c.7:1071
每一种特定的服务都有自己特定的端口,一般说来小于1024的端口多为保留端口,或者说是已定义端口,低端口分配给众所周知的服务(如WWW
、 FTP等等),从512到1024的端口通常保留给特殊的UNIX TCP/IP应用程序,具体情况请参考/etc/services文件或RFC1700。
假设网络环境如下:某一单位,租用DDN专线上网,网络拓扑如下:
+--------------+
| 内部网段 | eth1+--------+eth0 DDN
| +------------|firewall|Internet
| 198.168.80.0 | +--------+
+--------------+
eth0: 198.199.37.254
eth1: 198.168.80.254
以上的IP地址都是Internet上真实的IP,故没有用到IP欺骗。并且,我们假设在内部网中存在以下服务器:
www服务器:
www.yourdomain.com
198.168.80.11
ftp服务器:
ftp.yourdomain.com
198.168.80.12
email服务器:mail.yourdomain.com 198.168.80.13
下面我们将用iptables一步一步地来建立我们的包过滤防火墙,需要说明的是,在这个例子中,我们主要是对内部的各种服务器提供保护。
1. 在/etc/rc.d/目录下用touch命令建立firewall文件,执行chmod u+x firewll以更改文件属性,编辑/etc/rc.d/rc.local文件,在末尾加上
/etc/rc.d/firewall 以确保开机时能自动执行该脚本。
2. 刷新所有的链的规则
#!/bin/sh
echo "Starting iptables rules..."
#Refresh all chains
/sbin/iptables -F
3. 我们将首先禁止转发任何包,然后再一步步设置允许通过的包。
所以首先设置防火墙FORWARD链的策略为DROP:
/sbin/iptables -P FORWARD DROP
4.设置关于服务器的包过虑规则:
在这里需要注意的是,服务器/客户机交互是有来有往的,也就是说是双向的,所以我们不仅仅要设置数据包出去的规则,还要设置数据包返回
的规则,我们先建立针对来自Internet数据包的过虑规则。
WWW服务:服务端口为80,采用tcp或udp协议。规则为:eth0=>允许目的为内部网WWW服务器的包。
###########################Define HTTP packets####################################
#Allow www request packets from Internet clients to www servers
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j ACCEPT
FTP服务:FTP服务有点特别,因为需要两个端口,因为FTP有命令通道和数据通道。其中命令端口为21,数据端口为20,并且有主动和消极两种
服务模式,其消极模式连接过程为:FTP客户端首先向FTP服务器发起连接请求,三步握手后建立命令通道,然后由FTP服务器请求建立数据通道
,成功后开始传输数据,现在大多数FTP客户端均支持消极模式,因为这种模式可以提高安全性。FTP服务采用tcp协议。规则为:eth0=>仅允许
目的为内部网ftp服务器的包。
############################Define FTP packets#####################################
#Allow ftp request packets from Internet clients to Intranet ftp server
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.12 --dport ftp -i eth0 -j ACCEPT
EMAIL服务:包含两个协议,一是smtp,一是pop3。出于安全性考虑,通常只提供对内的pop3服务,所以在这里我们只考虑针对smtp的安全性问
题。smtp端口为21,采用tcp协议。eth0=>仅允许目的为email服务器的smtp请求。
###########################Define smtp packets####################################
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.13 --dport smtp -i eth0 -j ACCEPT
5. 设置针对Intranet客户的过虑规则:
在本例中我们的防火墙位于网关的位置,所以我们主要是防止来自Internet的攻击,不能防止来自Intranet的攻击。假如我们的服务器都是基
于linux的,也可以在每一部服务器上设置相关的过虑规则来防止来自Intranet的攻击。对于Internet对Intranet客户的返回包,我们定义如下
规则。
#############Define packets from Internet server to Intranet#######################
/sbin/iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 198.168.80.0/24 -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.0/24 ! -syn -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT
说明:第一条允许Intranet客户采用消极模式访问Internet的FTP服务器;第二条接收来自Internet的非连接请求tcp包;最后一条接收所有udp
包,主要是针对oicq等使用udp的服务。
6. 接受来自整个Intranet的数据包过虑,我们定义如下规则:
#############Define packets from Internet server to Intranet server###############
/sbin/iptables -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT
7. 处理ip碎片
我们接受所有的ip碎片,但采用limit匹配扩展对其单位时间可以通过的ip碎片数量进行限制,以防止ip碎片攻击。
#################################Define fregment rule##################################
/sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
说明:对不管来自哪里的ip碎片都进行限制,允许每秒通过100个ip碎片,该限制触发的条件是100个ip碎片。
8. 设置icmp包过滤
icmp包通常用于网络测试等,故允许所有的icmp包通过。但是黑客常常采用icmp进行攻击,如ping of death等,所以我们采用limit匹配扩展
加以限制:
#################################Define icmp rule##################################
/sbin/iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
说明:对不管来自哪里的icmp包都进行限制,允许每秒通过一个包,该限制触发的条件是10个包。
通过以上个步骤,我们建立了一个相对完整的防火墙。只对外开放了有限的几个端口,同时提供了客户对Internet的无缝访问,并且对ip 碎片
攻击和icmp的ping of death提供了有效的防护手段。以下是完整的脚本文件内容,希望通过这个实例能是对iptables的用法有所了解:
#!/bin/sh
echo "Starting iptables rules..."
#Refresh all chains
/sbin/iptables -F
###########################Define HTTP packets####################################
#Allow www request packets from Internet clients to www servers
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.11 --dport www -i eth0 -j ACCEPT
############################Define FTP packets#####################################
#Allow ftp request packets from Internet clients to Intranet ftp server
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.12 --dport ftp -i eth0 -j ACCEPT
###########################Define smtp packets####################################
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.13 --dport smtp -i eth0 -j ACCEPT
#############Define packets from Internet server to Intranet#######################
/sbin/iptables -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 198.168.80.0/24 -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -d 198.168.80.0/24 ! -syn -i eth0 -j ACCEPT
/sbin/iptables -A FORWARD -p udp -d 198.168.80.0/24 -i eth0 -j ACCEPT
#############Define packets from Intranet to Internet###############
/sbin/iptables -A FORWARD -s 198.168.80.0/24 -i eth1 -j ACCEPT
#################################Define fregment rule##################################
/sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
#################################Define icmp rule##################################
/sbin/iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
2006.3.7 21:41 作者:cao1215 引用:0 | 收藏 | 评论:0
Netfilter/Iptables的防火墙功能介绍 1
分类:默认栏目
Netfilter/Iptables的防火墙功能介绍 1
防火墙介绍
Disclaimer: 下面描述的有些内容可能不完全正确.但希望对你理解iptables有帮助,如果你发现了错误,请通知我。
注意,此说明是非拷贝的(例如在GPL).如果你想做任何修改、发布、拷贝、引用,请先联系我。(哈哈,不管了)
什么是防火墙?
简单说,防火墙就是用来保护你的网络的一台主机,它对来自internet和你的内网(受保护)之间的通讯进行限制,反过来亦可。
非防火墙功能
误区 - 防火墙并不能保证你的网络绝对安全
堡垒主机(A bastion host)- In an ideal world, this would be true. However, a firewall is only as secure as the work you put
into securing it.
主机安全替换(A replacement for host security) - 每一项防火墙允许的服务都是潜在的风险。
使用类型
本地 - 对于在实际的物理连接而言,没有安全可言。很明显,防火墙对此无能为力。
Local privilege escalation - The trojan horse attack. The attacker alreay has a local account on your box (inside the gates)
and obtains root by some means (vulnerability or misconfiguration). A firewall cannot protect again this type of attacks.
Remote - Your host is listening on a port that the attacker is able to connect to remotely over a network and exploit a
vunerability somehow. This is the only type of attack a firewall can (hopefully) protect you against. There is another
important point here that most firewall howtos neglect. In order for someone to exploit your box remotely, it has to be
listening on some ports (i.e. providing a way for an attacker to connect). Therefore, if your host isnt listening on any
ports, you are safe from remote exploits (unless the attacker manages to attack the network stack itself).
为何需要防火墙?
提高网络安全 - 某些服务有着固有的风险,不可能作到安全性。防火墙可以帮助你提高网段或部分网络的安全性。
网络访问控制 - 防火墙可以强制性的在网络中应用安全规则。
日志记录 - 由于防火墙检测所有入站/出站的网络通讯,它可以记录网络中的活动。
防火墙的类型
代理防火墙 - 代理服务器.
包过滤防火墙 - 检测IP包 (Netfilter).
什么是 Netfilter/Iptables?
Linux 2.4内核中Netfilter是新的用来实现防火墙的. Iptables 是用来指定Netfilter规则的用户工具。
为什么Ipchains被改为Netfilter/Iptables
状态匹配 - 连接跟踪(can you trust the remote host to determine whether your firewall will accept a packet?).
自动碎片重装- Connection tracking automatically reassembles fragmented packets for examination.
改良的匹配规则 - 高级包匹配,例如速率限制、字符串匹配.
增强的日志功能 - 允许自定义日志级别和实体.
允许包撕裂(?mangle) - 允许撕裂包中的任何信息
用户队列Userspace queuing -允许userspace可以对包进行编程.
支持内置包转发 - 舍弃了IPMASQADM.
主要功能
状态包过滤(连接跟踪)
各种网络地址翻译
灵活、易扩展的急智机制
大量的增强型补丁包
Netfilter/iptables可以做什么?
建立Internet防火墙和基于状态的包过滤
用NAT和伪装(masquerading)共享上网
用NAT实现透明代理
和tc+iproute2配合使用可以实现QoS路由
用(mangling)修改IP包头的TOS字段来实现更复杂的功能
安装Iptables
下载
Iptables v1.2.2 (
http://netfilter.samba.org/iptables-1.2.2.tar.bz2
) md5sum 7d065a5d1e7003a061bece79a88d903
Linux kernel v2.4.5 (
http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.5.tar.bz2
)
安装提示
注意,在编译、安装iptables之前,不需要编译内核。并且某些内核选项不可用,除非用"make patch-o-matic".
在/usr/src/linux目录中, make oldconfig (在没有.config文件时,make menuconfig)。
在iptables包的解报目录中, make && make install
打补丁,make patch-o-matic,推荐只打你需要的补丁。
返回 /usr/src/linux目录, make menuconfig ,选择新的、可用的选项
完成正常的内核编译过程(make dep; make clean; make bzImage)
编译 - Iptales编译一般比较简单
make && make install 将在缺省路径/usr/local中做一个最小安装.
make pending-patches 将给标准内核打上一些著名的漏洞补丁.
make patch-o-matic 将给标准内核打上一些增强功能的补丁.
make experimental && make install-experimental 将创建 iptables-save和 iptables-restore 二进制代码.
如果你想修改安装路径,可以带参数BINDIR=/usr/sbin LIBDIR=/usr/lib MANDIR=/usr/man 进行编译。 (e.g. make BINDIR=/usr/sbin
LIBDIR=/usr/lib MANDIR=/usr/man install)
补丁包 - 每个补丁都有新的功能,但几乎每个都有漏洞,因此最好不要全部都安装。
注意: 下面列出的是v1.2.1a版本的,不是最新版本. 你可以用 make patch-o-matic命令列出补丁列表来.
CONFIG_IP_NF_TARGET_BALANCE 选项, 类似DNAT:把负载均分到一段地址上。(`--to-dest 1.2.3.4-1.2.3.7)
CONFIG_IP_NF_TARGET_NETLINK, 替代ipchains中的 -o 选项,通过增加一个NETLINK目标,把丢弃的包发往用户空间
CONFIG_IP_NF_TARGET_SAME ,类似SNAT,利用一段地址(`--to-source 1.2.3.4-1.2.3.7),对客户端的每个连接给相同的地址.
CONFIG_IP_NF_TARGET_TTL ,允许用户修改IP包中的TTL值。
CONFIG_IP_NF_MATCH_AH_ESP, 支持两个扩展匹配(`ah and `esp),允许在IPSec包中的AH或者ESP包头中匹配一段SPI范围
CONFIG_IP_NF_DROPTABLE . 将要被丢弃的包将通过这个表,来允许做日志记录,(此补丁有漏洞)
CONFIG_IP_NF_EGG: 连接跟踪。Connection tracking for eggdrop bot networks.
CONFIG_IP_NF_TARGET_FTOS ,允许你任意设置TOS值。从0x0-0xff
ftp-multi.patch 允许ftp连接跟踪和地址翻译到最多8个端口。在ip_conntrack_ftp和ip_nat_ftp模块中用 `ports=选项. 不然,将使用缺省
21端口。另外,它还支持FXP(direct FTP 2 FTP transport).使用模块载入参数`fxp=1`可以来支持FXP
ftp-pasv-fix.patch :可以在使用ip_conntrack_ftp.o模块的情况下,在FTP服务器上实现状态类型防火墙功能
CONFIG_IP_NF_MATCH_IPLIMIT 允许限制每个客户端(每个IP)并发TCP连接的最大个数
例如:
#每个客户端最多允许2个telnet连接
iptables -p tcp -dport 23 -m iplimit --iplimit-above 2 -j REJECT
# you can also match the other way around:
iptables -p tcp -dport 23 -m iplimit ! --iplimit-above 2 -j ACCEPT
# 每个C类地址允许的http连接的并发最大个数为16
iptables -p tcp -dport 80 -m iplimit --iplimit-above 16 --iplimit-mask 24 -j REJECT
#允许每个IP地址可同时发起4个HTTP连接
iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-above 4 -j REJECT
#允许整个A类地址中每个地址的HTTP访问为4
iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-mask 8 --iplimit-above 4 -j REJECT
CONFIG_IP_NF_IRC: IRC支持模块,允许 DCC和NAT、连接跟踪一起工作。此补丁依赖丢弃表(dropped-table)和段偏移(seqoffset).
masquerade+fwmark.patch :一种复杂的路由设置,依靠防火墙的标记来路由,和 MASQUERADE NAT target组合来用
nat+conntrack-hashsize.patch 设置连接跟踪代码和NAT代码中的模块参数(hashsize=xxx) hash表的大小,NAT的缺省值为内存的
1/16384(对于大多数机器来说,比先前的缺省值64好多了).
CONFIG_IP_NF_POOL, 提供了一种从IP地址段中的一个位的位映射,它依赖于源或目的地址是否在地址池中设置了位。它也提供了一个目标池
CONFIG_IP_NF_MATCH_PSD, 支持端口扫描检测(PSDortScanDetection). 可以检测TCP和UDP端口扫描. 它源自Solar Designer? scanlogd.
支持的选项:
--psd-weight-threshold
从同一主机发往不同目的端口的TCP/UDP包的总的优先级,被用来作为端口扫描次序
--psd-delay-threshold
由同一主机发往不同目的端口的包的延迟 (in hundredths of second) ,用来作为可能的端口扫描子次序
--psd-lo-ports-weight
特权目的端口的优先级,即目标端口(
非特权目的端口的优先级(>1024).
举例:iptables -A INPUT -m psd -j DROP
CONFIG_IP_NF_MATCH_RPC, 支持两个模块ip_conntrack_rpc_udp和ip_conntrack_rpc_tcp(用来分别跟踪UDP和TCP的端口映射请求),在
iptabIe 中添加record_rpc(用来匹配是否包的源地址已经发过端口映射请求,或者是一个新的发往端口映射的GET请求,以允许RPC过滤)
seqoffset.patch - 新的NAT中的 API 函数. 此API函数隐藏了所有的协议翻译(例如:ftp/irc)中的包重设大小和计算序列号的细节问题
要求:至少内核 2.4.2以上!
dropped-table-patch from netfilter patch-o-matic
CONFIG_IP_NF_NAT_SNMP_BASIC 基本的SNMP地址翻译支持. 如同RFC 2962中描述的,是 SNMP-ALG中的“基本”条目;它通过修改SNMP有效载荷
中的IP地址来匹配IP层的地址翻译映射.
CONFIG_IP_NF_MATCH_STRING :允许在整个包里匹配字符串.
iptables -A INPUT -m string --string cmd.exe -j QUEUE
tcp-window-tracking.patch :通过Guido van Rooij的论文"IP过滤器中的实时状态TCP包过滤“( Real Stateful TCP Packet Filtering in
IP Filter),实现了TCP连接跟踪.它包含新的支持已建立的连接控制的TCP连接跟踪. 并添加了窗口缩放支持(Window scaling).
CONFIG_IP_NF_MATCH_TTL option:允许用户根据包的TTL值来匹配包.
CONFIG_IP_NF_TARGET_ULOG:支持更多高级的包日志记录机制,目录libiptulog/ 下包含有收到的ULOG消息库.
更多信息:
http://www.gnumonks.org/projects/ulogd
CONFIG_IP6_NF_TARGET_LOG :在ip6tables中添加LOG target.
CONFIG_IP6_NF_TARGET_REJECT:在ip6tables中添加拒绝目标( REJECT target). 请注意此处的 icmp-types与icmpv6 types不同(更多消息请
看:ip6tables -j REJECT -h)
ipv6-ports.patch:ipv6 有IPv6的自己的端口匹配形式.
注意: 以上高亮显示的补丁并不表示你应该编译进你的内核中。仅表示我发现的有趣的功能。你可以把你感兴趣的补丁从目录patch-o-matic
中拷贝到usr/src/linux,并且运行 patch -R -p1
下面是一篇转载的关于用IPTables实现字符串模式匹配 的文章
自1995年ipfwadm开始进入1.2.1的核心,Linux的防火墙实现有很长的时间了。Ipfwadm实现了标准的tcp/ip包过滤功能,比如过滤源地址与目
的地址以及端口过滤。早在1999年第一个稳定的2.2.0核心中防火墙的实现被ipchains替代了,ipchains 的新功能包括支持规则链,碎片包控
制,较好的网络地址翻译功能(NAT)以及其他一些有用的改进。我们需要明白Linux防火墙包括核心级代码(通常是可加载核心模块或者核心
源程序的补丁)和用户级代码(一个配置的工具,比如/usr/bin/ipchains,这是用来插入包规则到核心空间的)因此无论如何,只要新的
linux防火墙代码被引入,核心和用户空间的有关代码都要改写。
2001年2.4的核心完成了,iptables出现了。它引入了很多重要的改进,比如基于状态的防火墙,基于任何TCP标记和MAC地址的包过滤,更灵活
的配置和记录功能,强大而且简单的NAT功能和透明代理功能,通过速度限制实现DoS的阻止(更详细的资料请参看A Comparison of iptables
Automation Tools一文)。
然而,最重要变化是引入了模块化的架构方式。比如,ipchains和ipfwadm兼容模式是通过一个核心模块的设置实现的,该模块能够在运行的核
心中插入,以便提供相应的通讯功能。在附加的变化中,用户自定义编码功能已经成为了可能,比如过滤一定范围的端口,根据TTL值和包的到
达时间进行判断,对自定义的协议进行状态监视,对随机的数据包进行监视等,这些目前都还不是iptable的一部分,但是在未来将被实现。很
多很有趣的新模块已经完成了。编写一个可加载的核心模块来创建核心级代码,通过用户级代码实现控制过滤器的行为。参见Rusty Russells
Linux iptables HOWTO
本文主要关注字符串模式匹配的功能,(显然,是通过模块实现的),该功能可以限制和研究数据包的有效载荷。这是 iptable技术的一个非常
有意义的突破,它超越了传统的包过滤防火墙的标准TCP/IP标志监视功能。传统的防火墙可以分为包过滤和应用代理两种类型,应用代理防火
墙可以分别出应用层的协议比如telnet,HTTP或者SMTP,能够监视这些协议的有效载荷和检查命令,但是应用代理防火墙带来了巨大的性能缺
陷:当通过网络协议栈处理上层即应用层的数据包。同时我们需要为每一个要监控的协议编写新的代理程序。包过滤防火墙通常只监视源地址
和目的地址,源端口和目的端口,TCP/IP标志等,而完全忽略了高层协议的有效载荷。由于上述原因,包过滤防火墙通常比应用代理防火墙的
速度快。应用代理提供了更加有力度的安全控制而包过滤可以用于更高的带宽线路满足更高的吞吐量。
基于以上的情况,iptables的新增功能提供了跨越两种防火墙类型的优势,避免了各自的缺陷,这个功能同时非常清晰的证明了新的模块化的
架构较之老的ipchains的优势,它能够使得iptables工作在网络层(OSI模型的第三层)不必工作在高层协议,但是却可以监视高层协议的有效
载荷,而不必分析应用层的通信结构。
在2001年5月以前,还没有提出字符串模式匹配模块以前。有一个尝试添加内容监控的能力给iptables防火墙的工程:Hogwash。该工程结合了
Snort IDS规则模式匹配引擎,以便于iptable能够响应带有攻击信号的数据包。
现在我们提供了一个Step-By-Step的指导,以便于在RedHat Linux上实现模式匹配的包监视功能。标准的RH7.2提供了iptables 1.2.3的版本以
及1.2.4的可用RPM升级包。然而,模式匹配功能没有被包含在标准的发行版中,因为开发人员将它标记为试验。
如果你使用的是RH7.1-7.2,你就已经使用了2.4的核心。你至少需要2.4.4的核心以便能够使用iptables 1.2.4的功能。通常推荐你从发行商那
里下载最新的可用的核心。目前,有一个例外:iptables-1.2.4的字符串模式匹配补丁不能在2.4.9 的核心下工作。你应该安装核心的源码RPM
包(通常被放在/usr/src/linux-2.4.x的源码树内)或者从别处下载的核心源程序(比如
www.kernel.org
或者它的一个镜像)。
在本文中,将采用最新的2.4.16核心作为例子。测试也能运行在使用2.4.7核心的RedHat 7.2上,但是2.4.7的核心并不推荐使用,因为2.4.7的
核心有一些小的安全问题,比如SYN-cookie保护和iptables的保存/恢复功能。
接下来需要从
http://netfilter.samba.org/iptables-1.2.4.tar.bz2
下载iptables。当对压缩文件进行解压缩之后,需要对iptables进行配置
,合并相关的核心源程序树。可以使用半自动化的程序来完成这个目的。首先,可能需要运行程序以便包含已经考虑过的稳定的iptables补丁
,但是这个补丁没有被包含在kernel的发行版内。从iptables的解压目录(在本例中iptables在 /home/anton/iptables-1.2.4,核心源程序在
/usr/src/linux-2.4.16)运行:
make pending-patches KERNEL_DIR=/usr/src/linux-2.4.16
这将开始运行交互式的补丁应用程序,虽然你可以安全应用所有的补丁,但是没有一个补丁是iptables的字符串匹配所必需的。对任何你认为
需要的补丁都回答y(yes)。如果你希望能够安全的使用iptables,则选择none。
现在我们将准备应用试验部分的补丁,比如字符串模式匹配的支持。运行:
make patch-o-matic KERNEL_DIR=/usr/src/linux-2.4.16
在这个交互式的过程中,回答y(yes)以便应用string.patch。程序将遍历所有的可用的补丁,包括那些稳定的。
Testing... string.patch NOT APPLIED ( 2 missing files)
The string patch:
Author: Emmanuel Roger
Status: Working, not with kernel 2.4.9
This patch adds CONFIG_IP_NF_MATCH_STRING which allows you to
match a string in a whole packet.
THIS PATCH DOES NOT WORK WITH KERNEL 2.4.9 !
Do you want to apply this patch [N/y/t/f/q/?] y
其余的补丁也许也让你非常感兴趣,不过它们与本文并不相关。如果你选择安装任何别的补丁,请注意开发者给出的警告信息,其中包括了补
丁的功能(比如dropped表的补丁)确定你没有安装MAC过滤的补丁,因为最近发现这个补丁包含一个漏洞。
现在我们开始编译用户空间程序和相关的Libraries:
make KERNEL_DIR=/usr/src/linux-2.4.16
然后我们安装它们(iptables在/usr/local/user/sbin,libraries在/usr/local/lib/iptables)在root身份下执行以下内容:
make install KERNEL_DIR=/usr/src/linux-2.4.16
紧接着我们配置和编译核心:
Now we are ready to compile the user-space code and the libraries:
make KERNEL_DIR=/usr/src/linux-2.4.16
and then install them (iptables program goes in /usr/local/user/sbin and libraries go into /usr/local/lib/iptables). As root:
cd /usr/src/linux-2.4.16
可以使用任何的核心配置方法。有关详细的配置核心的方法,可以查阅Internet资源,Internet上有大量的这方面的文档,比如kernel HOWTO
等。以下简要介绍一下:
make xconfig
在GUI界面下,选择Netfilter配置选项,然后在Strings match support前选择m(模块支持),如下图:
然后执行通常的操作:
make dep;make bzImage;make modules;make modules_install
现在按照你喜欢的方式安装核心,并重新启动。重新启动系统以后,测试一下iptables是否支持模式匹配功能,在root身份下执行:
/usr/local/sbin/iptables ?m string ?help
该命令将显示如下标准的iptables帮助信息:
STRING match v1.2.4 options:
--string [!] string Match a string in a packet
该功能允许你对匹配数据包的内容,我们可以通过netcat或者telnet来测试这一功能,从而确定我们确实可以获得数据包的内容。
运行:
iptables -A INPUT -m string --string "test" -j LOG --log-level
info --log-prefix "TEST"
然后启动一个netcat的服务器:
nc -l -p 3456
然后连接该netcat服务器:
telnet localhost 3456
然后输入:
test
whatevertestdoes
这样将引起iptables产生一个简单的记录,我们在记录文件中将会看到如下的信息(当然你需要设置了记录信息的级别为info)
Nov 27 23:16:53 pua kernel:
TEST IN=lo OUT=MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00
SRC=127.0.0.1 DST=127.0.0.1 LEN=2154 TOS=0x00 PREC=0x00 TTL=64
ID=42880 DF PROTO=TCP SPT=3128 DPT=33018 WINDOW=32767 RES=0x00 ACK PSH URGP=0
Nov 27 23:16:53 pua kernel:
TEST IN=lo OUT=MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00
SRC=127.0.0.1 DST=127.0.0.1LEN=1830 TOS=0x00 PREC=0x00 TTL=64
ID=17451 DF PROTO=TCP SPT=8000 DPT=33017 WINDOW=32767 RES=0x00 ACK PSH URGP=0
在 tcp/ip数据包中只要出现test字符串,以上的信息就会产生。这有什么好处呢?太多了。正如Filtering packets based on string
matching这篇文章所建议的那样,该文章可以在linuxguru.net的sysctl内找到。它能够用来阻止那些讨厌的IIS蠕虫造成得 Unix web服务器记
录文件记录大量的对cmd.exe的请求,这些蠕虫将不再干扰你,但是如果你的/var分区(通常是记录文件存放的分区)不够大,那么这一功能将
有一定的帮助。只要静静地丢弃蠕虫对80端口的请求或者使用记录限制功能,对这些信息进行记录,丢弃这些包的操作如下:
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe"
每小时只记录一条这样的信息:
iptables -I INPUT -j LOG -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe" -m limit
--limit 1/hour
Bill Steams(Mason firewall building script的作者)提供了一个极好的建议----转换网络IDS Snort的规则成为iptables字符串模式匹配
的规则。Snort的攻击信号数据库中包含了大约1200种信号and appears to be the biggest publicly available attack database suitable
for instant deployment。在iptables上使用现成的信号是合理的一种方式。
http://www.strearns.org
/snort2iptables 是Bill Stearm提供
的试验性的软件。在这里你可以找到shell脚本以便将标准的Snort规则转换为iptables的规则。下面是一个将snort关于 Linux下针对mountd的
攻击和bind的攻击转化为iptables的规则的例子:
Snort 规则:
1. alert udp $EXTERNAL_NET any -> $HOME_NET 518
(msg:"EXPLOIT ntalkd x86 linux overflow";
content:"|0103 0000 000 0 0001 0002 02e8|";
reference:bugtraq,210; classtype:attempted-admin; sid:313; rev:2;)
2. alert tcp $EXTERNAL_NET any -> $HOME_NET 53
(msg:"EXPLOIT named tsig infoleak";
content: "|AB CD 09 80 00 00 00 01 00 00 00 00 00 00 01 00 01 20 20 20 20 02 61|";
reference:cve,CAN-2000-0010; reference:bugtraq,2302; reference:arachnids,482;
classtype:attempted-admin; sid:303; rev:3;)
3. alert udp $EXTERNAL_NET any -> $HOME_NET 635
(msg:"EXPLOIT x86 linux mountd overflow";
content:"|5eb0 0289 06fe c889 4604 b006 8946|";
reference:cve,CVE-1999-0002; classtype:attempted-admin; sid:315; rev:1;)
转化的iptables规则:
1. iptables -A SnortRules -p udp -s $EXTERNAL_NET -d $HOME_NET --dport 518 -m
string --string " è" -j LOG --log-prefix "SID313 " # "EXPLOIT ntalkd x86
linux overflow" bugtraq,210 classtype:
attempted-admin sid:313
2. iptables -A SnortRules -p tcp -s $EXTERNAL_NET -d $HOME_NET --dport 53 -m
string --string "?? .a" -j LOG --log-prefix "
SID303 " # "EXPLOIT named tsig infoleak" cve,CAN-2000-0010 bugtraq,2302
arachnids,482 classtype:attempted-admin sid:303
3. iptables -A SnortRules -p udp -s $EXTERNAL_NET -d $HOME_NET --dport 635 -m
string --string "^° ‰ ??‰F ° ‰F" -j LOG --log-prefix " cve-CVE-1999-0002
" # "EXPLOIT x86 linux mountd overflow" classtype:attempted-admin sid:315
显而易见,上面的转化使用了针对漏洞所使用的缓冲区溢出字符串作为捕获攻击的方式,有些规则不便于转化主要是因为在桢的控制方面snort
比iptables要强大一点。
总之,iptables的字符串模式匹配功能能够被用来保护那些开放了易受攻击的而一般的包过滤又无法保护的网络服务(如WWW服务,mail服务,
DNS 服务,FTP服务等)的组织的网络(如果将它布置在组织的网关上)和单个的主机(使iptables成为主机的一部分),另外,iptables的字
符串模式匹配功能还能够帮助实现强制安全策略,即通过关键字来阻止访问非法的内容。
2006.3.7 21:40 作者:cao1215 引用:0 | 收藏 | 评论:0
Linux下的NAT及防火墙的混合应用
分类:默认栏目
Linux下的NAT及防火墙的混合应用
Linux下的NAT及防火墙的混合应用
【摘要】
主要讲述Linux系统下的NAT(网络地址转换)和基于NAT的防火墙技术。
首先由Linux系统的安装引入,着重介绍LINUX下的NAT的网络配置(服务端和客户端),以及防火墙配置原则。
其次,从理论上阐述,“什么是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:dosutilsrawrite.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的熟练用户,可以在取消服务后,不用重新启动,在命令行侠打入
  ps aux    
会显示现在在后台运行的所有服务,看到要杀死的进程后,打入
kill -9
(-9代表强制杀掉进程)杀死进程。
然后进入/etc/sysconfig/network-scripts/目录
vi ifcfg-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;
vi ifcfg-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种N
AT.
静态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 HAT 9.0下自带防火墙 IPTABLES
我们在做好网络设置后,假如要实现客户端(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并且从e
th1出口送出。
    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
这种方式进行浏...蛲??游侍饽兀?/a>
在命令行下打入:
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在作为网络网关服务器有充分的方式,不仅系统强壮,并且配置性很强。希望给
广大喜欢网络及网络管理的同学提供了新的思路。 难题 - 熬夜 = 没问题  



本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/76362/showart_1812717.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP