在上一篇博文介绍了Linux防火墙的表、链结构及iptables规则设置。那么,当Linux防火墙同时作为企业的网关服务器使用的时候,怎样使局域网用户也能够访问互联网呢?又怎样才能使互联网中的用户能够访问到局域网内部的网络服务器?iptables真的能做到这些吗?答案是:Yes。

本文主要针对前面的问题进行解决,主要介绍nat表中的两个典型应用:SNAT和DNAT策略(分别用于实现企业局域网共享上网、在Internet中发布内网的应用服务器)。

上一篇博文地址:http://lansgg.blog.51cto.com/5675165/1220438

1、SNAT策略及应用

>>>SNAT策略概述

  随着Internet网络在全世界范围内的快速发展,IPv4协议支持的可用IP地址资源逐渐变得山穷水尽,资源匮乏使得很多企业难以申请更多的公网IP地址,或者只能承受一个或者少数几个公网IP地址的费用。而与此同时,大部分企业都面临着将局域网的主机接入Internet的需求。使用iptables的SNAT策略,可以基本化解这个难题。

案例:1、

在一个小型的企业网络中,Linux网关服务器有两块网卡,分别用于连接内部局域网和Internet;如下图

linux之iptables详解及配置(二)+案例_第1张图片

当Linux网关服务器正常开启路由转发(未使用SNAT)时,局域网访问Internet的数据包,经网关转发后其源IP地址保持不变(仍为192.168.1.100),而Internet中主机收到这样的请求数据包后,将无法为其返回应答数据包(因为该地址是私有IP地址,无法为其正确路由),从而导致访问失败;

如果在Linux网关服务器中有针对性的应用SNAT策略,数据包转发情况就不一样了。当局域网访问Internet的数据包到达网关服务器时,网关进行路由选择,若发现该数据包需要从外网接口(如eth0)向外转发,则将该数据包的源IP地址(如:192.168.1.100)修改为网关的外网接口地址(如:218.29.30.31),然后才提交到Internet中,最后发送到目标主机(www.google.com)。相当于以网关服务器的公网身份提交数据访问请求,自然就可以收到正常的响应数据包。然后网关服务器再根据之前建立的SNAT映射,将响应数据包返回给局域网中的源主机。只要连接到第一个包被SNAT处理了,那么这个连接及对应数据流的其他包通常也会自动的被进行SNAT处理。

>>>SNAT策略应用;(解决上述问题)

从前面的需求中,大致了解到,SNAT典型应用于局域网共享上网的接入,而处理数据包的切入时机,主要选择在路由选择之后(POSTROUTING)进行。SNAT的关键在于将局域网外发数据包的源IP地址(私有地址)修改为网关的外网接口IP地址(公有地址)。

SNAT只能用于nat表的POSTROUTING链。使用iptables命令设置SNAT策略时,需要结合“--to-source IP地址”选项指定修改后的IP地址(例如:-j SNAT --to-source 218.29.30.31).

下面通过实例配置来说明SNAT策略的用法,案例环境及需求描述如下。(拓扑图如上)

》、公司的网关服务器使用了Linux操作系统。

》》、网关上有两块网卡: 期中eth0连接Internet,使用固定IP地址 218.29.30.31/30;eth1连接局域网,使用固定IP地址192.168.1.1/24。

》》》、局域网内各主机的默认网关设置为192.168.1.1,且已经设置了正确的DNS服务器。

》》》》、现需要在Linux网关主机中进行正确配置,以使192.168.1.0/24网段的局域网用户能够共享方式访问Internet。

根据上述环境,在Linux网关中推荐的操作步骤如下。

(1)、确认开启网关服务器的路由转发功能。

[root@node1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@node1 ~]# sysctl -p

(2)、为局域网访问Internet的数据包采用SNAT策略,将源地址更改为服务器的公网IP地址。

[root@node1 ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31

使用局域网内的客户机访问Internet中的网站(如:www.baidu.com)进行测试,测试成功以后将上述SNAT策略添加到防火墙脚本文件中,并设置未开机后自动运行。

Ps 以上介绍的应用是网关服务器具有固定的静态公网IP地址的情况,而在某些时候,企业很可能使用非固定的动态公网地址,例如使用ADSL宽带接入时可能获得是动态IP地址。那么在这种网络环境下,又应该如何设置SNAT策略呢?iptables提供了一个名为MASQUERADE(伪装)的数据包处理方式,MASQUERADE相当于SNAT的特例,同样也完成修改(伪装)数据包源IP地址的工作,只不过它会自动获取外网接口的IP地址,而无需使用“--to-source”的形式。

  使用iptables命令设置MASQUERADE策略时,只需要去掉SNAT策略中的“--to-source IP地址”,改用“-j MASQUERADE”指定数据包处理方式即可。ADSL通常使用PPPOE技术,在Linux系统中,对应的连接名称为ppp0、ppp1等,如果无法确定连接的编号,还可以使用ppp+代替。

eg:  设置MASQUERADE策略,使用192.168.1.0/24网段能够通过网关的ppp0连接共享上网。

[root@node1 ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp0 -j MASQUERADE

当然,即使网关服务器有静态的IP地址,也同样可以使用MASQUERADE,而不用SNAT。只不过,MASQUERADE会比SNAT多一些额外的开销,因此如果有固定的IP地址,最好还是使用SNAT策略。

2、DNAT策略及应用

>>>DNAT策略概述

DNAT策略与SNAT非常相似,只不过应用方向反过来了。SNAT用于修改源IP地址,而DNAT用于修改目标IP地址;SNAT只能在nat表的POSTROUTING链中,而DNAT只能用在nat表的PREROUTING链和OUTPUT链(或被其调用的链)中。

 例如:考虑到应用服务的安全和稳定性,公司将对外的Web服务器架设在一个内部网络中,而公司仍然只有一个公网IP地址,又需要使Internet中的客户机能够访问公司的网站,这时候,使用DNAT策略可以有效保证位于内网中的网站服务器于Internet中的客户机的相互通讯。

linux之iptables详解及配置(二)+案例_第2张图片

由于企业申请的Internet域名要解析到一个合法的公网IP地址(如:218.29.30.31),当Internet中的客户机提交的http请求到达企业的网关主机时,网关首先判断该数据包的目标地址和目标端口,若发现该数据包需要访问本机的80端口,则将该数据包的目标IP地址(如:218.29.30.31)修改为内网中真正的网站服务器的IP地址(如:192.168.1.6),然后才进行路由选择,最后发送到内部的网站服务器(192.168.1.6).然后网关服务器再根据之前建立的DNAT映射,修改返回的HTTP应答数据包的源IP地址,最后返回给Internet中的客户机。

在上述的DNAT转换地址的过程,Internet中的客户机无需指定企业网站服务器的真实局域网地址,中间的转换完全由网关主机完成。通过DNAT策略,位于企业内部的应用服务器就可以对Internet提供服务了。

>>>DNAT策略的应用

   使用iptables命令设置DNAT策略时,需要结合"--to-destination IP地址"的选项指定企业内网服务器的实际IP地址(如:-j DNAT --to-destination 218.29.30.31)。下面将通过两个实例来说明DNAT策略的用法。

案例:1、见上图拓扑:

》、公司在ISP注册了域名 www.lansgg.com,并对应于Linux网关的外网的接口(eth0)地址:218.20.30.31.

》》、公司的网站服务器位于局域网内,IP地址为192.168.1.6。

》》》、Internet用户可以通过访问www.lansgg.com来查看公司的网站内容。

根据上述环境,在Linux网关中推荐的操作步骤如下:

(1)确认开启网关服务器的路由转发功能。

[root@node1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@node1 ~]# sysctl -p

(2)在网关上添加DNAT映射,对于访问网关80端口的数据包,将目标地址更改为网站服务器的内网IP地址。

[root@node1 ~]# iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6

使用Internet中客户机访问http://www.lansgg.com进行测试,测试成功以后将上述DNAT策略添加到网关的防火墙脚本文件中,并设置为开机后自动运行。

Ps: 如果没有设置SNAT共享上网策略,内网的客户机可能将无法使用公网地址(如:218.29.30.31)的形式访问公司内部的网站服务器。若确实有这种需求,可以有针对性的添加一条SNAT规则,如下命令:

[root@node1 ~]# iptables -t nat -I POSTROUTING -s 192.168.1.0/24 -d 218.29.30.31 -p tcp --dport 80 -j SNAT --to-source 192.168.1.1

案例:2、若需要做DNAT的内部服务与网关主机本身的服务发送冲突,则需要对数据访问进行区分。例如,Linux网关本身运行了SSH服务,内部网络中的数据库服务器也运行了SSH服务,两台主机都希望能从Internet中进行远程管理。由于可用的公网IP地址只有一个,因此就有必要在网关上根据访问端口进行区分。SSH服务器默认使用的端口号为22。

linux之iptables详解及配置(二)+案例_第3张图片

》、公司的Linux网关服务器的外网IP地址eth0:218.29.30.31;位于局域网的数据库服务器IP地址:192.168.1.5;

》》、根据公司安排,管理员要能够随时从家里的主机远程管理数据库服务器,登录的目标地址为218.29.30.31:2222

》》》、管理员家里主机的IP地址可能在63.34.45.0/24网段范围中随机变动。

根据上述环境,应用DNAT策略的思路如下。

>、访问218.29.30.31:22的数据仍保持默认(不做处理),对应网关主机本身的SSH服务。

>>、两台主机的SSH服务都使用默认的22端口不变。

>>>、在网关主机上,将访问本机2222端口的数据包进行DNAT处理,对应到内部网络中的数据库服务器(需要同时指定目标端口)。

推荐操作步骤如下;

(1)、在数据库服务器上开启ssh服务,(注意设置好路由或默认网关记录)

service sshd start
route add -net 63.34.45.0/24 gw 192.168.1.1

(2)、确认开启网关服务器的路由转发功能。

[root@node1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@node1 ~]# sysctl -p

(3)、在网关上添加DNAT映射,对于访问网关2222端口的数据包,将目标地址更改为数据库服务器主机的内网IP地址

[root@node1 ~]# iptables -t nat -A PREROUTING -i eth0 -s 63.34.45.0/24 -d 218.29.30.31 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.5:22

经测试成功以后,将上述DNAT策略添加到防火墙脚本文件中,并设置为开机后自动运行。

下面是防火墙脚本方面的东西;

前面已经学会了iptables命令的语法和简单的规则设置。在添加防火墙规则时,必须充分理解数据包匹配的流程,尤其是规则链内的匹配流程。这样才能更好的优化规则顺序,提高包过滤机制的效率和准确性。

3、导出、导入防火墙规则

iptables软件包提供了两个命令:iptables-save、iptables-restore,分别用于保存(save)和恢复(restore)防火墙规则,使用这两个命令可以很方便的导出和导入规则。

>>>>>、iptables-save

直接执行iptables-save命令时,将会把当前设置的防火墙规则信息输出到终端。

linux之iptables详解及配置(二)+案例_第4张图片

通常情况下,可以使用重定向将信息保存为指定的配置文件,结合系统默认提供的iptables服务脚本,可以自动加载位于/etc/sysconfig/iptables文件中的规则设置。

eg:将当前调试好的iptables规则保存到配置文件,并通过iptables服务脚本自动加载。

[root@node1 ~]# iptables-save >/etc/sysconfig/iptables
[root@node1 ~]# service iptables restart
iptables:清除防火墙规则:                                 [确定]
iptables:将链设置为政策 ACCEPT:raw mangle nat filter     [确定]
iptables:正在卸载模块:                                   [确定]
iptables:应用防火墙规则:                                 [确定]
[root@node1 ~]# chkconfig --level 35 iptables on

>>>、iptables-restore

使用iptables-restore命令,可以从已保存的配置文件中导入iptables规则(该文件必须是使用iptables-save命令导出的配置数据)。

eg : 从已保存的规则配置文件中导入iptables规则。

[root@node1 ~]# iptables-restore  
  

就到这里吧,累死~~