iptables 详解(11)iptables的扩展动作2与最后总结

除了ACCEPT 、DROP  、REJECT 、LOG

认识几个新动作

SNAT 、DNAT 、MASQUERADE、REDIRECT

使用场景可能会是以下的场景:

<场景1>前半部分用了SNAT 称为SNAT

网络内部有10台主机,有各自的地址,网络内部的主机与其他网络中的主机通讯时,会暴露自己的ip地址,如果我们要隐藏这些地址可以这样做:

当网络内部的主机向网络外部主机发送报文,

报文===>防火墙或者路由器,将报文的源 IP修改为防火墙或者路由器的 IP地址,源端口也映射为某个端口,路由器维护一张NAT表(内部主机+端口)

 

其他网络中的主机收到这些报文,显示的源地址就变成是防火墙或者路由器的地址,给出回应时,路由器收到后再根据当前的NAT表发给指定主机, 准确地说是用到了NAPT功能。

Network Address Port Translation。

从路由器的角度 这样的 ip转换过程一共发生了2次

SNAT  内部网络报文  出去的时候 报文源 ip 被转换成目标路由器ip,Source Network Address Translation

DNAT  外部网络报文响应时 响应报文的目标路由器ip会再次被修改为之前发出来的源ip,Destinationnetwork address translation 

 

除了 隐藏网络内部主机ip地址,还能让 局域网内的主机共享公网ip,使私网ip也能访问互联网。

公司共用一个公网ip出口,10台电脑都配上各自的私网 ip,并进行端口映射。

 

<场景2>前半部分用了DNAT的被称为DNAT

公司有自己的局域网 网络中有2台主机作为服务器 一台提供web服务器 一台提供数据库服务器 这2台服务器在局域网在使用私有ip地址,只能被局域网内的主机访问,互联网无法访问到这2台服务器,做端口映射访问这2台服务器

路由器收到报文后 将报文的 目标地址(公网+端口)改为 对应私网地址(私网+端口)

私网回应请求报文,再讲回应报文的源地址(私网+端口)映射为公网地址(公网+端口),路由器再转发给互联网的主机

 

 

 

 

 

 一、配置SNAT 实现内外网互通

步骤1:打开主机B的网络转发功能

root@ubuntu:~# echo 1 >/proc/sys/net/ipv4/ip_forward
root@ubuntu:~# cat /proc/sys/net/ipv4/ip_forward
1

步骤2:配置SNAT规则

SNAT 一般在 NAT表 POSTROUTING链中,作为 报文被发出去的最后一个关卡,在这个时候对源地址进行修改 -s 10.1.0.0/16表示报文来自这个网段,-j  SNAT 表示当前是SNAT 这个动作 --to-source 192.168.1.146 表示把报文源ip修改成 to-source的这个公网ip地址 

iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 192.168.1.146

外网可ping通内网

在外网主机A 上抓包所看到的是路由器的公网ip ping过来的结果是B的发包

 

 

 
内网 可 ping通外网

这时候内网C主机ping外网A可以ping通且抓icmp协议后所有的互通的ip都是正确的

 

 

 

 

 

 

 

iptables 只需要配置SNAT源地址转换, 就会自动维护NAT表,并将响应报文的目标地址转换回来。

二、DNAT 

1.访问D主机提供的远程服务(windows主机)

DNAT属于外网访问到内网

iptables -t nat -I PREROUTING -d 192.168.1.146 -p tcp --dport 3389 -j DNAT --to-destination 10.1.0.6:3389

DNAT 只配置在PREROUTING链和OUTPUT链中,-d 是公司的公网地址  windows 远程桌面使用的默认端口号是3389   

当外网访问公司外网ip的3389时,其报文的目标端口和目标地址会被匹配到10.1.0.6:3389上

但是只配置DNAT规则后 并不能正常DNAT 将相应的SNAT 规则同时配置后 可正常DNAT 所以要加上SNAT规则

iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 192.168.1.146 

 

 

理论上配置DNAT规则即可,如果还是不行,再配置SNAT。

完成之后 在外网电脑上找一台windows主机 打开远程程序mstsc.exe , 输入公司公网ip 点击链接

 

 

 

 

 

 2.访问C主机(linux主机)的web服务 端口是80

iptables -t nat -I PREROUTING -d 192.168.1.146 -p tcp --dport 801 -j DNAT --to-destination 10.1.0.1:80

 

 

 

 

 

 

从外网可以访问到192.168.1.146:801端口说明当前的DNAT成功

 

 三、MASQUERADE

拨号上网 公网ip会不断变化 为了每次动态变化后不用再配置SNAT规则 当前使用MASQUERADE动态将源地址转换为可用的ip地址 不用指定ip,只要指定网卡 然后动作选择为MASQUERADE

 iptables -t nat -I POSTROUTING -s 10.1.0.0/16 -o eno50332184 -j MASQUERADE

  

四、REDIRECT

用于端口映射使用,将本机的80端口映射到8080端口上

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

  

  

 五、小结

如果要NAT功能能够正常使用需要开启linux主机的核心转发功能

root@ubuntu:~# echo 1 >/proc/sys/net/ipv4/ip_forward
root@ubuntu:~# cat /proc/sys/net/ipv4/ip_forward
1

 

SNAT相关操作

配置SNAT 可以隐藏往内主机的 ip 地址,也可以共享公网ip,如果只是共享ip的话,只配置如下的SNAT规则即可 

 iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source + 公网ip

  

如果公网ip是动态获取的 不是固定的,则可以使用MASQUERADE进行动态的SNAT操作,如下命令表示将10.1网段的报文的源IP修改为eth0网卡中可用的地址

iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -o eth0 -j MASQUERADE

 

DNAT相关操作

配置DNAT 可以通过公网 IP 访问局域网内的服务,理论上来说,只要配置DNAT规则,不需要对应的SNAT规则即可以达到DNAT的效果

但是在测试DNAT的时候,SNAT也要配置才能正常DNAT,可以先尝试添加DNAT规则 如果无法正常DNAT 则尝试SNAT,SNAT规则配置一条即可,

DNAT规则则需要根据实际情况配置不同的DNAT规则。

iptables -t nat -I PREROUTING -d 公网ip -p tcp --dport 公网端口 -j DNAT  --to-destination 私网ip:端口号
iptables -t nat -I PREROUTING -d 公网ip -p tcp --dport 8080 -j DNAT --to-destination 10.1.0.1:80
iptables -t nat -A POSTROUTING -s 10.1.0.0/16 -j SNAT --to-source 公网ip

 

在本机进行目标端口映射时 可使用REDIRECT动作

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080 

  配置完上述规则后,其他机器访问本机的80的端口时,才会被映射到8080端口

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

================================================最后总结===============================================

1、规则的顺序非常重要

如果报文已经被前面的规则匹配到 则iptables会对报文执行对应动作(如ACCEPT 或者 REJECT)

 

2、规则中多个匹配条件,条件之间默认存在“与”关系。

一条规则如果包含多个匹配条件,那么报文必须同时满足这个规则中的所有匹配条件,报文才能被这条规则匹配到。

 

3、不考虑1的情况下,将匹配次数更多,频率更高的规则放置在前面

比如你写了两条规则,一条是针对sshd服务,一条是针对web服务,假设一天之内有20000个请求访问web服务,200个请求访问sshd服务

那么针对web服务的规则应该放在前面,针对sshd的规则放在后面,因为web的请求频率更高

否则就会造成每次访问都要经过sshd的规则,耗费更多资源。

 

4、iptables所在主机作为网络防火墙时,在配置规则时,要着重考虑方向性,双向的都要考虑,从外到内,从内到外

 

5、在配置iptables白名单时,往往会将链的默认策略设置为ACCEPT,通过在链的最后设置REJECT实现白名单机制,而不是将链的默认策略设置为DROP,如果将链的默认策略设置为DROP 则当链中规则被清空时,管理员的请求也会被DROP掉。

posted @ 2020-02-29 18:34  陈晓猛  阅读(525)  评论(0编辑  收藏  举报