推荐使用 nftables 编写一键加固脚本:清空旧规则、默认 DROP INPUT、放行回环、已建立连接、必要端口(22/80/443)、禁 ping;含自动回滚、持久化及基础防护增强项。

Linux 一键加固服务器安全策略的防火墙脚本,核心是用 iptables 或更现代的 nftables(推荐)限制不必要的入站连接、关闭高危端口、放行必要服务,并设置默认拒绝策略。不依赖外部工具,纯 Shell 脚本即可实现基础但有效的防护。
明确加固范围:只开必需端口,其他全拒
脚本第一步是清空旧规则、设置默认策略为 DROP,再按需放行。典型场景:仅允许 SSH(22)、HTTP/HTTPS(80/443),若为数据库服务器可加 3306 或 5432;禁止所有 ICMP ping(防探测)、禁用转发、关闭 IP 欧洲协议(如 IPv6 若不用)。
- 默认 INPUT 链策略设为 DROP,OUTPUT 设为 ACCEPT(出站一般信任)
- 显式放行已建立连接(RELATED,ESTABLISHED)——这是保持 SSH 不断的关键
- 只添加 -A INPUT -p tcp --dport 22 -j ACCEPT 这类明确规则,避免用 -i eth0 等网卡名(不同服务器可能不同,改用 -i lo 或省略)
- 拒绝 ping:-A INPUT -p icmp --icmp-type echo-request -j DROP
用 nftables 替代 iptables(推荐,语法更清晰)
nftables 是内核 3.13+ 默认防火墙框架,规则更简洁、原子性更好。一个最小加固脚本开头可这样写:
#!/usr/bin/env bash
nft flush ruleset
nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
nft add rule inet filter input ct state established,related accept
nft add rule inet filter input iifname "lo" accept
nft add rule inet filter input ip protocol icmp icmp type echo-request drop
nft add rule inet filter input tcp dport { 22, 80, 443 } accept
保存为 /usr/local/bin/secure-firewall.sh,chmod +x 后直接运行。重启后需持久化:Debian/Ubuntu 用 nft list ruleset > /etc/nftables.conf,CentOS/RHEL 用 systemctl enable nftables 并确保配置已保存。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
加入基础防护增强项
单纯端口控制不够,建议叠加以下轻量级防护:
- 防端口扫描:用
limit模块限制新连接速率,例如nft add rule inet filter input tcp flags & (tcp-fin | tcp-syn | tcp-rst) != 0 limit rate over 5/minute burst 5 packets drop - 防 SSH 暴力破解:配合 fail2ban 更好,但脚本里可先封禁常见攻击源 IP 段(如从公开黑名单下载并导入)
- 禁用 root 远程登录和密码认证(非防火墙范畴,但属加固必备):修改
/etc/ssh/sshd_config后 reload sshd
验证与回滚机制不能少
一键脚本执行前必须有超时自动回滚,否则误操作可能锁死 SSH。可在脚本开头加:
(sleep 120; nft flush ruleset && echo "Auto-rollback triggered") & # 执行主规则... echo "Firewall applied. Type 'nft list ruleset' to verify. Press Ctrl+C to abort." read -t 10 -p "Confirm? (press Enter to continue, or wait 10s to rollback) " || exit 1 kill %1 2>/dev/null
同时提供卸载函数:uninstall() { nft flush ruleset; systemctl restart sshd; },方便快速恢复。

















