应只暴露反向代理端口,不映射phpMyAdmin容器的80端口:启动时省略-p参数,使其仅通过自定义Docker网络与Nginx通信;Nginx容器映射443端口并配置IP白名单、禁用PMA_ARBITRARY、关闭MySQL容器端口暴露及配置iptables二次过滤。
只暴露反向代理端口,不映射 phpMyAdmin 容器的 80 端口
phpmyadmin 官方镜像默认监听 80 端口,但直接用 -p 8080:80 暴露它,等于把整个 web 界面裸奔在公网——哪怕加了密码,ui 层漏洞(如 cve-2018-12613)仍可能被利用。真正安全的做法是:让 phpmyadmin 容器只在内部网络通信,完全不对外暴露端口。
实操要点:
- 启动 phpMyAdmin 时不加
-p参数,只用--network mynet接入自定义网络 - 另起一个
nginx:alpine容器,也加入同一网络,并只映射443(或8443)端口 - Nginx 配置里用
proxy_pass http://phpmyadmin:80转发,phpmyadmin是容器名,不是 IP - 确保 Nginx 配置中包含
allow 203.0.113.0/24;和deny all;,硬限制访问来源
禁用 phpMyAdmin 的任意主机连接(PMA_ARBITRARY=0)
PMA_ARBITRARY=1 允许用户在登录页手动填数据库地址,这等于开放了一个可被探测、爆破甚至 SSRF 的入口。生产环境必须关掉它——除非你明确需要连多个动态 DB 实例。
正确做法:
- 删掉或注释掉所有
-e PMA_ARBITRARY=1,改用固定PMA_HOST - 若 DB 容器名为
db,就只设-e PMA_HOST=db,不设PMA_PORT也行(默认3306) - 如果误开
PMA_ARBITRARY又没配白名单,攻击者可能填127.0.0.1或内网其他服务地址发起 SSRF
MySQL 容器不暴露 3306 到宿主机
很多人以为“phpMyAdmin 安全了,MySQL 就没事”,但只要 MySQL 容器用了 -p 3306:3306,外部就能绕过 phpMyAdmin 直连数据库——尤其当 root 密码弱或用户授权宽泛时,风险极高。
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
务必做到:
- MySQL 容器启动时**完全不加
-p**,只靠 Docker 网络互通 - 确认 MySQL 配置里
bind-address = 127.0.0.1(默认值),或干脆删掉该行(Docker 内部通信不依赖它) - 检查
MYSQL_ROOT_HOST是否设为%—— 这仅用于容器间通信,不是开放给外网 - 别在 MySQL 里开
GRANT ... ON *.*,最小权限原则:只给 phpMyAdmin 所需库的SELECT,INSERT,UPDATE,DELETE
用 iptables 二次过滤反代入口流量
即使 Nginx 做了 IP 白名单,如果宿主机防火墙没设防,攻击者仍可能通过其他路径(如容器逃逸后直连 Nginx)绕过。iptables 是最后一道可控防线。
示例规则(执行一次即可):
iptables -A INPUT -p tcp --dport 443 -s 203.0.113.0/24 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j DROP
注意点:
- 规则顺序很重要,
ACCEPT必须在DROP前 - 如果用了云服务器,安全组规则要和 iptables 一致,避免冲突
- 别对
80端口做同样限制——HTTP 应强制重定向到 HTTPS,不单独放行
-p 参数和宿主机 iptables 规则持久化(重启后失效)。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










