現在の問題

現在の問題

私は安定したDebianシステムでApache Webサーバーを実行しています。このPHPプログラムはリモートオンラインサーバーなどに接続するためにFTPを使用する必要があります。

FTPサーバー(vsftpdバージョン3.0.3-8 + b1)をインストールするまで、すべてがうまく機能していましたが、これが原因であるとは思いません。

これでこのエラーが発生します。

正確なエラーは次のとおりです。

I won't open a connection to x.x.x.x --->*remote server ip* (only to x.x.x.x ---->*my public ip*)

lsリモートディレクトリにアクセスすることもできず、代わりに次のエラーが発生します。

Unable to list directory

私はこれがFTPが「基本的に」アクティブモードで実行されるためだと思いますが、実際にはわかりません。これらのエラーは手動モードに関連しているようです。

どう思いますか?

  • Debian バージョン: Debian GNU/Linux 9
  • PHPバージョン:7.0.30-0+deb9u1

私たちが議論しているPHPルーチンは次ftp_login()のとおりです。ftp_fput()

ftp_pasv(, true)使用するたびにうまく機能するので、自動起動モードのようです。あらかじめ具体的に説明する必要はありません。

答え1

現在の問題

リモートサーバーに接続できないことを報告しますftp。次のエラーメッセージが表示されます。

I won't open a connection to x.x.x.x remote server ip (only to x.x.x.x my public ip)

サーバーソリューションとして使用php ftpするかどうかに応じて、2つの可能なソリューションを見つけました。vsftpdftp

1. 可能な VSFTP 構成の変更

設定を変更する必要があるかもしれませんvsftp。私が見つけたこのフォーラムの投稿はnhtraderユーザーによって投稿されました。これは可能な解決策を提供することができます。その内容がお客様に適用されることを確認するには、内容全体をお読みください。

  • まず、これはftpリモートサーバーですか、それとも自宅/ LAN内のサーバーですか?サービスを使用せずにサーバーを認証するか、少なくともサーバーと通信できることを確認してくださいftp

  • 次に、ルーターがポート転送をサポートしていることを確認し、必要な関連ポートをルーターのポート転送リストに追加します。 VPSをftpサーバーとして使用している場合は、ポート転送とサポート方法ftp、認証、リモート管理などのマニュアルを参照してください。

  • GRC、良いツールを提供しますホームネットワークが必要なポートやサービスをブロックしていないことを確認してください。これは、ポート転送が正しく機能し、ISPによってブロックされていないことを確認するための良い方法です。また、使用するポートを介した接続を許可するには、ホストとサーバーにファイアウォールルールを作成する必要があります。

  • 第三に、vsftpdの設定ファイルを編集します/etc/vsftpd.conf

次のコマンドを使用して、ファイルに次のエントリを追加しますsudo nano /etc/vsftpd.conf

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
idle_session_timeout=600
data_connection_timeout=120
ftpd_banner=[Whatever message of your choice]
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem

次の項目を使用すると、使用するポートを決定できます。これはその一部に過ぎません。ユーザー nhtrader は以下を使用します。

listen_port=26   
pasv_max_port=7004
pasv_min_port=7000

動的IPアドレスを使用し、静的IPアドレスがない場合は、次の項目を使用してください。

pasv_addr_resolve=YES

静的IPアドレスを使用している場合は、次のアドレスを使用してください。

pasv_address=x.x.x.x

設定ファイルを保存して閉じた後、vsftpdサービスを再起動します。

 sudo systemctl restart vsftpd.service

これで FTP サーバーに正しく接続できるようになりました。もう一度申し上げますが、全体の内容をご覧になることをお勧めします。フォーラム投稿多くの情報と可能な質問を扱っているからです。

2. 可能なPHPの修正

ユーザーMartin Prikrylによるとこのスタックオーバーフロー投稿、サーバーに戻ると、ftp_pav正確なエラーメッセージを解決できます。ftp_loginphp module

$conn_id = ftp_connect('x.x.x.x');

ftp_login($conn_id, 'user', 'pass');

ftp_pasv($conn_id, true);

彼は相談を通してこの答えを見つけた。PHPドキュメント。すべてのリンクを注意深く読んで、これがあなたに適した修正であることを確認してください。

結論として

まず、あなたvsftpdまたは他のftpサーバーが正しく構成されていること、ファイアウォールが接続をftp許可していること、およびホストに接続できることを確認してください。これを行うベストプラクティスについては、VPSまたはルーターのマニュアルを参照してください。

リンクを追加しますvsftpd マンページまた参考用です。構成ファイルの各項目が実行する操作を説明するページへのリンクがあります。

この回答について質問や質問がある場合は、コメントを残してください。コマンドを試す前に、私が提供する各リンクを注意深く読んでください。誤解を解決し、投稿を改善するためにフィードバックを送信していただきありがとうございます。必要に応じて回答を更新できます。

頑張ってください!

関連情報