在防火墙上打开出站端口,如何取消阻止PHP?

时间:2015-09-28 16:00:10

标签: php port firewall

目标是使用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();
}
?>

1 个答案:

答案 0 :(得分:1)

据我所知,使用PHP阻止任何特定端口是不可能的。 (也许使用suhosin,但我从来没有听说过这个选项。)

您是否可以询问您的托管服务提供商是否启用了SELinux? SELinux允许操作系统拒绝某些用户/进程绑定/连接到某个端口。这可能是他们可以使用telnet作为root连接到SMTP服务器的原因,但是您自己用户下的PHP进程无法实现。我经历过CentOS服务器,我无法使用PHP / Apache连接到端口80,但是当我以root身份执行curl / wget时,一切都很顺利。