image.png

1.iptables 过滤原理

包过滤: IPTABLES采用【数据包】过滤机制,它对请求的数据包进行分析,并更具我们预先设置的规则进行匹配来决定是否可以进入主机。

iptables的4表5链: iptables内部结构细化分为:以功能区分称为; 以iptables动作区分称为。 iptables(用户空间) —> netfilter(内和空间)—> tables(4表)—> chains(5链) —> 规则policy。

tables四表作用:

  1. filter(主机防火墙):对主机的数据包进出进行控制,主要是iptables默认的表;表中包含的对应的链:INPUT(进入)、OUTPUT(出去)、FORWARD(流经、转发)。
  2. nat:用于端口或者IP映射或共享上网;表中包含的链:POSTROUTING(流出主机后路由)、PREROUTING(进入主机前路由)、OUTPUT(流出主机)。
  3. mangle:用于配置路由标记 ttl \ tos \ mark(拆解报文,做出修改,并重新封装);表中包含的链:INPUT、OUTPUT、FORWARD、POSTROUTING、PREROUTING。
  4. raw:关闭nat表上启用的连接追踪机制;表中包含的链:OUTPUT、PREROUTING。

chains链的作用:

  1. INPUT:进入主机的数据包;主机防火墙最关键的链(filter表的INPUT链)。
  2. OUTPUT:流出主机的数据包。
  3. FORWARD:流经主机的数据包。
  4. PREROUTING:进入服务器最先经过的链,NAT端口或IP映射。(nat表的PREROUTING链)
  5. POSTROUTING:在流出服务器最后经过的链,NAT共享上网。局域网共享上网(nat表的POSTROUTING链)
  1. # 1.查看iptables规则(需要序列)
  2. iptables -nL --line-numbers # 查看全部链
  3. iptables -nL INPUT --line-numbers # 查看INPUT链上的规则
  4. # 2.规则的删除
  5. iptables -t filter -D INPUT 1 # 删除INPUT链中,的第一条规则(编号通过 --line-numbers查询)
  6. iptables -F # 清空所有的规则,只留下默认规则
  7. iptables -X # 清除用户自定义的链
  1. # 配置规则
  2. iptables -I INPUT 2 # 指定位置插入规则
  3. iptables -t filter -A INPUT -i eth0 -s 10.0.0.0/24 -j DORP # 禁止网段访问
  4. iptables -A INPUT -s ! 10.0.0.0/24 -j DROP # 禁止的取反,根据规则;其实可以指定ACCEPT
  5. iptables -A INPUT -m iprange --src-range 127.12.12.50-127.12.12.150 -j ACCEPT #匹配源IP
  6. iptables -A INPUT -m iprange --dest-range 8.8.8.2-8.8.8.22 -j DROP #匹配目标IP
  7. # 匹配端口范围
  8. --sport 22:88
  9. -m multiport --dport 21,22,23,23306,1205:1400
  10. # 匹配网络状态 -m state --state
  11. #允许关联的状态包通过,一般用于ftp服务
  12. iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  13. iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  1. # 1. 许出不许进,最安全的配置
  2. iptables -P INPUT DROP # 也是默认配置
  3. iptables -P FORWARD DROP
  4. iptables -P OUTPUT ACCEPT
  5. # 开启新人的IP段
  6. iptables -A INPUT -p all -s 124.43.62.96/27 -j ACCEPT
  7. iptablse -A INPUT -p al -s 192.168.30.0/24 -j ACCEPT
  8. # 允许访问的端口
  9. iptables -A INPUT -p tcp --dport 23306 -j ACCEPT
  10. iptables -A INPUT -p tcp -m multiport --dport 21,23,10010:10050 -j ACCEPT
  11. iptables -A INPUT -p tcp -m multiport --dport 21,23,10010:10050 -j ACCEPT
  12. #让服务器可以进行域名解析
  13. iptables -A INPUT -p udp --dport 53 -j ACCEPT
  14. iptables -A INPUT -p udp --sport 53 -j ACCEPT
  15. # 允许所有人ping
  16. iptables -A INPUT -p icmp -m icmp 00icmp-type any -j ACCEPT
  17. #让服务器可以ping
  18. iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
  19. iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
  20. #让服务器自身可以上网
  21. iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  22. iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  1. #场景:浏览器中访问 13.32.4.61:8088,能够映射转换到13.32.161.250:8088
  2. #在13.32.4.61上执行
  3. iptables -t nat -A PREROUTING -d 13.32.4.61 -p tcp --dport 8088 -j DNAT --to 13.32.161.250:8088
  4. iptables -t nat -A POSTROUTING -d 13.32.161.250 -p tcp --dport 8088 -j SNAT --to 13.32.4.61
  5. #还可以使用REDIRECT单独进行端口转换
  6. #例:将 80 端口的封包转递到 8080端口
  7. iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
  8. # 使用 8080 这个 port 来启动 WWW ,但是别人都用80来联机
  9. #实现外网IP 124.42.34.112 一对一映射到内部 10.0.0.8
  10. #网关IP eth0:124.42.60.109 eth1:10.0.0.254
  11. #首先在路由网关上绑定VIP 124.42.34.112,可以是别名的方式。
  12. iptables -t nat -A POSTROUTING -s 10.0.0.0/20 -d 124.42.34.112 -j SNAT --to-source 10.0.0.254
  13. iptables -t nat -A PREROUTING -d 124.42.34.112 -j DNAT --to-destination 10.0.0.8
  14. iptables -t nat -A POSTROUTING -s 10.0.0.8 -o eth0 -j SNAT --to-source 124.42.34.112

参考文档:

  1. https://baijiahao.baidu.com/s?id=1713877459359673690&wfr=spider&for=pc