iptables实现SNAT和DNAT,并对规则持久保存
Posted JohnnyFang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables实现SNAT和DNAT,并对规则持久保存相关的知识,希望对你有一定的参考价值。
关于SNAT和DNAT,在上一篇已经提到,此篇就不再对这两个名词进行解释,主要看一下如何利用Linux中iptables来实现SNAT和DNAT,以及如何保持规则的持久有效。
- 实验准备
准备四台虚拟主机,一台作为防火墙来实现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 命令生效(如下图)。
为了实现地址转换,还需再添加一张网卡,并且添加的网卡设定为仅主机模式,此时,防火墙服务器的网卡就有两个,一个10.0.0.153负责连接内网,一个192.168.191.153负责连接外网,同时这两种都删除网关(如下图)。
1.2 内网主机端
两台主机分别取名user1和user2,需将网卡中网关指向防火墙内网ip,保存后,如果是CentOS7可直接执行 service network restart 命令生效,如果是8系列,需要重新加载网卡,然后再令网卡生效(如下图)。
1.3 公网主机端
公网主机取名server,将网卡改为仅主机模式,同时ip为192.168.191.180,并删除网关(如下图)。
1.4 准备阶段测试
现阶段,内网中的user1、user2和server是无法相关访问的,但是user1和user2可ping通防火墙的内网ip,server也可以ping通防火墙的公网ip(如下图)。
- 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规则(如下图)。
此时,user1和user2去ping公网中server,已经可以ping通,公网中的server去抓包,显示的来源是192.168.191.153,即防火墙的公网ip,已经对地址进行了转换(如下图)。
由于没有路由,此时公网中的server是无法ping通内网中的主机(如下图)。
- 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 -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后的端口省略(如下图)。
server再去执行 curl 192.168.191.153 命令时,访问的就是内网user1的网页内容(如下图)。
此时,user1去查看日志,看到的访问来源是源地址,即server的ip(如下图)。
- 保持规则持久有效
由于使用iptables指定的规则在重启后会自动消失,要想实现规则持久有效,方法有三种:第一种是将规则保存到指定目录下的文件中,下次开机时执行命令读取规则重新获取;第二种是修改配置文件,实现开机自启动加载;第三种是下载iptables-services服务,利用该服务来实现。第三种方法需要下服务,对于企业服务器来说,多种服务也就多种压力,笔者这里就不演示了,主要看下前两种方法,相对也比较简单。
4.1 读取文件
刚好以上实验留下了两条规则,笔者这边就直接拿来做演示。执行 iptables-save > /data/iptables.rule 命令,将规则保存到/data/iptables.rule文件中后清除掉所有NAT规则,此时NAT表中是没有规则记录的(如下图)。
执行 iptables-restore < /data/iptables.rule 命令,即从/data/iptables.rule文件中恢复iptables规则,发现规则又回来了(如下图)。
4.2 修改配置文件
第二种方法就是修改/etc/rc.d/rc.local配置文件,打开配置文件,在里面添加iptables-restore < /data/iptables.rule一行,保存后执行 chmod +x /etc/rc.d/rc.local 命令给予执行权限,也就是将第一种方法的手动执行改为了系统开机自动执行(如下图)。
重启主机后,原来的规则也自动加载进来了(如下图)。
以上是关于iptables实现SNAT和DNAT,并对规则持久保存的主要内容,如果未能解决你的问题,请参考以下文章
Linux防火墙------iptables(SNAT与DNAT)