2020-10-28 20:06:53
Linux防火墙规则的编写核心在于明确允许和拒绝的流量,推荐使用firewalld工具,其支持动态修改、区域管理和自动持久化,更适合现代Linux环境。以下是iptables和firewalld的配置实例及关键注意事项:
一、使用iptables编写规则iptables通过表、链和规则管理流量,需按顺序操作并注意规则优先级。
设置默认策略(Deny All原则)确保未明确允许的流量被拒绝,但需先允许关键服务(如SSH)或本地操作,避免锁死。
# 允许已建立的连接和相关流量iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPTiptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT# 默认拒绝所有传入和转发流量iptables -P INPUT DROPiptables -P FORWARD DROP# 默认允许所有传出流量(根据需求修改)iptables -P OUTPUT ACCEPT允许特定服务/端口
SSH(端口22):iptables -A INPUT -p tcp --dport 22 -j ACCEPT
HTTP(端口80)和HTTPS(端口443):iptables -A INPUT -p tcp --dport 80 -j ACCEPTiptables -A INPUT -p tcp --dport 443 -j ACCEPT
Loopback接口(本机通信):iptables -A INPUT -i lo -j ACCEPTiptables -A OUTPUT -o lo -j ACCEPT
阻止特定IP地址:iptables -A INPUT -s 192.168.1.100 -j DROP
保存规则iptables规则默认临时生效,需手动保存:
Debian/Ubuntu:sudo netfilter-persistent save# 或sudo iptables-save > /etc/iptables/rules.v4
CentOS/RHEL:sudo service iptables save# 或sudo iptables-save > /etc/sysconfig/iptables
firewalld通过区域(zones)管理流量,支持动态修改和自动持久化,逻辑更清晰。
查看当前状态和区域
firewall-cmd --state # 查看防火墙状态firewall-cmd --get-active-zones # 查看活动区域firewall-cmd --zone=public --list-all # 查看public区域的详细规则允许服务或端口推荐使用服务名(如ssh、http)而非端口号,简化配置:
允许SSH服务:firewall-cmd --zone=public --add-service=ssh --permanentfirewall-cmd --reload # 重新加载规则
允许HTTP和HTTPS服务:firewall-cmd --zone=public --add-service=http --permanentfirewall-cmd --zone=public --add-service=https --permanentfirewall-cmd --reload
允许特定端口(如TCP 8080):firewall-cmd --zone=public --add-port=8080/tcp --permanentfirewall-cmd --reload
阻止特定IP或IP范围使用Rich Rules实现复杂控制:
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" reject' --permanentfirewall-cmd --reload移除规则将add-替换为remove-即可删除规则:
firewall-cmd --zone=public --remove-service=ssh --permanentfirewall-cmd --reload对比iptables:
锁死服务器:
原因:先设置默认拒绝策略(如iptables -P INPUT DROP),但未允许SSH端口。
解决:先允许关键服务(如SSH),再设置拒绝策略,或在本地控制台操作。
规则顺序错误:
原因:iptables按顺序匹配规则,若拒绝规则在前,允许规则可能失效。
解决:将具体允许规则放在通用拒绝规则之前。
混淆永久与非永久规则:
原因:firewalld不加--permanent时,规则重启后失效。
解决:测试时先不加--permanent,确认无误后添加并--reload。
过度依赖默认配置:
原因:firewalld默认区域(如public)可能开放不必要端口。
解决:采用“白名单”策略,仅允许业务必需流量,并限制源IP。
分步测试:逐步应用规则,每添加一部分就测试功能,避免一次性部署复杂规则集。
多客户端测试:从不同网络环境(如办公网络、家庭网络)访问服务,验证规则是否按预期生效。
使用网络诊断工具:
ping:测试基本连通性。
telnet/nc:测试特定端口是否开放(如telnet your_server_ip 22)。
nmap:扫描服务器开放端口(如nmap -sT your_server_ip)。
ss/netstat:查看服务器本地监听端口和连接状态。
检查防火墙日志:配置日志记录被拒绝或接受的连接,分析日志调试规则。
回滚计划:修改前备份旧规则,或准备“紧急放行”脚本(如通过KVM/IPMI登录后清空规则iptables -F)。
总结: