iptables实现SNAT和DNAT,并对规则持久保存

Posted JohnnyFang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables实现SNAT和DNAT,并对规则持久保存相关的知识,希望对你有一定的参考价值。

    关于SNAT和DNAT,在上一篇已经提到,此篇就不再对这两个名词进行解释,主要看一下如何利用Linux中iptables来实现SNAT和DNAT,以及如何保持规则的持久有效。

  1. 实验准备

    准备四台虚拟主机,一台作为防火墙来实现NAT,两台作为内网主机,一台作为公网中的主机。由于笔者这边的网络问题,就使用10.0.0.0/24模拟企业内网ip,192.168.191.0/24模拟公网ip。

1.1 防火墙服务器端

    要想实现内网和外网之间能进行访问等操作,需要开启ip_forward。打开/etc/sysctl.conf文件,在里面添加net.ipv4.ip_forward=1,保存后执行 ​sysctl -p ​命令生效(如下图)。

iptables实现SNAT和DNAT,并对规则持久保存_服务器

    为了实现地址转换,还需再添加一张网卡,并且添加的网卡设定为仅主机模式,此时,防火墙服务器的网卡就有两个,一个10.0.0.153负责连接内网,一个192.168.191.153负责连接外网​​同时这两种都删除网关​(如下图)​。

iptables实现SNAT和DNAT,并对规则持久保存_服务器_02


1.2 内网主机端

    两台主机分别取名user1和user2,需将网卡中网关指向防火墙内网ip,保存后,如果是CentOS7可直接执行 ​service network restart​ 命令生效,如果是8系列,需要重新加载网卡,然后再令网卡生效​(如下图)​。

iptables实现SNAT和DNAT,并对规则持久保存_配置文件_03

iptables实现SNAT和DNAT,并对规则持久保存_内网_04


1.3 公网主机端

    公网主机取名server,将网卡改为仅主机模式,同时ip为192.168.191.180,并删除网关​(如下图)​。

iptables实现SNAT和DNAT,并对规则持久保存_内网_05


1.4 准备阶段测试

    现阶段,内网中的user1、user2和server是无法相关访问的,但是user1和user2可ping通防火墙的内网ip,server也可以ping通防火墙的公网ip​(如下图)​。

iptables实现SNAT和DNAT,并对规则持久保存_配置文件_06

iptables实现SNAT和DNAT,并对规则持久保存_服务器_07

iptables实现SNAT和DNAT,并对规则持久保存_配置文件_08


  1. SNAT

    上一篇中,笔者有提到SNAT适合于内网访问外网,此篇,我们先利用iptables制定规则,模拟内网主机能访问外部网络,但是外部​​不能访问内网。

    在制定SNAT规则时,可以用到SNAT选项和MASQUERADE选项,其中前者要求的是固定的公网ip,在使用拨号网络等动态公网ip情况下,SNAT无法使用。而MASQUERADE选项都适合,所以我们在这里可以省略掉SNAT选项,直接使用MASQUERADE。

    防火墙服务器清除已有的规则,执行 ​iptables -t nat -A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j MASQUERADE ​命令,即只要是内网来的,目标地址是非内网的,就进行地址转换,执行 ​iptables -vnL -t nat ​命令可查看NAT规则(如下图)。

iptables实现SNAT和DNAT,并对规则持久保存_服务器_09

    此时,user1和user2去ping公网中server,已经可以ping通,公网中的server去抓包,显示的来源是192.168.191.153,即防火墙的公网ip,已经对地址进行了转换​(如下图)​。

iptables实现SNAT和DNAT,并对规则持久保存_内网_10

iptables实现SNAT和DNAT,并对规则持久保存_配置文件_11

iptables实现SNAT和DNAT,并对规则持久保存_服务器_12

    由于没有路由,此时公网中的server是无法ping通内网中的主机​(如下图)​。

iptables实现SNAT和DNAT,并对规则持久保存_内网_13


  1. DNAT

    要想让内网的某些服务也能被外网访问,需要用到DNAT,即目标地址转换。DNAT的格式为iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT],意思是,当公网中的用户访问某一个公网地址的某一个端口时,就转发到内网中的某个服务器端口上去。这里要注意的是这里的ExtIP公网地址必须是专线的固定地址,如果是拨号网络之类会变动的则无法实现。

    假设现在内网中的user1主机也是一个web服务器,在防火墙服务器未制定DNAT规则前,防火墙服务器可以访问user1的网页内容,而server是无法通过防火墙公网ip查看内容的​(如下图)​。

iptables实现SNAT和DNAT,并对规则持久保存_服务器_14

iptables实现SNAT和DNAT,并对规则持久保存_内网_15

    此时,防火墙服务器端执行 ​iptables -t nat -A PREROUTING -d 192.168.191.153 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.154:80 ​命令,即只要是指向服务器公网ip的80端口请求,就自动转发到内网user1的80端口上去,此处因为端口相同,也可将内网服务器ip后的端口省略​(如下图)​。

iptables实现SNAT和DNAT,并对规则持久保存_服务器_16

    server再去执行 ​curl 192.168.191.153​ 命令时,访问的就是内网user1的网页内容​(如下图)​。

iptables实现SNAT和DNAT,并对规则持久保存_内网_17

    此时,user1去查看日志,看到的访问来源是源地址,即server的ip​(如下图)​。

iptables实现SNAT和DNAT,并对规则持久保存_服务器_18


  1. 保持规则持久有效

    由于使用iptables指定的规则在重启后会自动消失,要想实现规则持久有效,方法有三种:第一种是将规则保存到指定目录下的文件中,下次开机时执行命令读取规则重新获取;第二种是修改配置文件,实现开机自启动加载;第三种是下载iptables-services服务,利用该服务来实现。第三种方法需要下服务,对于企业服务器来说,多种服务也就多种压力,笔者这里就不演示了,主要看下前两种方法,相对也比较简单。

4.1 读取文件

    刚好以上实验留下了两条规则,笔者这边就直接拿来做演示。执行 ​iptables-save > /data/iptables.rule ​命令,将规则保存到/data/iptables.rule文件中后清除掉所有NAT规则,此时NAT表中是没有规则记录的​(如下图)​。

iptables实现SNAT和DNAT,并对规则持久保存_内网_19

iptables实现SNAT和DNAT,并对规则持久保存_服务器_20

    执行 ​iptables-restore < /data/iptables.rule ​命令,即从/data/iptables.rule文件中恢复iptables规则,发现规则又回来了​(如下图)​。

iptables实现SNAT和DNAT,并对规则持久保存_配置文件_21


4.2 修改配置文件

    第二种方法就是修改/etc/rc.d/rc.local配置文件,打开配置文件,在里面添加iptables-restore < /data/iptables.rule一行,保存后执行 ​chmod +x /etc/rc.d/rc.local ​命令给予执行权限,也就是将第一种方法的手动执行改为了系统开机自动执行​(如下图)​。

iptables实现SNAT和DNAT,并对规则持久保存_服务器_22

    重启主机后,原来的规则也自动加载进来了​(如下图)​。

iptables实现SNAT和DNAT,并对规则持久保存_配置文件_23

以上是关于iptables实现SNAT和DNAT,并对规则持久保存的主要内容,如果未能解决你的问题,请参考以下文章

Linux防火墙------iptables(SNAT与DNAT)

iptables中实现内外网相互访问 SNAT与DNAT的原理与应用

SNAT和DNAT

网络SNAT与DNAT防火墙之iptables

NAT原理总结iptables实现SNAT和DNAT。

firewall之iptables ,SNAT,DNAT