暴露面由监听地址决定
一个端口是否对外可用,取决于它绑定在哪个地址,而不是端口号本身。绑 0.0.0.0(IPv6 写 ::)表示所有网卡都能连;绑 127.0.0.1 只有本机进程能连;绑具体内网地址则限定在某个网段。数据库、缓存、消息队列、监控采集端口大多只需要本机或内网访问,把绑定地址收紧比单纯依赖边界防火墙更贴近数据源:防火墙规则被误改或漏配时,绑定依然挡着。
基本信息
| 加固项 | 监听地址收敛 |
|---|---|
| 适用平台 | Linux/Windows 服务与容器化应用 |
| 权限要求 | 服务配置修改权限 |
| 达标判据 | 仅需本地访问的服务绑 127.0.0.1,跨机访问绑内网地址 |
| 常见位置 | 服务配置文件、systemd 单元参数、容器端口映射 |
典型使用场景
- 数据库、缓存只给本机应用访问时改成回环绑定
- 同机部署 Nginx 与应用,后端服务只绑本地并走反向代理
- 微服务只在内网互通,绑内网网卡地址而非全部地址
- 容器宿主机把容器端口映射到回环,避免直接对公网暴露
- 暴露面巡检发现某服务监听在 0.0.0.0 后做整改
识别监听全地址的服务
识别监听全地址的服务
ss -tulnp | awk '{print $1, $5, $7}' | grep -E '0\.0\.0\.0|\[::\]' # 找出对所有地址开放的服务
ss -tulnp | grep -E ':6379|:27017|:9200|:3306|:5432' # 抽查常见数据库与缓存端口
ss -x | head -20 # 本地通信用 unix socket 时不涉及网络暴露整改示例
整改示例
# MySQL:/etc/my.cnf 中 bind-address = 127.0.0.1
# Redis:redis.conf 中 bind 127.0.0.1 -::1,并保持 protected-mode yes
# Tomcat:Connector 增加 address="127.0.0.1"
# Nginx 反向代理的后端:listen 127.0.0.1:8080;
# 容器:docker run -p 127.0.0.1:6379:6379 只映射到宿主机回环
systemctl restart <服务> && ss -tulnp | grep <端口> # 复核绑定地址已变化绑定写法对照
| 绑定地址 | 可访问范围 | 适用判断 |
|---|---|---|
| 0.0.0.0 / :: | 所有网卡,任何可达主机 | 只用于确实需要对外提供服务的入口 |
| 127.0.0.1 / ::1 | 仅本机 | 数据库、缓存、同机后端服务的默认选择 |
| 具体内网地址 | 该网段可达的主机 | 集群内部互通,配合防火墙限源 |
| unix socket | 仅本机且有文件权限约束 | 本机通信最佳,兼顾性能与收敛 |
容器场景要分清两层:容器内监听 0.0.0.0 是正常的,真正的暴露面由宿主机的端口映射决定,所以写成 -p 127.0.0.1:6379:6379 而不是 -p 6379:6379。Docker 的端口发布默认会写入 nat 表,改动后要用 ss 与 iptables -t nat -S 两侧确认。
改绑定地址要与反向代理、负载均衡探活、监控采集配置联动:改完先在一台机器上回归业务,确认代理与探活都正常,再批量推进。贸然全量变更可能出现“服务是活的但谁也连不上”的情况,而探活又恰好只检查进程是否存在。