Php 无法从AWS AMI运行FTP命令

Php 无法从AWS AMI运行FTP命令,php,amazon-web-services,firewall,amazon-ami,aws-security-group,Php,Amazon Web Services,Firewall,Amazon Ami,Aws Security Group,我想使用PHP连接到FTP以上载生成的报告。根据远程服务器,FTP需要处于活动模式 这是我的代码: ini_set('display_errors', '1'); error_reporting(E_ALL); $conn_id = ftp_connect('myftpserver.com', 21); if($conn_id) { // login with username and password $login_result = ftp_login($conn_id,

我想使用PHP连接到FTP以上载生成的报告。根据远程服务器,FTP需要处于活动模式

这是我的代码:

ini_set('display_errors', '1');
error_reporting(E_ALL);

$conn_id = ftp_connect('myftpserver.com', 21);

if($conn_id)
{
    // login with username and password
    $login_result = ftp_login($conn_id, 'mysuer', 'password');

    $passive = ftp_pasv($conn_id,FALSE);

    echo "is active?<br/>";
    var_dump($passive);

    echo 'Login Result:';
    var_dump($login_result);

    $files_list = ftp_nlist($conn_id, '/MyFolder/');

    echo "<br/>files list ";

    var_dump($files_list);
}
else
{
    var_dump('Unable to connect to FTP Server');
}

AWS安全组使用FTP活动模式存在问题

要使活动模式工作,您必须打开1023以上的所有入站端口。如果您的客户支持限制范围,请这样做。您还需要打开入站和出站端口20和端口21

问题是FTP客户端选择了一个它将侦听的端口。然后,FTP客户端将此端口号通知FTP服务器。然后FTP服务器连接到此端口。这违背了AWS安全组的正常设计,即只允许打开特定端口。您可以通过临时打开所有端口、测试FTP客户端,然后关闭所有端口来验证这一点

FTP客户端的活动模式不安全。被动模式对FTP服务器不安全(但更好的选择)

注意:经常旋转FTP凭据。您的登录名和密码以明文形式发送,未加密


FTP是一种传统技术,现在仍然非常流行,应该存储在阁楼上。

可能相关:。在被动模式下,数据连接由客户端而不是服务器启动。如果客户端位于防火墙后面,则可能需要此选项。您好@jarmod,谢谢您的回复。我必须使用活动模式。事实上,我能够在本地ubuntu(LAMP)和Windows系统(XAMPP)上正确运行它。但不是在AWS上。所以,我觉得代码是正确的。我在安全设置或防火墙中缺少某些内容。
telnet myftpserver.com 21
来自问题服务器。通常完全允许出站连接,除非VPC没有网关连接。如果没有网关连接,
ping google.com
也会失败。然后使用适当的路由表将“Internet网关”添加到您的VPC中<代码>[ec2-user@ip-172-31-40-119~]$telnet myftpserver.com 21
尝试xxx.xx.xx…
连接到myftpserver.com。
转义字符为“^]”。
220市场就绪…
我使用telnet命令收到的响应。让我看看我的路线表。你的网络看起来不错。不知道是什么问题。谢谢约翰!完全同意你所说的。我已通过打开安全组中的所有端口进行了测试。根据对该主题的进一步研究,它可能与NAT有关。它将私有IP地址更改为公共IP,因此无法获得响应。我更喜欢编程,只是不知道这是怎么回事。:)根据客户端软件的不同,您可能永远无法在活动模式下工作。AWS NAT网关和家用互联网路由器之间有一个重要区别。家用设备将查看FTP数据包,并使用正确的公共IP地址对其进行修改,并记录所使用的FTP端口。AWS NAT网关不支持。
is active
bool(true) 
Login Result:bool(true)
files list bool(false)