一、SNAT策略及应用

SNATSource Network Address Translation,源地址转换)是linux防火墙的一种地址转换操作,也是iptables命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的源IP地址(类似与CiscoPAT协议)。

 

下面用一个具体的案例,来详细介绍SNAT的应用:

案例环境

某公司使用双网卡的Linux主机作为网关服务器,其中网卡eth0连接局域网,网卡eth1通过光纤接入Internet。由于只注册了一个公网IP地址,要求合理配置网关策略,使局域网内的PC可以通过共享的方式访问Internet

 

网络拓扑图:

wKiom1hCzRPA72HIAAC3uneeyEk947.png




1.打开网关的路由转发

对于Linux服务器,IP转发是实现路由功能的关键所在,对应为/proc文件系统中的ip_forward设置,当值为1时表示开启,为0时表示关闭。

 

永久打开路由转发功能:

wKioL1hCzROwjyh0AAACDu4y9ig164.png

wKiom1hCzRTBt0-mAAABgn_oxB0731.png

修改配置文件sysctl.conf,将net.ipv4.ip_forward配置项的值改为1


wKiom1hCzRSAJGbzAAABmAOisvE580.png

读取修改后的配置,激活路由转发功能。


临时开启路由转发:

wKioL1hCzRTAlflFAAAC5JAxP1k575.png


2.设置SNAT策略

需要针对局域网PC访问Internet的数据包采取SNAT策略,将源地址更改为网关的公网IP地址,如要保持SNAT策略长期有效,应将先关命令写入到rc.local配置文件,以便开机后自动设置。

wKioL1hCzRXiAZ_aAAAE7mt6NVQ902.png

编写SNAT转换规则

POSTROUTING                        //路由选择后在处理

-s 192.168.1.0/24                  //局域网段的地址

-o eth1                            //外网接口的名称

--to-source 173.16.16.1            //外网接口的IP地址

当然了,在网关服务器上还要根据需求添加一些防火墙策略,例如局域网PC需要访问外网的WEB服务器,就需要:

wKiom1hCzRWSO8TJAAAEetq6R-k626.png


3.验证SNAT结果

在局域网主机 192.168.1.2 中能够访问外网的Web服务器 173.16.16.16

查看Web主机 173.16.16.16的访问日志,记录的来访者应是网关主机的外网IP地址 173.16.16.1

 

补充:

如果使用ADSL宽带接入时,网关的外网IP可能不是固定的,针对这种需求,iptables命令提供了一个名为MASQUERADE(伪装)的数据包控制类型,相当于SNAT的一个特例,同样能够修改(伪装)数据包源IP地址,这时它能够自动获取外网接口的IP地址,而无须使用--to-source指定固定的ip地址。

对于ADSL宽带连接,连接名称通常为ppp0ppp1等。

针对以上案例,可以将SNAT规则改为:

wKiom1hCzRWSD_bSAAAEl9_34qI068.png


二、DNAT策略及应用

DNATDestination Network Address Translation,目标地址转换)是linux防火墙的另一种地址转换操作,同样也是iptables命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的目标IP地址和目标端口类似与Cisco的静态NAT协议

 

继续上述案例,公司需要在Internet中发布位于内网的网站服务器,作为公司的电子商务平台。

在网关服务器中设置DNAT策略:

wKioL1hCzRbzElZpAAAFketk78s453.png

PREROUTING                      //路由选择之前处理

-i eth1                         //外网接口名称

-d 173.16.16.1                  //外网接口的IP地址

--dport 80                      //发布的服务端口

--to-destination 192.168.1.3    //WEB主机的内网IP地址

 

补充:

如果通过同一个公网IP地址发布位于多台主机中的同一种服务,为了避免发生冲突,就需要在端口上进行区分(类似于NAT端口映射)。

 

继续以上案例,为了方便服务器的远程管理,网关、网站服务器都配置了OpenSSH服务。

 

1.配置OpenSSH服务

在网关、网站服务器中均开启OpenSSH服务,分别使用234522端口。其中网关的sshd服务因直接面向Internet,因此不使用默认端口。

 

2.设置DNAT策略

wKiom1hCzfuRW6PQAAAFxX7U3Gs145.png

这里将网关服务器的2346端口映射为了网站服务器的22端口。


3.Internet中进行SSH登录测试

wKiom1hCzf7xxX2FAAAClq1ZFaA516.png

登录网关服务器,wangguan是网关服务器中的用户账号。


wKioL1hCzf6wlBJoAAACpDXxvqE143.png

登录网站服务器,wangzhan是网站服务器中的用户账号。


三、规则的导出、导入

iptables-save命令

wKiom1hCzf6gBd44AAABycXxTzY237.png

wKioL1hCzf-irRQxAAAMUWzXxNo270.png

直接使用iptables-save命令,将显示当前启用的所有规则(仅仅把规则输出到屏幕上)。

#开头表示注释

*表名表示所在的表

:链名  默认策略表示相应的链及默认策略

具体规则部分省略了命令名iptables


wKioL1hCzf_xin7YAAACuBRZlxU580.png

将防火墙规则备份为/opt/iprules_all.txt文件


2.iptables-restore命令

wKiom1hCzf_gXStFAAAC7RSh5rc365.png

从备份文件恢复规则


3使用iptables服务备份恢复防火墙规则

iptables-save的备份存储到/etc/sysconfig/iptables,然后就可以通过iptables服务快速恢复,每次开机后就自动重建。如果想恢复规则的时候,就直接重新启动iptables服务即可。

wKiom1hCzf-A2osgAAAEYlZxvCE165.png

将当前配置的规则设置为开机后防火墙的默认规则


四、使用防火墙脚本

常见的linux防火墙脚本中,通常包括变量定义、模块加载、/proc调整、规则设置等多个部分(过于简化的脚本可能仅包括规则设置部分)。

 

1.定义基本变量

将防火墙的网卡、IP地址、局域网段、iptables命令的路径定义为变量,便于对脚本程序的维护和移植使用。

[root@localhost ~]# vim /opt/myipfw.sh        //创建脚本文件

#!/bin/bash

INET_IF= "eth1"                    //外网接口

INET_IP="173.16.16.1"              //外网接口地址

LAN_IF="eth0"                      //内网接口

LAN_IP= "192.168.1.245"            //内网接口地址

LAN_NET="192.168.1.0/24"           //内网网段

LAN_WWW_IP="192.168.1.3"           //网站服务器的内部地址

IPT="/sbin/iptables"               //iptables命令的路径

MOD="/sbin/modprobe"               //modprobe命令的路径

CTL="/sbin/sysctl“                //sysctl命令的路径

……

 


2.加载内核模块

Iptables命令的大部分模块都可以根据需要动态载入内核,只有个别模块需要手动进行加载。但是如果需要启动的规则数量较多,为了提高规则设置的效率,保持防火墙的稳定性,建议将用到的各种模块提前加载到内核中。

……

$MOD ip_tables                     //iptables基础模块

$MOD ip_conntrack                  //连接跟踪模块

$MOD ipt_REJECT                    //拒绝操作模块

$MOD ipt_LOG                       //日志记录模块

$MOD ipt_iprange                   //支持IP范围匹配

$MOD xt_tcpudp                     //支持TCPUDP协议

$MOD xt_state                      //支持状态匹配

$MOD xt_multiport                  //支持多端口匹配

$MOD xt_mac                        //支持MAC地址匹配

$MOD ip_nat_ftp                    //支持FTP地址转换

$MOD ip_conntrack_ftp              //支持FTP连接跟踪

……

 

3.调整/proc参数

/proclinuxUNIX系统中的一种伪文件系统机制、提供了访问内核运行结构、改变内核设置的实时数据。与EXT3FAT32等本地文件系统不同,/proc中的数据存放在内存而不是硬盘上。

在文件夹/proc/sys下存放着与系统相关的一些可控参数,可以直接用来改变内核的行为,通常linux内核调优的实时入口。其中包括是否打开IP转发、是否响应ICMP广播、设置好TCP响应超时等,使用echosysctl命令都可以修改相关参数,当然也可以写到/etc/sysctl.conf文件(执行sysctl -p后生效)。

常用的几个/proc参数调整:

……

$CTL -w net.ipv4.ip_forward=1                      //打开路由转发功能

$CTL -w net.ipv4.ip_default_ttl=128                //修改ICMP响应超时

$CTL -w net.ipv4.icmp_echo_ignore_all=1            //拒绝响应ICMP请求

$CTL -w net.ipv4.icmp_echo_ignore_broadcasts       //拒绝响应ICMP广播

$CTL -w net.ipv4.tcp_syncookies=1                  //启用SYN Cookie机制

$CTL -w net.ipv4.tcp_syn_retries=3                 //最大SYN请求重试次数

$CTL -w net.ipv4.tcp_synack_retries=3              //最大ACK确认重试次数

$CTL -w net.ipv4.tcp_fin_timeout=60                //TCP连接等待超时

$CTL -w net.ipv4.tcp_max_syn_backlog=3200          //SYN请求的队列长度

……

 

4.设置具体的iptables规则

在脚本文件中,建议按照不同的表、链来分块组织各种防火墙规则,具体内容应根据用户的实际需求决定。

(1)清理已有的规则

为了避免已有的防火墙规则造成干扰,通常会预先安排一个“清理”操作,删除所有表中用户自定义的链,清空所有链内的规则。

……

$IPT -t filter -X                    //删除个表中自定义的链

$IPT -t nat -X

$IPT -t mangle -X

$IPT -t raw -X

 

$IPT -t filter -F                    //清空各表中已有的规则

$IPT -t nat -F

$IPT -t mangle -F

$IPT -t raw -F

……


2)设置规则链的默认策略

$IPT -P INPUT DROP

$IPT -P FORWARD DROP

$IPT -P OUTPUT ACCEPT


3)设置nat表中的各种规则(主要用在linux网关服务器中)

$IPT -t nat -A POSTROUTING -s $LAN_NET -o $INET_IF -j SNAT --to-source $INET_IP

$IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-destination $LAN_WWW_IP

……


(4)设置filter表的各种规则

Iptablesfilter表主要用来过滤数据包,无论是linux网关还是一般的linux服务器都可能用到。主机型的防火墙主要使用INPUTOUTPUT链,网络型的防火墙主要使用FORWARD链。

linux网关为例:

……

$IPT -A INPUT -p tcp --dport 80 -j ACCEPT

$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

……