有没有办法记录PHP 的所有传出请求到日志文件?
我并不是在寻找一种调试单个脚本的方法,tcpdump
而是不断记录所有 PHP 请求,以便我可以稍后查看它们 - 即,与 Web 服务器非常相似,access.log
但针对服务器上任何 PHP 脚本发出的所有传出请求。
我想用这个做两件事:
- 确认我的网站是否安全/符合 GDPR 要求,并且没有脚本尝试“打电话回家”。
- 我们的服务器每天应该发出一个外部请求。我想验证这些请求是否发生,并且最好还能看到远程站点返回的响应代码。
答案1
如果您不想使用 tcpdump,只要您的服务器上运行的是 GNU/Linux,您就可以使用 iptables 所有者匹配目标。
首先,您需要检查脚本在哪个用户下执行。如果您正在运行 Apache/mod_php,则该用户与 apache 用户相同(通常apache
为 或httpd
)。如果您正在运行 nginx/fastcgi/etc,则这些用户可能有其他进程所有者(suid)。无论如何,这几乎总是单独的用户 ID(uid),或者至少您可以通过这种方式更改配置。一旦您知道了您的 php uid,您就可以使用 执行 iptable owner match
。LOG target
类似这样的操作:
iptables -I OUTPUT -o eth0 -m owner --uid-owner apache -j LOG --log-prefix "PHP-CONN: "
确保将接口更改为 Internet 端的接口(以避免记录本地主机虚拟请求)。默认情况下,上面的示例将记录每个数据包,包括 TCP 握手等。您可以添加其他 iptables 选项以进行更多过滤。例如,添加state match
仅过滤NEW
连接(使用 netfilter conntrack):
iptables -I OUTPUT -o eth0 -m owner --uid-owner apache -m state --state NEW -j LOG --log-prefix "PHP-CONN: "
然后,来自您进程的所有请求都将记录到 syslog 工具中(取决于您的发行版设置,这些请求通常记录到dmesg
+/var/log/messages
或/var/log/syslog
)。它们看起来类似于以下内容:
PHP-CONN: IN= OUT=eth0 SRC=192.168.9.235 DST=195.201.201.32 LEN=52 TOS=0x10 PREC=0x00 TTL=64 ID=37120 DF PROTO=TCP SPT=56812 DPT=80 WINDOW=501 RES=0x00 ACK FIN URGP=0