ftp пассивный режим и php

У меня есть веб-сервер Apache, работающий на этой машине со стабильной версией Debian. Эта программа PHP должна подключаться через FTP к удаленному онлайн-серверу, помимо прочего.

Все работало нормально, пока я не установил FTP-сервер ( vsftpd версии 3.0.3-8 + b1), но я не думаю, что это виновник.

Теперь я получаю эту ошибку

Точные ошибки:

 I won't open a connection to xxxx --->*remote server ip* (only to xxxx ---->*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) он работает нормально. Не нужно было указывать раньше.

One Solution collect form web for “ftp пассивный режим и php”

Проблема под рукой

Вы сообщаете, что не можете подключиться к удаленному ftp серверу. Вы получите следующее сообщение об ошибке:

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

В зависимости от того, используете ли вы в качестве решения ftp сервера решение php ftp или vsftpd , я мог бы найти 2 возможных решения.

1. Возможное исправление конфигурации VSFTP

Потенциально вам нужно только исправить вашу конфигурацию vsftp . Я нашел это сообщение на форуме от пользователя nhtrader, который может предоставить возможное решение. Пожалуйста, прочтите его полностью, чтобы убедиться, что он относится к вам.

  • Прежде всего, это ftp сервер, расположенный удаленно или в вашем доме / локальной сети? Убедитесь, что вы можете пройти проверку подлинности или, по крайней мере, установить связь с сервером без использования службы ftp .

  • Во-вторых, убедитесь, что ваш маршрутизатор поддерживает переадресацию портов и добавьте нужные порты в список переадресации портов маршрутизатора. Если вы используете VPS для ftp сервера, обратитесь к их документации, касающейся переадресации портов и методов поддержки ftp , аутентификации, удаленного управления и т. Д.

  • GRC предоставляет достойный инструмент для проверки того, блокирует ли ваша домашняя сеть какие-либо порты или службы, которые вам потребуются. Это может быть хорошей проверкой, чтобы убедиться, что переадресация вашего порта работает и не заблокирована вашим провайдером. Вам также нужно будет создать правила брандмауэра как на хосте, так и на сервере, чтобы разрешить соединения через порты, которые вы хотите использовать.

  • В-третьих, отредактируйте файл конфигурации 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-адрес и не имеете статического, используйте эту запись:

 pasv_addr_resolve=YES 

Если вы используете статический IP-адрес, используйте вместо этого:

 pasv_address=xxxx 

Сохраните и закройте файл конфигурации и перезапустите службу vsftpd .

  sudo systemctl restart vsftpd.service 

Теперь вы должны правильно подключиться к вашему FTP-серверу. Опять же, я предлагаю просмотреть весь пост на форуме, так как он охватывает много информации и возможных проблем.

2. Возможное исправление PHP

По словам пользователя Martin Prikryl в этом сообщении о переполнении стека , вы можете решить эту проблему, переместив ftp_pav после ftp_login в php module вы используете на своем сервере.

 $conn_id = ftp_connect('xxxx'); ftp_login($conn_id, 'user', 'pass'); ftp_pasv($conn_id, true); 

Он нашел этот ответ, обратившись к документации php . Пожалуйста, прочитайте все ссылки, чтобы убедиться, что это применимо для вас.

Заключение

Во-первых, проверьте правильность конфигурации вашего vsftpd или другого ftp сервера, что ваш брандмауэр разрешает ftp соединения и что вы даже можете подключиться к вашему хосту. Обратитесь к документации вашего VPS или маршрутизатора за рекомендациями в этом.

Я буду включать ссылку на справочную страницу vsftpd для справки. Он имеет ссылку на страницу, объясняющую, что делает каждая запись в файле конфигурации.

Пожалуйста, прокомментируйте, если у вас есть какие-либо вопросы или проблемы с этим ответом. Я настоятельно рекомендую вам прочитать каждую ссылку, которую я предоставил, прежде чем пытаться выполнить команды. Я ценю обратную связь, чтобы исправить любые заблуждения и улучшить мои сообщения. Я могу обновить свой ответ по мере необходимости.

Удачи!

  • Использование nohup для непрерывного выполнения сценария
  • Устранение URL-адресов на сервере
  • Загрузка Apache PHP - права собственности и разрешения
  • Чтение журналов ошибок apache с php
  • Не удается получить доступ к веб-странице из локальной сети
  • Как установить фонарь (php7) на Manjaro?
  • Почему я получаю ошибку несуществующего класса в PHP на Fedora?
  • MySQL и PHP (и другие языки)
  • Обновление php на сервере Linux
  • Синтаксис Vim выделяет определенные строки
  • Напечатайте что-нибудь в консоли в том же месте, что и предыдущий эхо, с неким отрицательным эхом
  • Linux и Unix - лучшая ОС в мире.