私は安定した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つの可能なソリューションを見つけました。vsftpd
ftp
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_login
php 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
マンページまた参考用です。構成ファイルの各項目が実行する操作を説明するページへのリンクがあります。
この回答について質問や質問がある場合は、コメントを残してください。コマンドを試す前に、私が提供する各リンクを注意深く読んでください。誤解を解決し、投稿を改善するためにフィードバックを送信していただきありがとうございます。必要に応じて回答を更新できます。
頑張ってください!