Linux 防火墙 iptables 的简介和配置详解 前言现代 Linux 发行版逐渐转向 nftables但 iptables 仍是底层基础。理解其原理对排查 Kubernetes 网络、云平台安全组问题至关重要。配置时务必牢记规则顺序 表链职责 持久化三大核心逻辑。本文将以 iptables 为主进行简单的介绍并详解下配置方法。回到顶部一、什么是 iptables1.1 iptables 简介iptables 是 Linux 内核 Netfilter 框架的用户空间管理工具通过四表五链结构实现数据包过滤、网络地址转换NAT和流量控制。其核心特点是规则按顺序匹配、匹配即执行、默认不持久化配置错误可能导致服务中断或安全风险。1.2 四张规则表按数据包处理优先级排序表名 优先级 核心作用 典型场景 内置链raw 最高 控制连接跟踪conntrack豁免 高性能服务DNS/NTP跳过状态跟踪 PREROUTING、OUTPUTmangle 第二 修改数据包头部字段TTL/TOS等 流量标记、QoS策略、P2P限速 五链全覆盖nat 第三 地址转换SNAT/DNAT不可过滤 端口转发、内网共享公网IP上网 PREROUTING、POSTROUTING、OUTPUTfilter 最低 访问控制过滤默认表 开放/拒绝端口、拦截非法访问 INPUT、OUTPUT、FORWARD注意nat 表处理地址转换不决定数据包放行与否filter 表决定放行/拒绝不修改地址。若在 nat 表中添加 DROP 规则规则不会生效。1.3 五条规则链数据包处理节点数据包在内核网络栈中的流动路径决定了其匹配的链链名称 触发时机 典型应用场景PREROUTINGpre routing 数据包刚进入网卡路由决策前 DNAT、打标记INPUTinput 目标为本机进程的流量 SSH、Web 服务FORWARDforward 需跨网卡转发的流量 NAT 网关OUTPUToutput 本机主动发出的流量 curl 请求POSTROUTINGpost routing 数据包离开网卡前 SNAT、地址伪装规则匹配逻辑数据包按顺序逐条匹配规则一旦命中即执行动作并终止后续检查。规则顺序决定逻辑成败若先配置 DROP 再配置 ACCEPTACCEPT 规则将永远不生效。回到顶部二、Linux 环境配置2.1 基础配置流程以 filter 表为例1清空现有规则生产环境避免直接清空应先备份iptables-save /root/iptables-bak.shiptables -F # 清空 filter 表所有链iptables -t nat -F # 清空 nat 表规则2设置默认策略调试阶段建议先宽松调试完成后再收紧策略iptables -P INPUT DROP效果除非明确放行否则一律拒绝iptables -P INPUT ACCEPT # 先允许所有入站调试用iptables -P FORWARD DROP # 转发链默认拒绝3按逻辑顺序添加规则顺序示例Web 服务器1. 允许本地回环必须最先配置iptables -A INPUT -i lo -j ACCEPT2. 放行已建立连接确保响应流量不被拦截iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT3. 按需开放服务端口如SSH、HTTPiptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT # 仅允许指定内网网段的机器通过 SSH 连接到服务器-A INPUT将规则追加Append到 INPUT 链的末尾。INPUT 链负责处理所有进入本机的数据包-p tcp指定匹配的协议为 TCP。SSH 服务基于 TCP 协议因此必须指定–dport 22指定目标端口Destination Port为 22。这是 SSH 服务的默认端口-s 192.168.1.0/24指定数据包的来源 IPSource192.168.1.0/24 代表 192.168.1.1 到 192.168.1.254 这个整个 C 类子网这意味着只有这个局域网网段内的机器才能匹配此规则-j ACCEPT指定匹配到该规则后的动作Jump为接受ACCEPT即允许数据包通过iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 开放 HTTP 服务端口允许任何来源的 IP 访问服务器的 Web 服务-A INPUT同样将规则追加到 INPUT 链的末尾-p tcp指定协议为 TCP因为 HTTP 服务基于 TCP 协议–dport 80指定目标端口为 80这是 Web 服务的标准端口-j ACCEPT允许匹配的数据包通过。由于这里没有使用 -s 参数限制来源 IP因此它默认对所有来源 IP 生效4. 最后添加兜底拒绝iptables -A INPUT -j DROP # 必须放在末尾注意-A 表示追加到链尾-I 表示插入链首如优先拦截恶意 IP-I INPUT -s 1.2.3.4 -j DROP。状态模块写法新系统用 -m conntrack --ctstate旧系统用 -m state --state2.2 NAT 配置示例1端口转发将外部访问 8080 端口转发到内网 192.168.1.50:80iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.50:80-t nat指定操作 nat 表网络地址转换表-A PREROUTING在 PREROUTING 链追加规则。该链在数据包刚进入网卡、还未进行路由判断前生效-p tcp --dport 8080匹配目标端口为 8080 的 TCP 协议流量-j DNAT --to-destination 192.168.1.50:80执行目标地址转换DNAT将数据包的目标 IP 和端口改写为内网主机 192.168.1.50 的 80 端口必须同步配置 filter 表的 FORWARD 链否则流量被拦截iptables -A FORWARD -d 192.168.1.50 -p tcp --dport 80 -j ACCEPT-A FORWARD在默认的 filter 表的 FORWARD 链追加规则。该链专门用于控制经过本机转发的数据包-d 192.168.1.50 -p tcp --dport 80 -j ACCEPT明确允许目标为 192.168.1.50:80 的 TCP 流量通过如果不加这条规则即使 NAT 转换了地址数据包也会因为默认防火墙策略被拦截iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT-m conntrack --ctstate ESTABLISHED,RELATED使用连接追踪模块匹配状态为“已建立”或“相关”的连接这确保了内网服务器返回给外部客户端的响应数据包能够顺利通过防火墙2共享上网SNAT内网 192.168.1.0/24 通过公网 IP eth0 上网echo 1 /proc/sys/net/ipv4/ip_forward # 开启内核转发临时开启 Linux 内核的 IP 转发功能此命令重启后会失效。若需永久生效需编辑 /etc/sysctl.conf 文件写入 net.ipv4.ip_forward1并执行 sysctl -p 使其生效iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE-A POSTROUTING在 POSTROUTING 链追加规则。该链在数据包即将离开网卡前生效-s 192.168.1.0/24 -o eth0匹配源网段为 192.168.1.0/24 且从 eth0 网卡通常是外网接口发出的数据-j MASQUERADE执行源地址伪装SNAT 的一种动态形式它会自动将内网数据包的源 IP 替换为 eth0 接口当前的公网 IP这样外部网络才能正确将响应数据返回给这台网关服务器再由服务器转发给内网主机这套组合拳是构建 Linux 软路由和网关的标准范式内核转发提供基础能力NAT 表DNAT/SNAT负责改写数据包的源/目标地址而 FORWARD 链则充当“交通警察”决定这些被改写地址的数据包是否被允许放行。2.3 在现有规则指定位置加一条、末尾加一条【在指定的匹配规则后边新增一条】1查看当前规则及序号使用 --line-numbers 参数查看现有规则的行号iptables -L INPUT -n -v --line-numbers2在指定位置插入新规则假设要在 INPUT 链的第 3 条规则之后添加新规则那么你需要将新规则插入到第 4 个位置在 INPUT 链的第 4 个位置插入一条允许 80 端口的规则iptables -I INPUT 4 -p tcp --dport 80 -j ACCEPT注如果不指定具体序号-I INPUT 默认会将规则插入到链的【最顶端】即第 1 位【在 INPUT 链的末尾追加一条规则】iptables -A INPUT -p tcp --dport 80 -j ACCEPT使用 -A 参数将新规则追加到整条链的末尾回到顶部三、特别注意事项3.1 规则顺序与逻辑陷阱默认策略风险直接设置iptables -P INPUT DROP可能导致 SSH 断连若未提前放行 SSH 规则。安全做法先添加 ACCEPT 规则最后再设置默认拒绝。状态跟踪依赖ESTABLISHED 规则需放在服务端口规则之前否则响应流量被拦截。3.2 持久化配置避免重启失效CentOS/RHELiptables-save /etc/sysconfig/iptablessystemctl enable iptables # 确保服务开机自启Debian/Ubuntuiptables-save /etc/iptables/rules.v4apt install iptables-persistent -y # 安装持久化工具验证方法重启后执行 iptables -L -n -v检查规则是否加载。3.3 常见错误排查1规则不生效可能的原因规则顺序错误如 DROP 在 ACCEPT 之前。表链混淆如在 filter 表配置 DNAT。未启用连接跟踪模块nf_conntrack。诊断命令iptables -L INPUT -n -v --line-numbers # 查看匹配计数lsmod | grep nf_conntrack # 检查状态跟踪模块2紧急恢复方案若配置错误导致断连通过控制台执行iptables -P INPUT ACCEPT # 临时放行所有入站iptables -F # 清空规则谨慎使用3尝试执行 iptables 脚本报错command not found// 【在执行 iptables 脚本前的准备工作】// 1. 备份当前规则以防万一需要回滚iptables-save /tmp/iptables_backup.rules// 2. 清空 filter 表默认表的所有规则和自定义链iptables -Fiptables -X// 3. 清空其他常用表如 NAT 表iptables -t nat -Fiptables -t nat -X// 4. 重置默认策略建议先设为 ACCEPT防止清空规则后自己断网iptables -P INPUT ACCEPTiptables -P FORWARD ACCEPTiptables -P OUTPUT ACCEPT// 【尝试执行 iptables 脚本报错】[rootlocalhost ~]# sudo /bin/iptables.shsudo: /bin/iptables.sh: command not found// 检查文件存在[rootlocalhost ~]# ls -l /bin/iptables.sh-rw-r–r-- 1 root root 1484 Jul 13 13:49 /bin/iptables.sh// 只有读r和写w权限缺少了执行x权限。// 在 Linux 中如果一个脚本没有执行权限直接运行它时系统就会提示 command not found。// 【解决】添加执行权限[rootlocalhost ~]# chmod x /bin/iptables.sh[rootlocalhost ~]# ls -l /bin/iptables.sh-rwxr-xr-x 1 root root 1484 Jul 13 13:49 /bin/iptables.sh// 执行脚本[rootlocalhost ~]# sudo /bin/iptables.sh// 查看当前配置[rootlocalhost ~]# sudo iptables -LChain INPUT (policy ACCEPT)target prot opt source destinationACCEPT all – localhost localhostACCEPT all – anywhere anywhere state RELATED,ESTABLISHEDACCEPT tcp – x.x.x.x anywhere tcp dpt:mysql。。。。3.4 配置关键点最小权限原则仅开放必要端口并严格限制来源 IP如–dport 22 -s 192.168.1.0/24。先查后改操作前用iptables -L -n -v --line-numbers查看当前规则。避免直接修改默认策略优先用 DROP 规则兜底而非iptables -P INPUT DROP。生产环境先测试在非关键时段配置并通过 ping、telnet 验证连通性。备份与注释为复杂规则添加注释-m comment --comment “允许DBA访问”并定期备份规则文件。回到顶部四、小小的总结iptables 作为 Linux 防火墙核心通过四表五链实现数据包控制。核心逻辑在于规则顺序决定生效结果匹配即停止四表raw、mangle、nat、filter按优先级处理五链如PREROUTING、INPUT、FORWARD对应数据包流向需严格区分表链职责如nat 表仅转换地址filter 表决定放行。配置实操需遵循“先清规则、设默认、添策略”流程测试环境可清空规则生产环境先备份默认策略建议调试期设为 ACCEPT完成后收紧为 DROP规则顺序务必先放行基础流量如回环、已建立连接再开放服务端口最后兜底拒绝。NAT 配置需同时操作 nat 表如DNAT、SNAT和 filter 表的 FORWARD 链确