2.8.2 端口开放策略与最小暴露原则
端口开放策略与最小暴露原则#
端口开放策略的核心目标是“仅开放业务必需端口”。通过最小暴露原则减少扫描与攻击面,并在策略、审计、变更与告警上形成闭环。
一、原理草图:最小暴露与访问分区#
二、最小暴露原则实施要点(含示例)#
- 最小端口集合:只开放业务必需端口。
- 最小监听范围:能绑定内网地址就不绑定 0.0.0.0。
- 最小访问范围:按来源分区(公网/内网/管理网)。
- 最小权限服务:服务用非特权用户运行。
示例:Nginx 仅对公网开放 80/443,后台接口只绑定内网地址
# /etc/nginx/conf.d/site.conf
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8080;
}
}
# 管理接口仅内网绑定
server {
listen 10.0.2.10:8088; # 仅内网IP
server_name admin.example.local;
location / {
proxy_pass http://127.0.0.1:9000;
}
}
# 检查监听地址
ss -lntp | grep -E ':(80|443|8088)\s'
三、端口开放策略分类(含命令示例)#
- 公网端口:80/443/API,配合 WAF/限流/ACL
- 内网端口:数据库、中间件(3306/6379/2181),仅应用网段
- 管理端口:SSH、监控(22/9100),限制来源
示例:使用 firewalld 实施“默认拒绝 + 白名单放行”
# 1) 设置默认区域为 drop(默认拒绝)
firewall-cmd --set-default-zone=drop
# 2) 开放公网 Web 端口
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent
# 3) 允许应用网段访问数据库 3306
firewall-cmd --permanent --zone=internal --add-source=10.0.3.0/24
firewall-cmd --permanent --zone=internal --add-port=3306/tcp
# 4) 仅允许堡垒机访问 SSH
firewall-cmd --permanent --zone=trusted --add-source=10.0.1.10
firewall-cmd --permanent --zone=trusted --add-service=ssh
# 5) 重新加载并查看规则
firewall-cmd --reload
firewall-cmd --list-all --zone=public
firewall-cmd --list-all --zone=internal
firewall-cmd --list-all --zone=trusted
四、开放端口审核与变更控制(含示例)#
- 新增端口需审批:记录业务目的、责任人、访问范围
- 定期核查:识别无主端口
- 变更可追溯:纳入配置管理或 IaC
示例:端口清单核查与“无主端口”识别
# 1) 获取监听端口与进程
ss -lntp > /tmp/listen_ports.txt
cat /tmp/listen_ports.txt
# 2) 生成端口清单(仅端口与进程)
awk 'NR>1 {print $4, $7}' /tmp/listen_ports.txt | sed 's/.*://g' > /tmp/ports_proc.txt
# 3) 与业务白名单对比(白名单示例)
cat > /tmp/ports_allow.txt <<'EOF'
22
80
443
9100
EOF
# 4) 输出“非白名单端口”
awk '{print $1}' /tmp/ports_proc.txt | sort -u | comm -23 - <(sort -u /tmp/ports_allow.txt)
五、排错与风险控制(含示例)#
常见问题:端口未开放、监听地址不对、规则优先级冲突。
示例:端口不通的排查步骤
# 1) 本机是否监听
ss -lntp | grep ':8080'
# 2) 防火墙是否放行
firewall-cmd --list-all --zone=public | grep 8080
# 3) 连接测试(本机/远端)
curl -I http://127.0.0.1:8080
nc -zv 10.0.2.10 8080
# 4) 规则优先级检查(iptables 例)
iptables -S | sed -n '1,40p'
六、练习#
- 将一台服务器设置为“默认拒绝”,仅开放 80/443 和管理网 SSH,并验证外网无法访问 22。
- 配置一个服务只监听内网 IP(例如 10.0.2.10),验证公网无法访问该端口。
- 用
ss输出监听端口并与白名单对比,找出“无主端口”,给出处理建议。