第一次接触Linux服务器的朋友,看到iptables这个词可能会觉得有点高大上。其实说白了,它就是Linux系统自带的"门卫大爷",负责决定哪些网络流量能进、哪些不能进。我刚开始用的时候也犯怵,直到有次服务器被莫名其妙扫描端口才意识到它的重要性。
现在主流的CentOS 7/8虽然默认用firewalld,但底层还是依赖iptables。就像手机系统再怎么更新,打电话发短信的基础功能不会变。掌握iptables的核心用法,不仅能应付老系统维护,对理解现代防火墙也很有帮助。
先看最基本的安装检查:
bash复制iptables -V
如果显示版本号(比如iptables v1.8.4)说明已安装。没装的话用这个命令:
bash复制yum install iptables-services -y
防火墙服务管理是日常高频操作,我习惯用systemctl命令:
bash复制# 查看状态
systemctl status iptables
# 临时启停
systemctl start iptables
systemctl stop iptables
# 开机自启设置
systemctl enable iptables
systemctl disable iptables
有个容易踩的坑:修改规则后如果不保存,重启服务就会丢失配置。我第一次部署时就被这个坑过,后来养成习惯每次修改都执行:
bash复制service iptables save
# 或者
/etc/init.d/iptables save
在修改之前,先要了解当前规则。我常用的两个查看命令:
bash复制iptables -L -n # 简洁版
iptables -L -n --line-number # 带行号版本
带行号的输出特别实用,比如:
code复制Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
假设要开放SSH(22)、HTTP(80)、MySQL(3306)端口:
bash复制iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
这里解释下关键参数:
-A INPUT:追加到INPUT链(入站流量)-p tcp:指定TCP协议--dport:目标端口-j ACCEPT:执行动作(允许)重要提醒:开放端口后一定要重启服务才能生效:
bash复制systemctl restart iptables
只允许特定IP访问SSH:
bash复制iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
注意顺序很重要!规则是从上到下匹配的,如果把DROP放在前面,后面的ACCEPT就永远不会生效了。
更精细的控制示例(允许特定IP段访问特定端口):
bash复制iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
先用--line-number查看规则编号:
bash复制iptables -L -n --line-number
然后按编号删除(比如删除第3条规则):
bash复制iptables -D INPUT 3
临时规则重启后会丢失,必须保存:
bash复制service iptables save
在CentOS 7+可能会遇到问题,这时可以改用:
bash复制iptables-save > /etc/sysconfig/iptables
问题1:规则不生效?
tail -f /var/log/messages问题2:误锁自己?
iptables -Fiptables -P INPUT ACCEPT利用状态检测提高效率:
bash复制iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
这样已建立的连接就不需要重复检查了。
防止暴力破解SSH:
bash复制iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --set
iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --update --seconds 60 --hitcount 4 -j DROP
简单的SNAT示例:
bash复制iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
经过多年运维总结,分享几个实用经验:
规则注释:复杂规则记得加注释
bash复制iptables -A INPUT -p tcp --dport 80 -m comment --comment "Web Service" -j ACCEPT
备份策略:定期备份规则
bash复制iptables-save > /backup/iptables.rules.$(date +%F)
测试环境验证:重要变更先在测试机验证
默认拒绝策略:建议设置默认拒绝
bash复制iptables -P INPUT DROP
iptables -P FORWARD DROP
日志记录:关键操作记日志
bash复制iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH Attempt: "
最后提醒,现代云服务器通常还有安全组功能,要和iptables配合使用。曾经遇到过安全组放行但iptables阻止的情况,排查了半天才发现是双重防护导致的。