我们都知道iptables 是防火墙,但是实际上 iptables只是配置防火墙的一种工具,真正在工作的是neifilter,netfilter存在于kernel,也就是说是kernel在处理进去出来的数据包;
直接看图,看看kernel是如何处理这些数据包的,并且能干什么:
2. 先说收DNAT
DNAT目标地址转换在PREROUTING链上做;可以将虚拟机的服务映射到宿主机的ip上,达到访问宿主的 ip就等于访问虚拟机的效果;
iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.122.2:80 -d 物理机的ip --dport 端口 DNAT 被映射的内网主机ip:端口
应用场景:
这样主要是为了 能让内网的主机能够对外提供服务:数据包的第一站 PREROUTING ,匹配到规则就执行规则进行DNAT转发,经过FORWARD ,到达POSTROUTING出站。没有匹配到就进入INPUT,进行匹配
3.再说SNAT
SNAT源地址转换在POSTROUTING链上做; 可以为局域网提供上网服务
iptables -t nat -A PORTROUTING -o br0 -j MASQUERADE
应用场景:
主机上的NAT 虚拟机需要访问物理网路,虚拟机直接通过先 经过FORWARD,然后通过POSTROUTING 将源地址转换
4. 再说说不需要经过转换的数据包,如图示绿色的部分,直接到达INPUT-->OUTPUT-->POSTROUTING出来了,比如说我要ssh远程这个主机,走的就是这个流向;
5. 再来做几个实验,来加固一下知识
A. 如果想让相对的局域网内服务器对外提供web服务,需要做DNAT规则:
iptables -t nat -A PREROUTING -d 公网IP -p tcp –m tcp --dport 公网端口 -j DNAT --to-destination 内网IP:80
看上图,我将外网IP 的80,8080 端口都映射到了内网IP的80端口:
看第一张图,
经过PREROUTING 链后还需要经过FORWARD 链,需要在FORWARD这开放提供web服务的80 端口:
iptables -A FORWARD -p tcp -m tcp --dport 80 -j ACCEPT
理论上还需要开放一下--sport 80 , 但是如果已经有下面这个规则了,就不需要了:这个规则是允许已有连接直接通过;但有大量数据包经过时,可以提高速度!
iptables- I FORWARD –p tcp -m state -- state RELADE,RSTABLISHED - j ACCEPT
8080端口
B. 当然FORWARD链处,可以对转发进行数据包的过滤,比如我想通过公网服务器的ip,远程ssh连接局域网内的服务器,就可以使用DNAT进行转换内网主机的22端口,但是为了安全,我想限制可以远程的IP地址:我只想让我一个人可以 远程,我的ip是192.168.1.154,内网网段是192.168.122.0/24
DNAT:
iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp -m tcp --dport 8081 --to-destination 192.168.122.2:22
FORWARD:
iptables -A FORWARD -s 192.168.1.154 -d 192.168.122.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
看效果:
再到其他的主机上ssh试试看,这个主机ip是192.168.1.20
看的出来FORWARD 上的那个规则生效了。
C. 当内网的主机或本地的虚拟机需要通过本机上网时,需要做SNAT规则:我的环境是虚拟机要通过宿主机上网,虚拟机以宿主机为网关,虚拟机的网段是192.168.122.0/24,宿主机的网段是192.168.1.0/24,相对来说宿主机网段就是外网,虚拟机就是内网。-j MASQUERADE 是当外网ip不固定时,这个配置 I 可以自动获取外网ip。
iptables -t nat -A POSTROUTING -o br0 -s 内网段/24 -j MASQUERADE
-s配置不是必须的,在真实局域网环境中,也许会有多个局域网段,这时就可以通过-s 配置,指定那个网段可以上网
一直都在用iptables,但是知识非常零碎,每次用起来需要很长时间梳理,于是就写下这个,写这个主要目的是为了能把我所知道的分享给大家,以及能以后能够帮自己快速的回忆起来这些知识,不耽误正常的工作。
转载于:https://blog.51cto.com/jiapeng/1719289