核心思路是默认拒绝所有入站连接,仅显式放行22、80、443等必需公共端口,通过firewalld或iptables设置drop默认策略、允许lo和established连接、精准开放端口并验证拦截效果,构建最小权限访问模型。

要阻断所有针对非公共端口的网络接入,核心思路是:默认拒绝所有入站连接,仅显式放行少数必需端口(如22、80、443),并确保规则顺序与状态跟踪正确生效。这不是“封几个端口”的操作,而是建立最小权限访问模型。
明确哪些端口属于“公共端口”
公共端口指你主动对外提供服务、且业务必需的端口,常见包括: - SSH:22(或你自定义的管理端口,如2222) - HTTP:80 - HTTPS:443 - 其他如 3306(MySQL)、5432(PostgreSQL)、6379(Redis)等——**除非明确需要外部访问,否则一律不开放**判断标准很简单:如果某个端口没有被你的Web服务、API网关、远程管理工具等主动监听并依赖外网调用,它就不属于公共端口。
用 firewalld 实现精准放行(推荐用于 RHEL/CentOS/Fedora)
firewalld 更易维护,支持动态规则和区域概念:
- 启用并设为开机启动:sudo systemctl enable --now firewalld
- 确认当前默认区域(通常是 public):firewall-cmd --get-default-zone
- 清空该区域中所有预设服务:firewall-cmd --permanent --remove-service=ssh --remove-service=http --remove-service=https --remove-service=dhcpv6-client
- 只添加真正需要的端口:firewall-cmd --permanent --add-port=22/tcp --add-port=80/tcp --add-port=443/tcp
- 确保默认策略为拒绝:firewall-cmd --set-default-zone=drop(或保留 public 区但不加任何冗余服务)
- 重载生效:firewall-cmd --reload
用 iptables 实现强管控(通用性强,适合 Ubuntu/Debian 等)
适合需要精细控制或无 firewalld 的环境,关键在于默认策略 + 状态跟踪:
- 清空现有规则(操作前建议备份):sudo iptables -F && sudo iptables -t nat -F
- 设置默认策略为 DROP:sudo iptables -P INPUT DROP && sudo iptables -P FORWARD DROP
- 允许本地回环:sudo iptables -A INPUT -i lo -j ACCEPT
- 允许已建立连接返回:sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- 只放行指定端口(示例含 SSH 和 HTTPS):sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT - 保存规则(Ubuntu/Debian):sudo apt install iptables-persistent && sudo netfilter-persistent save
(CentOS/RHEL):sudo service iptables save
验证是否真正生效
不能只看规则是否存在,要实测未放行端口是否被拦截:
- 查监听端口是否仅限必要服务:sudo ss -tuln | grep ':'(重点关注 0.0.0.0:* 或 *:*)
- 从另一台机器测试未开放端口(如 3306):nc -zv your-server-ip 3306 —— 应显示 connection refused 或 timeout
- 检查防火墙日志(UFW/firewalld/iptables)是否有 DROP 记录,确认拦截动作真实触发











