Как мне сделать FTP-сервер python ОБЩЕДОСТУПНЫМ?

#python-3.x #ftp #ftp-server

#python-3.x #ftp #ftp-сервер

Вопрос:

Я создал FTP-сервер с Pyftpdlib, и я хотел бы иметь возможность подключаться к серверу из другой страны / IP, и я попытался загрузить свой скрипт (в форме exe) другу в другой части страны, и я не смог подключиться (простой тайм-аут / недопустимая ошибка). Как мне подключиться к ftp-серверу, который находится не рядом со мной?

Сервер

 from pyftpdlib.authorizers import DummyAuthorizer
from pyftpdlib.handlers import FTPHandler
from pyftpdlib.servers import FTPServer
import requests

import mysql.connector
sqlpass = "THIS ISNT THE PASSWORD"

def ftp_main():
    mydb = mysql.connector.connect(
        host="remotemysql.com",
        port="3306",
        user="NOT TELLING",
        passwd=sqlpass,
        database="NO THANKS"
    )
    mycursor = mydb.cursor()

    mycursor.execute("SELECT Username, Password FROM NO-THANKS")
    myresult = mycursor.fetchall()
    Username, Password = myresult[0]
    print(Username   " "   Password)


    authorizer = DummyAuthorizer()


    authorizer.add_user(Username, Password, 'C:/', perm='elradfmwMT')
    authorizer.add_anonymous('C:/')


    handler = FTPHandler
    handler.authorizer = authorizer

    handler.banner = "Test Banner"



    # Instantiate FTP server class and listen on 0.0.0.0:2121
    address = ('0.0.0.0', 21)
    server = FTPServer(address, handler)


    # start ftp server
    server.serve_forever()


ftp_main()
  

Клиент

 from ftplib import FTP

ftp = FTP('104.193.20.211')
ftp.login("user", "pass")

ftp.retrlines('LIST')
ftp.cwd("Users/TEST/Desktop")
ftp.retrlines('LIST')

getfile = 'test1.txt'
command = 'RETR'

ftp.retrbinary(command   " "   getfile, open('test1.txt', 'wb').write)
  

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

Комментарии:

1. Это не вопрос программирования. Не имеет значения, что вы сами создали свой FTP-сервер на Python. Вы делаете его доступным для внешней сети таким же образом, как и любой другой сторонний FTP-сервер — путем настройки брандмауэра и NAT.

Ответ №1:

(Из того, что вы говорите, я предполагаю, что это не работает, только если вы подключаетесь к удаленной сети.)

Поскольку у вас проблема с подключением, похоже, что проблема вызвана сетью. С точки зрения программирования не должно иметь значения, подключаетесь ли вы к IP в своей локальной сети или нет.

Проверьте эти возможные проблемы:

  • Сервер находится за NAT: типичный потребительский маршрутизатор выполняет преобразование сетевых адресов между общедоступными и частными адресами. Это полезно, когда ваш провайдер предоставляет вам один IP, но вы хотите использовать несколько устройств. Когда обычный домашний маршрутизатор видит пакет с локального компьютера куда-либо в Интернете, он меняет свой исходный IP на IP, предоставленный вашим провайдером, при необходимости изменяет исходный порт и запоминает это соединение. Маршрутизатор может позже использовать эту сохраненную информацию, чтобы перевести все обратно, когда придет ответ. В этом случае вы можете создавать соединения только изнутри локальной сети. Если вы хотите получать соединение из Интернета, вам придется явно указать, какой компьютер в локальной сети должен получать это соединение. Найдите «перенаправление портов» или «виртуальные серверы» или что-то подобное в настройках маршрутизаторов. Некоторые протоколы (например, FTP) имеют проблемы с NATs, вашему маршрутизатору потребуется поддерживать эти прикладные протоколы.
  • Где-то в сети есть брандмауэр, или ОС на стороне сервера не позволяет использовать низкие номера портов (это менее вероятно. Вероятно, вы получите какую-то ошибку на стороне сервера).

Комментарии:

1. Какой сервер мне назначить для прослушивания? ‘0.0.0.0’? (также на какой мне установить свой маскарадный адрес?)

2. Если у вас единый интерфейс, должно быть нормально, если вы используете «0.0.0.0» в качестве параметра. В этом примере не указан адрес. (Маскарадный адрес должен быть адресом, предоставляемым клиентам, поэтому в вашем случае это, вероятно, должен быть публичный IP, но я не уверен, что это решит вашу проблему.) Я не уверен, как маршрутизатор на стороне сервера будет обрабатывать пассивный ftp. Некоторые домашние устройства проверяют команды ftp на наличие порта, а затем автоматически открывают его. Разницу между пассивным и активным ftp смотрите по этой ссылке.