iptables实战
DNAT场景
有两台主机:
hostA: 10.50.10.25 hostB: 10.50.10.26
在主机A上有一个nginx服务. 使用iptables如何实现访问 10.50.10.26 8099 请求打到hostA上的nginx服务.
hostA 的nginx服务
# 主机A上查看nginx服务 ~]#telnet 10.50.10.25 80 Trying 10.50.10.25... Connected to 10.50.10.25. Escape character is '^]'.
在主机B上添加iptables规则,nat表的OUT钩子(链)中增加DNAT规则。将目的地之转换为10.50.10.25。并将请求达到nginx服务上。
HostB 开启转发
HostB 确保开启路由转发. net.ipv4.ip_forward = 1此时内核才会将流量转发。此时该主机充当路由器的功能.
[root@node-1 ~]#sysctl -a | grep ipv4.ip_forward net.ipv4.ip_forward = 1
在HostB 上添加iptables
iptables -t nat -A OUTPUT -p tcp --dport 8099 -d 10.50.10.26 -j DNAT --to 10.50.10.25:80 # iptables 解释
首相要搞清楚我们是在DNAT,也就是修改目的地址。是在nat表的OUT钩子(链)append 中新增 -A 代表append OUTPUT 从本机发送出去的包 对发送出去的包的限制: -p 协议 -d 目的地址 --dport 目的端口 -j 后面跟要做的转换是DNAT还是SNAT --to 转到哪里? 注意-d 后可以跟cidr地址。例如10.50.10.0/24
查看iptables规则
[root@node-1 ~]#iptables -t nat -nvL Chain PREROUTING (policy ACCEPT 68 packets, 4267 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 68 packets, 4267 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 96 packets, 5808 bytes) pkts bytes target prot opt in out source destination 0 0 DNAT tcp -- * * 0.0.0.0/0 10.50.10.26 tcp dpt:8099 to:10.50.10.25:80 Chain POSTROUTING (policy ACCEPT 96 packets, 5808 bytes) pkts bytes target prot opt in out source destination [root@node-1 ~]#
在Host b上telnet 10.50.10.26 8099
~]#telnet 10.50.10.26 8099 Trying 10.50.10.26... Connected to 10.50.10.26. Escape character is '^]'.
查看iptables OUTPUT链上的流量变化
[root@node-1 ~]#iptables -t nat -nvL Chain PREROUTING (policy ACCEPT 163 packets, 10535 bytes) pkts bytes target prot opt in out source destination Chain INPUT (policy ACCEPT 163 packets, 10535 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 228 packets, 13760 bytes) pkts bytes target prot opt in out source destination 1 60 DNAT tcp -- * * 0.0.0.0/0 10.50.10.26 tcp dpt:8099 to:10.50.10.25:80 Chain POSTROUTING (policy ACCEPT 229 packets, 13820 bytes) pkts bytes target prot opt in out source destination
Chain OUTPUT的上较telnet 10.50.10.26 8099 多了一个包,证明iptables 对这个包进行了转发
删除iptables
iptables -t nat -D OUTPUT 1
阻止发送特定ip的流量
如果你不希望访问特定站点(一般是恶意站点) ,可以自主阻止发送流量到该IP,例如你认为114是一个钓鱼网站,在本地禁止所有流量发送到114
终端1 ping 114.114.114.114
可以看到执行iptables之后ping数据包再也发不过去啦
终端2 设定iptables
iptables -t filter -A OUTPUT -d 10.50.10.25 -j DROP
删除iptables
OUTPUT和PREROUTING的区别
需求是这样的
主机A 10.50.10.25 上部署着nginx 80服务
主机B 10.50.10.26 通过8099 端口代理这个服务 (注意主机B 本身无法访问这个服务)
主机C 10.56.14.** 需要访问10.50.10.26:8099
解决
1、在主机C中网络中想通过8099 访问,添加如下规则
主机B上添加如下两条规则
iptables -t nat -A PREROUTING -p tcp --dport 8099 -j DNAT --to 10.50.10.25:80 iptables -t nat -A POSTROUTING -p tcp -d 10.50.10.25 --dport 80 -j SNAT --to 10.50.10.26
2、如果主机B 想直接访问8099 该怎么办?
主机B增加一条本地转发规则,即不通过路由器的转发规则。
iptables -t nat -A OUTPUT -p tcp -d 10.50.10.26 --dport 8099 -j DNAT --to 10.50.10.25:80
疑问
在最初没搞清楚OUTPUT 链和PREROUTING 链的区别。 OUTPUT也是可以用于DNAT 本地的流量的
规则链名包括(也被称为五个钩子函数(hook functions)): INPUT链 :处理输入数据包。 OUTPUT链 :处理输出数据包。 FORWARD链 :处理转发数据包。 PREROUTING链 :用于目标地址转换(DNAT)。 POSTOUTING链 :用于源地址转换(SNAT)。
扩展
- 对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
- 对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
- 而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
在这里插入图片描述