
CentOS 7 iptables 防火墙详解4表5链表iptables 内置了 4 个表提供特定的功能表名功能filter包过滤默认表nat网络地址转换mangle包重构修改raw数据跟踪处理链链是数据包传播的路径每一条链其实就是众多规则中的一个检查清单。当一个数据包到达一个链时iptables 从第一条规则开始逐一检查满足条件则按该规则处理否则继续下一条规则。如果不符合链中任一条规则则按预设的默认策略处理。filter 表默认表命令选项命令说明-A在最后添加规则-D删除某条规则按序号-I在最前方添加规则可指定序号-R修改已有规则-F清空所有规则-P设置默认策略-L查看表中规则链INPUT— 对进入本机的数据包过滤OUTPUT— 对离开本机的数据包过滤FORWARD— 路由转发时过滤行为动作-j动作说明ACCEPT允许数据包通过DROP丢弃数据包无响应REJECT拒绝数据包有响应LOG记录日志后继续下一条规则条件匹配-d 目的地址 -s 源地址 --dport 目的端口 -p 协议tcp / udp / icmp示例# 允许来自 192.168.1.0/24 网段且目标端口为 22 的 TCP 连接iptables-AINPUT-s192.168.1.0/24-ptcp--dport22-jACCEPT# 丢弃所有来自 10.0.0.1 的数据包iptables-AINPUT-s10.0.0.1-jDROP# 允许本机对外访问但禁止外部访问本机的 3306 端口iptables-AINPUT-ptcp--dport3306-jDROP# 查看当前规则带序号iptables-L-n-v--line-numbers# 删除 INPUT 链的第 3 条规则iptables-DINPUT3# 将默认策略改为 DROP慎用建议先加允许规则iptables-PINPUT DROP iptables-PFORWARD DROP# 保存规则重启后生效serviceiptables save# CentOS 6iptables-save/etc/sysconfig/iptables# CentOS 7nat 表地址转换nat 表的链INPUT— 对进入的数据包处理OUTPUT— 对出去的数据包处理FORWARD— 路由转发在 PREROUTING 后、POSTROUTING 前PREROUTING— 路由前修改目的地址 DNATPOSTROUTING— 路由后修改源地址 SNAT数据包流向不需要改地址本地进程通信PREROUTING → INPUT → OUTPUT → POSTROUTING需要改地址路由转发/代理PREROUTING → FORWARD → POSTROUTING行为动作-j动作说明ACCEPT允许DROP丢弃DNAT修改目的地址/端口SNAT修改源地址/端口MASQUERADE自动获取出口 IP 作为源地址DNAT / SNAT 示例——反向代理# DNAT修改目的地址将访问本机 80 端口的请求转发到 192.168.1.1 的 8080 端口iptables-tnat-APREROUTING-ptcp--dport80-jDNAT--to192.168.1.1:8080# SNAT修改源地址将源 IP 改为本机 IP解决目标服务器无客户端路由的问题iptables-tnat-APOSTROUTING-ptcp-d192.168.1.1--dport8080-jSNAT--to192.168.1.2原理说明客户端访问本机防火墙的 80 端口防火墙将请求转发到内网服务器192.168.1.1:8080同时将源 IP 改为防火墙自身的 IP192.168.1.2内网服务器回包时会把数据发给防火墙由防火墙再转发给客户端MASQUERADE适合动态 IP 场景# 将内网 192.168.1.0/24 的数据包源地址伪装为出口 IP实现共享上网iptables-tnat-APOSTROUTING-s192.168.1.0/24-jMASQUERADEraw 表raw表用于数据跟踪处理可以对数据包在连接跟踪前进行控制通常配合-j NOTRACK跳过连接跟踪以提升性能。# 跳过 HTTP 连接的连接跟踪iptables-traw-APREROUTING-ptcp--dport80-jNOTRACK iptables-traw-AOUTPUT-ptcp--dport80-jNOTRACK常用维护命令# 查看所有规则带序号便于删除iptables-L-n--line-numbers# 删除 INPUT 链的第 3 条规则iptables-DINPUT3# 将默认策略改为 DROP慎用建议先加允许规则iptables-PINPUT DROP iptables-PFORWARD DROP# 保存规则重启后生效serviceiptables save# CentOS 6iptables-save/etc/sysconfig/iptables# CentOS 7总结表主要链主要用途filterINPUT, OUTPUT, FORWARD包过滤默认natPREROUTING, OUTPUT, POSTROUTING, FORWARD地址转换manglePREROUTING, OUTPUT, INPUT, FORWARD, POSTROUTING包重构修改rawPREROUTING, OUTPUT数据跟踪实战案例案例一搭建简易防火墙# 1. 清空所有现有规则iptables-Fiptables-Xiptables-Z# 2. 设置默认策略为 DROP禁止所有入站流量iptables-PINPUT DROP iptables-PFORWARD DROP iptables-POUTPUT ACCEPT# 3. 允许已建立的连接和 RELATED 连接iptables-AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT# 4. 允许本地回环接口iptables-AINPUT-ilo-jACCEPT# 5. 允许 SSH端口 22iptables-AINPUT-ptcp--dport22-jACCEPT# 6. 允许 HTTP端口 80和 HTTPS端口 443iptables-AINPUT-ptcp--dport80-jACCEPT iptables-AINPUT-ptcp--dport443-jACCEPT# 7. 允许 Pingiptables-AINPUT-picmp --icmp-type echo-request-jACCEPT# 8. 保存规则serviceiptables save案例二端口映射内网服务器发布# 将外网 80 端口的请求映射到内网 192.168.1.100 的 8080 端口iptables-tnat-APREROUTING-ptcp--dport80-jDNAT--to192.168.1.100:8080 iptables-tnat-APOSTROUTING-ptcp-d192.168.1.100--dport8080-jMASQUERADE案例三防止 DDoS 攻击限制连接数# 限制每分钟最多 100 个新连接iptables-AINPUT-ptcp--dport80-mrecent--set--nameHTTP iptables-AINPUT-ptcp--dport80-mrecent--update--seconds60--hitcount100--nameHTTP-jDROP# 限制单个 IP 最大并发连接数为 50iptables-AINPUT-ptcp--dport80-mconnlimit --connlimit-above50-jDROP案例四日志记录可疑行为# 记录所有被 DROP 的数据包iptables-AINPUT-jLOG --log-prefixIPTABLES-DROP: --log-level4# 查看日志tail-f/var/log/messages|grepIPTABLES-DROP