4、应用实战1:使用Iptables保障网络服务安全
由于iptables在实际生活中得到了非常广泛的使用,本文将介绍一个使用其保障网络服务安全的例子,以使用户能够在实际使用中举一反三。
1) 应用场景和网络拓扑
在这个应用中,我们将需要使用iptables防火墙保护企业网络提供的对外的公共Internet服务,这些服务包括WWW服务、FTP服务、SMTP服务以及DNS服务(具体的网络拓扑请参见图2)。因此,这些服务起都具有有效的Internet地址。
为了将内部网段210.10.18.0/24与Internet隔离,在内部网络和Internet之间使用了包过滤防火墙。具体的IP地址设置如下:
 防火墙的内网接口是eth0(IP地址为:210.10.18.88),防火墙对外的Internet接口是eth1(IP地址为:210.10.19.188);
 WWW服务器:IP地址为210.10.18.89;
 FTP服务器:IP地址为210.10.18.90;
 DNS服务器:IP地址为210.10.18.91;
 SMTP服务器:IP地址为210.10.18.92。
 

图2  防火墙部署实例示意图
2) 防火墙具体配置
本应用的主要目的是对企业网提供各种服务的服务器提供保护,以使他们免受来自于外网Internet恶意用户和流量的攻击和危害。在配置过程中,需要根据本文前面部分介绍的知识进行规则编写等工作,具体的步骤如下:

(1)建立有关的脚本文件:在/etc/rc.d/目录下用touch命令建立空的脚本文件,执行chmod命令添加可执行权限。
# touch /etc/rc.d/firewall-for-networkservice
# chmod u+x /etc/rc.d/firewall-for-networkservice
(2)编辑/etc/rc.d/rc.local文件,在末尾加上/etc/rc.d/firewall-for-networkservice 以确保开机时能自动执行该脚本,运行如下命令:
# echo “/etc/rc.d/firewall-for-networkservice” >>/etc/rc.d/rc.local

(3)使用Vi或者Gedit等编辑器编辑/etc/rc.d/firewall-for-networkservice文件,插入如下内容:
1)添加相关脚本信息,注意:脚本中的注释是采用“#”表示,而不是通常用的“//”
# 添加脚本编写头部
# !/bin/bash
# 在屏幕上显示信息
echo “Starting iptables rules…”
# 开启内核转发功能
echo “1” >/proc/sys/net/ipv4/ip_forward

2)定义规则重要使用的相关变量
# 定义变量
IPT=/sbin/iptables
WEB_SERVER=210.10.18.89
FTP_SERVER=210.10.18.90
DNS_SERVER=210.10.18.91
SMTP_SERVER=210.10.18.92
PROTECT_DOMAIN=“210.10.18.0/24”

3)刷新基本的链规则,并禁止转发任意包
$IPT_LIST –F
$IPT_LIST –P FORWARD DROP

4)设置有关保护服务器的包过滤规则,并且注意由于服务器/客户机交互是双向的,所以不仅仅要设置数据包出去的规则,还要设置数据包返回的规则,如下所示:

#保护WWW服务:服务端口为80,采用tcp或udp协议
#规则为:eth1=>允许目的为内部网WWW服务器的包
$IPT_LIST –A FORWORD –p tcp udp –d $WEB_SERVER –dport www –i eth1 –j ACCEPT

#保护FTP服务:服务端口为:命令端口21,数据端口20。FTP服务采用tcp协议。
# 规则为:eth1=>允许目的为内部网FTP服务器的包
$IPT_LIST –A FORWORD –p tcp –d $FTP_SERVER –dport ftp –i eth1 –j ACCEPT

#保护DNS服务:DNS端口53,采用tcp协议或者udp协议
#规则为:eth1=>允许目的为内部网DNS服务器的查询请求
$IPT_LIST –A FORWORD –p tcp udp –d $ DNS_SERVER –dport dns –i eth1 –j ACCEPT

#保护SMTP服务:smtp端口25,采用tcp协议
#规则为:eth1=>允许目的为内部网SMTP服务器的smtp请求
$IPT_LIST –A FORWORD –p tcp –d $ SMTP_SERVER –dport smtp –i eth1 –j ACCEPT

(4)执行脚本,使配置规则立刻生效
# /etc/rc.d/firewall-for-networkservice
5、应用实战2:使用Iptables完成NAT功能
1)NAT简介
NAT(Network Address Translation)恰恰是出于某种特殊需要而对数据包的源IP地址、目的IP地址、源端口、目的端口进行改写的操作。Linux将NAT分成了两种类型,即源NAT(SNAT)和目的NAT(DNAT),顾名思义,所谓SNAT就是改变转发数据包的源地址,所谓DNAT就是改变转发数据包的目的地址。前面提到过,netfilter是Linux核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组成。并且系统缺省的表是"filter"。但是在使用NAT的时候,我们所使用的表不再是"filter",而是"nat"表,所以我们必须使用"-t nat"选项来显式地指明这一点。因为系统缺省的表是"filter",所以在使用filter功能时,我们没有必要显式的指明"-t filter"。同filter表一样,nat表也有三条缺省的"链"(chains),这三条链也是规则的容器。
2) NAT具体使用
a)源地址NAT
(1)标准的SNAT
SNAT的目的是进行源地址转换,应用于POSTROUTING规则链。在路由决定之后应用SNAT与出站接口相关,而不是入站接口。语法如下:
 iptables -t nat -A POSTROUTING -o <outgoing interface> -j SNAT --to-source <address>[-<address>][:port-port]
(2)MASQUERADE源NAT
MASQUERADE没有选项来指定在NAT设备上使用的特定源地址,使用的源地址就是出站好接口的地址。
iptables -t nat -A POSTROUTING -o <outgoing interface> -j MASQUERADE [--to-ports <port>[-port]]
举一个简单的例子:更改所有来自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地址等信息。
b)目的地址NAT
目的地址NAT有2种形式:DNAT和REDIRECT。REDIRECT是目的地址转换的特殊形式,将数据包重定向到NAT设备的输入或回环接口。目的地址NAT应用于nat表的PREROUTING和OUTPUT规则链,在做出路由决定前对目的地址进行修改。在PREROUTING中,DNAT和REDIRECT规则与用来接受通过本地路由转发或送到主机的入站接口的数据包的入站接口有关。在OUTPUT中,DNAT和REDIRECT规则用来处理来自NAT主机本身生成的出站数据包。
(1)标准目的地址NAT(DNAT)
iptables -t nat -A PREROUTING -i <incoming interface> -j DNAT --to-destination <address>[-<address>][:port-port]
iptables -t nat -A OUTPUT -o <outgoing interface> -j DNAT --to-destination <address>[-<address>][:port-port]
目的地址用来替换数据包中的原始目的地址和多位本地服务器地址。
(2)REDIRECT
iptables -t nat -A PREROUTING -i <incoming interface> -j REDIRECT [--to-ports <port>[-port]]
iptables -t nat -A OUTPUT -o <outgoing interface> -j REDIRECT [--to-ports <port>[-port]]
REDIRECT重定向数据包到执行REDIRECT操作的那台主机。

举个简单的例子:更改所有来自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
c)一个具体的应用实例
为了更加系统和全面地介绍NAT的使用,下面举一个实际的例子来进行说明。假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP地址都是私网IP,通过该私网IP用户无法向外发布信息。但是,部分用户要求建立自己的WWW服务器对外发布信息。我们可以再防火墙的外部网卡上绑定多个合法IP地址,然后通过ip映射使发给其中某一个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。
具体的IP分配如下:
(1)该ISP分配给A单位www服务器的IP为:
私网ip:172.168.92.100
公网ip:210.95.33.100
(2)该ISP分配给B单位www服务器的IP为:
私网ip:172.168.92.200
公网ip:210.95.33.200
(3)Linux防火墙的IP地址分别为:
内网接口eth1:172.168.92.10
外网接口eth0:210.95.33.1
然后,我们需要进行如下步骤地操作:
(1)将分配给A、B单位的真实ip绑定到防火墙的外网接口,以root权限执行以下命令:
#ifconfig eth0 add 210.95.33.100 netmask 255.255.255.0
#ifconfig eth0 add 210.95.33.200 netmask 255.255.255.0
(2)成功升级内核后安装iptables,然后执行以下脚本载入相关模块:
modprobe ip_tables
modprobe ip_nat_ftp
(3)对防火墙接收到的目的ip为210.95.33.100和210.95.33.200的所有数据包进行目的NAT(DNAT):
#iptables -A PREROUTING -i eth0 -d 210.95.33.100 -j DNAT --to 172.168.92.100
#iptables -A PREROUTING -i eth0 -d 210.95.33.200 -j DNAT --to 172.168.92.200
(4)对防火墙接收到的源ip地址为172.168.92.100和172.168.92.200的数据包进行源NAT(SNAT):
#iptables -A POSTROUTING -o eth0 -s 172.168.92.100 -j SNAT --to 210.95.33.100
#iptables -A POSTROUTING -o eth0 -s 172.168.92.200 -j SNAT --to 210.95.33.200
这样,所有目的ip为210.95.33.100和210.95.33.200的数据包都将分别被转发给172.168.92.100和172.168.92.200;而所有来自172.168.92.100和172.168.92.200的数据包都将分 别被伪装成由210.95.33.100和210.95.33.200,从而也就实现了ip映射。

文章如转载,请注明转载自:http://www.5iadmin.com/post/1030.html