商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 系统应用 > Linux怎么使用iptables配置规则 Linux防火墙进阶配置详解

Linux怎么使用iptables配置规则 Linux防火墙进阶配置详解

  发布于2026-05-21 阅读(0)

扫一扫,手机访问

iptables规则未生效的根本原因是规则顺序错误:-A INPUT追加到链尾,若前面有-DROP或默认策略为DROP,新规则将无法匹配;应使用-I INPUT 1优先插入,同时确认filter表不处理DNAT/SNAT,须用-t nat配合PREROUTING/POSTROUTING链。

Linux怎么使用iptables配置规则 Linux防火墙进阶配置详解

很多人以为iptables是那种“开了就能用”的傻瓜式工具,结果配置了一堆规则,却发现流量根本不按自己预想的路径走。问题出在哪?其实,规则顺序、表链优先级、默认策略这三点如果没理清,你就算加上一百条-A INPUT -p tcp --dport 22 -j ACCEPT,也可能被前面一条不起眼的-j DROP给直接截胡。


为什么刚加的允许 SSH 规则没生效?

遇到这种情况,先别急着怀疑语法。最根本的原因,往往是规则在链里的位置太靠后了。想象一下,INPUT链的默认策略如果是DROP或者REJECT,而你的允许规则被追加到了末尾,那么所有数据包在“长途跋涉”到这条规则之前,就已经被前面的默认策略给丢弃了。

  • iptables -A INPUT ... 这个命令总是把规则追加到链的末尾。它适合在已经设置了宽松默认策略(比如ACCEPT)之后,再做细化的拦截和过滤。
  • 如果你要放行SSH、HTTP这类关键服务,正确的做法是使用-I INPUT 1 ...,将规则插入到链的最前面,确保它能被优先匹配。
  • 动手检查一下:执行iptables -L INPUT --line-numbers,看看当前规则的序号,确认你添加的规则是不是真的在能生效的位置。
  • 千万别忽略默认策略:当你用iptables -t filter -P INPUT DROP设定了默认丢弃后,必须确保至少有一条显式的ACCEPT规则排在它前面,并且能被成功匹配。

filter 表和 nat 表混用常见错误

另一个典型的坑是想做端口转发,比如把外网的8080端口映射到内网服务器的80端口,结果却在filter表里折腾了半天。为什么没效果?因为filter表根本不处理地址转换,它只负责判断流量是放行还是拦截。

  • DNAT(目标地址转换):必须使用-t nat -A PREROUTING。命令示例:iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
  • SNAT(源地址转换):必须使用-t nat -A POSTROUTING。这通常用于让内网主机共享一个公网IP地址上网。
  • 别忘了filter表的FORWARD链:做完NAT转换后,流量还需要被转发。你需要在FORWARD链里同时放行:① 转发的请求本身(例如-p tcp --dport 80);② 回程的响应(通常用-m state --state ESTABLISHED,RELATED -j ACCEPT来搞定)。
  • 还有一个隐藏开关:如果漏掉了sysctl -w net.ipv4.ip_forward=1,那么所有的NAT规则都会静默失效。这其实不是iptables的错,而是内核的IP转发功能没打开。

状态匹配(state)为什么有时不工作?

-m state --state NEW这种写法看起来很直观,但它背后依赖的是连接跟踪模块(nf_conntrack)。如果系统负载很高、连接数超过了限制,或者在raw表里存在-j NOTRACK规则,那么状态匹配就会变得不可靠。

  • 更现代的写法是使用-m conntrack --ctstate NEW。它更稳定,并且明确区分了连接跟踪的状态。
  • 对于UDP流量要特别小心:UDP本身是无连接的,它的NEW状态持续时间极短,容易导致漏包。对于UDP服务,更稳妥的做法是结合端口和IP地址进行过滤。
  • 注意NOTRACK的影响:如果你为了提升DNS或NTP查询性能,在raw表中设置了NOTRACK规则,那么这些数据包后续在filter表里就无法再用conntrack进行状态匹配了。这时,你得退回到用源/目的IP和端口这些基础信息来判断。
  • 排查命令:用iptables -t raw -L -n -v查看一下,是否有意料之外的NOTRACK规则干扰了你的状态匹配逻辑。

保存规则后重启失效?

你是不是也遇到过这种情况:明明执行了service iptables sa ve或者iptables-sa ve > /etc/sysconfig/iptables,结果服务器一重启,规则全没了?这通常是因为保存的规则没有被系统在启动时自动加载。

  • CentOS 6/7:确保iptables服务(注意不是firewalld)已经启用:systemctl enable iptables
  • Ubuntu/Debian:这些系统默认没有原生的service iptables命令。你需要手动编写systemd服务单元,或者安装iptables-persistent包来帮你管理持久化。
  • 一个更可靠的方法是:将iptables-restore命令写入/etc/network/if-up.d/目录下的脚本,或者写入/etc/rc.local文件(如果该系统启用了它)。
  • 最后提醒一点:不要直接去编辑/etc/sysconfig/iptables文件就以为万事大吉。这个文件只是一个快照,必须通过iptables-restore命令加载到内核中,规则才会真正生效。

说到底,规则顺序、表链职责、连接跟踪状态、持久化机制——这四个关键点,任何一个没搞清楚,都会让你的配置看起来“写了但好像又没写”。尤其是在多张表(raw、nat、mangle、filter)混合使用的复杂场景下,数据包实际流经的路径,和你想象中可能差了不止两步。理清这些,才算真正摸到了iptables的门道。

本文转载于:https://www.php.cn/faq/2439106.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注