Linux防火墙个性化策略定制指南
一、方案选型与总体思路
二、firewalld快速定制范式
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone=public --permanent
firewall-cmd --zone=external --change-interface=eth1 --permanent
firewall-cmd --permanent --add-source=203.0.113.10/32 --zone=trusted
firewall-cmd --reload
firewall-cmd --add-service=ssh
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload
firewall-cmd --permanent \
--add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="3306" protocol="tcp" accept'
firewall-cmd --permanent \
--add-rich-rule='rule family="ipv4" port port="22" protocol="tcp" limit value="5/m" accept'
firewall-cmd --reload
firewall-cmd --permanent --add-masquerade
firewall-cmd --permanent \
--add-rich-rule='rule family=ipv4 destination port port=80 protocol=tcp redirect port=8080'
firewall-cmd --reload
firewall-cmd --set-log-denied=all
journalctl -u firewalld -f
firewall-cmd --list-all --zone=public
三、iptables与nftables底层定制范式
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -p tcp --dport 9889 -j DROP
iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 9889 -j ACCEPT
iptables -I INPUT -s 203.0.113.10/32 -p tcp --dport 9889 -j ACCEPT
iptables -N SSH_FILTER
iptables -A SSH_FILTER -s 192.168.1.100 -j ACCEPT
iptables -A SSH_FILTER -j DROP
iptables -A INPUT -p tcp --dport 22 -j SSH_FILTER
# Debian/Ubuntu
sudo apt install iptables-persistent
sudo netfilter-persistent save
# CentOS/RHEL
service iptables save
# 或
iptables-save > /etc/sysconfig/iptables
四、常见场景模板与命令清单
| 场景 | firewalld 命令 | iptables 命令 |
|---|---|---|
| 仅公司网段访问 22/TCP(其余来源拒绝) | 将默认区域设为 public 且不放开 ssh;把公司网段加入 trusted;或移除 ssh 服务并用富规则仅放行公司网段 | 先 DROP 22,再对 22 插入公司网段 ACCEPT 规则 |
| 端口转发:80→8080 | 开启 masquerade;用富规则 redirect 80→8080 | 在 nat/PREROUTING 做 DNAT,配合 filter/FORWARD 放行 |
| 限制 SSH 暴力连接 | 富规则:limit value="5/m" accept |
使用 recent 模块或基于日志/外部工具联动限速 |
| 记录被拒绝流量 | --set-log-denied=all 并查看 journalctl -u firewalld |
在 INPUT 链对 DROP/REJECT 前插入 LOG 目标 |
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --permanent \
--add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port port="22" protocol="tcp" accept'
firewall-cmd --reload
iptables -I INPUT -p tcp --dport 9889 -j DROP
iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 9889 -j ACCEPT
iptables -I INPUT -s 203.0.113.10/32 -p tcp --dport 9889 -j ACCEPT
firewall-cmd --permanent --add-masquerade
firewall-cmd --permanent \
--add-rich-rule='rule family=ipv4 destination port port=80 protocol=tcp redirect port=8080'
firewall-cmd --reload
五、安全与运维最佳实践
--reload 生效;iptables 变更前先备份并准备回滚脚本。firewall-cmd --reload 而非完全重载;必要时才用 --complete-reload(会断开现有连接)。--set-log-denied=all,配合 journalctl -u firewalld 与集中日志系统。