防火墙开放出端口,PHP如何解封?
Outbound port open on firewall, how to unblock for PHP?
目标是使用 PHP 通过 SMTP 从我的共享主机向 Mandrill 发送出站电子邮件,我与主机系统管理员充分合作。
现状:
- ✅ PHP 可以连接到 smtp.mandrillapp.com 端口 443(用于 HTTPS)
- ❌ PHP 无法连接到 smtp.mandrillapp.com 端口 587(用于 SMTP)
- ✅ PHP 可以连接到 portquiz.net 端口 443(用于 HTTPS)
- ❌ PHP 无法连接到 portquiz.net 端口 587(用于 SMTP)
- ✅ Telnet 可以连接到 smtp.mandrillapp.com 端口 443
- ✅ Telnet 可以连接到 smtp.mandrillapp.com 端口 587
Telnet 由他们以 root 身份登录并 运行 telnet HOST PORT
测试。 PHP 使用下面的脚本进行测试。
PHP 的哪个配置选项可能导致端口 587 上的出站连接被阻止?我们如何才能反转该配置?
<?php
// Test outbound server connections
// https://mandrill.zendesk.com/hc/en-us/articles/205582167-What-SMTP-ports-can-I-use-
$servers = array(
array("ssl://www.google.com", 443),
array("ssl://smtp.mandrillapp.com", 465),
array("smtp.mandrillapp.com", 25),
array("smtp.mandrillapp.com", 587),
array("smtp.mandrillapp.com", 2525),
array("smtp.mandrillapp.com", 443)
);
foreach ($servers as $server) {
list($server, $port) = $server;
echo "<h1>Attempting connect to <tt>$server:$port</tt></h1>\n";
flush();
$socket = fsockopen($server, $port, &$errno, &$errstr, 10);
if(!$socket) {
echo "<p>ERROR: $server:$portsmtp - $errstr ($errno)</p>\n";
} else {
echo "<p>SUCCESS: $server:$port - ok</p>\n";
}
flush();
}
?>
据我所知,使用 PHP 无法阻止任何特定端口。 (也许使用suhosin,但我从未听说过这个选项。)
请问您的托管服务提供商是否启用了 SELinux? SELinux 允许操作系统拒绝某些 users/processes 到 bind/connect 到某个端口。这可能是为什么他们可以使用 telnet 作为 root 连接到 SMTP 服务器,但是您自己的用户下的 PHP 进程不能连接的原因。我曾遇到过无法使用 PHP/Apache 连接到端口 80 的 CentOS 服务器,但是当我以 root 身份执行 curl/wget 时,一切都很顺利。
目标是使用 PHP 通过 SMTP 从我的共享主机向 Mandrill 发送出站电子邮件,我与主机系统管理员充分合作。
现状:
- ✅ PHP 可以连接到 smtp.mandrillapp.com 端口 443(用于 HTTPS)
- ❌ PHP 无法连接到 smtp.mandrillapp.com 端口 587(用于 SMTP)
- ✅ PHP 可以连接到 portquiz.net 端口 443(用于 HTTPS)
- ❌ PHP 无法连接到 portquiz.net 端口 587(用于 SMTP)
- ✅ Telnet 可以连接到 smtp.mandrillapp.com 端口 443
- ✅ Telnet 可以连接到 smtp.mandrillapp.com 端口 587
Telnet 由他们以 root 身份登录并 运行 telnet HOST PORT
测试。 PHP 使用下面的脚本进行测试。
PHP 的哪个配置选项可能导致端口 587 上的出站连接被阻止?我们如何才能反转该配置?
<?php
// Test outbound server connections
// https://mandrill.zendesk.com/hc/en-us/articles/205582167-What-SMTP-ports-can-I-use-
$servers = array(
array("ssl://www.google.com", 443),
array("ssl://smtp.mandrillapp.com", 465),
array("smtp.mandrillapp.com", 25),
array("smtp.mandrillapp.com", 587),
array("smtp.mandrillapp.com", 2525),
array("smtp.mandrillapp.com", 443)
);
foreach ($servers as $server) {
list($server, $port) = $server;
echo "<h1>Attempting connect to <tt>$server:$port</tt></h1>\n";
flush();
$socket = fsockopen($server, $port, &$errno, &$errstr, 10);
if(!$socket) {
echo "<p>ERROR: $server:$portsmtp - $errstr ($errno)</p>\n";
} else {
echo "<p>SUCCESS: $server:$port - ok</p>\n";
}
flush();
}
?>
据我所知,使用 PHP 无法阻止任何特定端口。 (也许使用suhosin,但我从未听说过这个选项。)
请问您的托管服务提供商是否启用了 SELinux? SELinux 允许操作系统拒绝某些 users/processes 到 bind/connect 到某个端口。这可能是为什么他们可以使用 telnet 作为 root 连接到 SMTP 服务器,但是您自己的用户下的 PHP 进程不能连接的原因。我曾遇到过无法使用 PHP/Apache 连接到端口 80 的 CentOS 服务器,但是当我以 root 身份执行 curl/wget 时,一切都很顺利。