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

缥帙各舒散,前后互相逾。这篇文章主要讲述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 ?命令生效(如下图)。

    为了实现地址转换,还需再添加一张网卡,并且添加的网卡设定为仅主机模式,此时,防火墙服务器的网卡就有两个,一个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??(如下图)??。





  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规则(如下图)。

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



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



  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 -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??(如下图)??。



  1. ?保持规则持久有效?
    由于使用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,并对规则持久保存】
    重启主机后,原来的规则也自动加载进来了??(如下图)??。


    推荐阅读