数据库应绑定127.0.0.1并配合防火墙限制,禁用0.0.0.0监听,优先使用unix域套接字,再通过ss、telnet等验证本地监听与隔离效果。

数据库端口默认监听在 0.0.0.0(即所有网络接口),若未做限制,可能被外部网络直接访问,带来安全风险。本地化监听 + 网络层隔离,是保障核心数据库最基础也最关键的防护手段。
只绑定到 127.0.0.1(本地回环)
让数据库进程仅接受本机发起的连接,彻底阻断远程 TCP 访问:
-
MySQL / MariaDB:修改
my.cnf中的bind-address = 127.0.0.1,重启服务;确认无skip-networking(否则禁用 TCP) -
PostgreSQL:修改
postgresql.conf中的listen_addresses = '127.0.0.1',同时检查pg_hba.conf中对应行是否允许local或host的127.0.0.1/32 -
Redis:设置
bind 127.0.0.1并确保protected-mode yes(6.0+ 默认开启),禁用bind 0.0.0.0或注释掉该行
关闭非必要端口暴露,配合防火墙加固
即使应用层已绑定本地,仍需在网络层做二次拦截,防止配置误改或服务异常监听外网:
- 使用系统防火墙(如
iptables或nftables)默认拒绝入站,仅放行必需端口(如 SSH、HTTP) - 显式丢弃对数据库端口(如 3306、5432、6379)的非本地请求:
iptables -A INPUT ! -s 127.0.0.1 -p tcp --dport 3306 -j DROP - 云服务器还需检查安全组规则,确保数据库端口未对公网或非信任 VPC 开放
应用与数据库同机部署时的通信优化
若 Web 应用与数据库共存于一台服务器,优先使用 Unix 域套接字(Unix socket),比 TCP loopback 更高效且天然隔离:
- MySQL 支持
--socket=/var/run/mysqld/mysqld.sock,PHP/Python 连接时指定unix_socket参数 - PostgreSQL 使用
host=/var/run/postgresql(对应unix_socket_directories配置) - Redis 可启用
unixsocket /tmp/redis.sock并设好权限(unixsocketperm 700)
验证监听状态与连通性
修改后必须验证实际监听行为是否符合预期:
- 运行
ss -tlnp | grep :3306(或对应端口),确认Local Address:Port显示为127.0.0.1:3306,而非*:3306 - 从本机用
telnet 127.0.0.1 3306测试可通;从另一台机器尝试连接应超时或被拒 - 检查
/proc/net/tcp中对应端口的st字段是否为01(established)或0A(listen),且tr/tw列为空表示无异常连接
不复杂但容易忽略——绑定本地只是第一步,配合防火墙和连接方式优化,才能真正实现端口级的最小化暴露与运行时隔离。










