Linux服务暴露风险的核心在于默认不开放端口、按需显式开启必要服务;盲目监听0.0.0.0等于暴露钥匙;应确认服务绑定127.0.0.1,用ss -tlnp检查,修改bind配置,强化防火墙策略,默认DROP并精确放行,结合systemd依赖控制与socket禁用,落实最小开放原则。
Linux服务暴露风险的核心在于:默认不开放任何端口,只按需显式开启必要服务。盲目启用 sshd、httpd 或 mysqld 且监听 0.0.0.0,等于把钥匙挂在门口。
很多服务(如 redis-server、postgresql)默认监听 127.0.0.1,这是安全基线。一旦改配成 0.0.0.0 或空绑定,就可能被外部访问。
检查方法:
ss -tlnp | grep ':端口号'
关键看第二列(Local Address:Port)是否含 127.0.0.1;若显示 *:22 或 0.0.0.0:3306,说明已全网暴露。
/etc/redis/redis.conf 中的 bind 行为 bind 127.0.0.1(禁用 bind 0.0.0.0)postgresql.conf 的 listen_addresses 和 pg_hba.conf 的访问控制行dockerd)默认监听 unix:///var/run/docker.sock,但若配置了 -H tcp://0.0.0.0:2375,则直接暴露容器管理接口即使服务配置为本地监听,内核路由或容器网络可能绕过该限制。因此 iptables 或 nftables 不是可选项,而是强制兜底手段。
典型策略:
DROP:iptables -P INPUT DROP
接入:iptables -A INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT
3306、6379、27017 等数据库端口的外部连接,除非有反向代理或跳板机场景ufw 时,避免执行 ufw allow 22 这类无源限制的命令;应写成 ufw allow from 10.0.5.0/24 to any port 22
有些服务依赖其他组件(如 nginx 依赖 openssl 或上游 API),但 systemd 默认不校验依赖链是否完整。结果是服务启动了,但实际功能不可用,管理员误以为“开了就行”,反而放松了网络侧防护。
正确做法:
/etc/systemd/system/myservice.service 中添加:BindTo=network.target 和 After=network.target,确保网络就绪后再启动ExecStartPre=/usr/bin/iptables -C INPUT -p tcp --dport 80 -j ACCEPT 2>/dev/null || /usr/bin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT
systemctl disable myservice.socket,防止未预期的 socket 触发服务启动最小开放原则不是“少开几个端口”,而是每次开放都伴随明确的访问来源、协议版本、TLS 强制要求和日志审计能力。最常被绕过的点是:容器内部服务监听 0.0.0.0、docker-compose.yml 中漏写 extra_hosts 导致回环调用走外网、以及云平台安全组与主机防火墙策略冲突。