php-fpm 应禁用 tcp 监听改用 unix socket,若必须用 tcp 则仅绑定 127.0.0.1:9000 并通过防火墙拒绝非本地访问;同时 nginx 需配置路径遍历防护与敏感文件拦截,防火墙仅开放 80/443 和 ssh,形成网络层与应用层协同防御。

PHP-FPM 本身不直接暴露在网络层,它通过 Unix socket 或本地 TCP(如 127.0.0.1:9000)与 Nginx 通信,因此系统防火墙(如 ufw 或 firewalld)对 PHP-FPM 的保护重点不是“放行它的端口”,而是阻断外部对 PHP-FPM 监听地址的非法访问,并配合 Nginx 层做纵深防御。真正需要防火墙干预的,是防止攻击者绕过 Nginx、直连 PHP-FPM 或探测后端服务。
确保 PHP-FPM 不监听公网地址
这是最基础也最关键的一步。如果 PHP-FPM 错误配置为 listen = 0.0.0.0:9000 或 127.0.0.1:9000 且防火墙未限制,外部请求可能通过端口扫描发现并尝试发送恶意 FastCGI 请求(已有公开 PoC 利用此类 misconfig 实现远程代码执行)。
- 检查监听方式:
sudo grep "^listen" /etc/php/*/fpm/pool.d/www.conf - 生产环境必须禁用 TCP 监听,改用 Unix socket(如
listen = /run/php/php8.2-fpm.sock) - 若确需 TCP(如容器或分离部署),则只绑定
127.0.0.1:9000,并立即在防火墙中拒绝所有非本地访问该端口的入站连接
用防火墙封禁对 PHP-FPM 端口的非本机访问
以 Ubuntu/Debian 的 ufw 为例(RHEL/CentOS 可类推):
- 若 PHP-FPM 使用
127.0.0.1:9000,运行:sudo ufw deny from any to any port 9000 proto tcp - 再显式允许仅本机回环访问(虽默认允许,但显式声明更清晰):
sudo ufw allow from 127.0.0.1 to any port 9000 - 启用并验证:
sudo ufw enable && sudo ufw status numbered
这样即使配置失误导致端口暴露,防火墙也会拦截来自服务器外部的所有连接请求。
协同 Nginx 防止路径遍历与敏感文件泄露
防火墙无法过滤 HTTP 内容,但可与 Nginx 配置形成互补防线。例如,攻击者常通过构造 /?a=../../../etc/passwd 尝试触发 PHP 文件包含漏洞——此时单靠防火墙无效,但可借助 Nginx 提前拦截异常路径:
- 在 server 块中加入:
location ~ (\.\.\/|\/\.) { return 403; } - 禁止访问敏感文件:
location ~* \.(env|ini|log|sh|bak|swp|git|htaccess|php\.bak)$ { deny all; } - 这些规则由 Nginx 执行,防火墙无需参与,但二者共同构成“网络层 + 应用层”双控机制
限制 Nginx 自身监听范围,缩小攻击面
Nginx 是唯一对外服务的入口,防火墙应严格控制其暴露的端口:
- 只开放必要端口:
sudo ufw allow OpenSSH、sudo ufw allow 'Nginx Full'(即 80/443) - 关闭所有其他端口:
sudo ufw default deny incoming - 避免使用
Nginx HTTP(仅 80)而不用 HTTPS,否则明文传输的登录态、API 密钥等易被截获
此举让攻击者无法通过扫描发现调试端口、管理后台或未关闭的测试服务,从源头减少针对 PHP 应用的探测行为。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











