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'

六、练习#

  1. 将一台服务器设置为“默认拒绝”,仅开放 80/443 和管理网 SSH,并验证外网无法访问 22。
  2. 配置一个服务只监听内网 IP(例如 10.0.2.10),验证公网无法访问该端口。
  3. ss 输出监听端口并与白名单对比,找出“无主端口”,给出处理建议。