簡體   English   中英

FTP 服務器未使用 sockets 將數據發送到 Python 中的代理

[英]FTP server not sending data to proxy in Python with sockets

我正在 ZF104B2DFAB9FE8C0676587292A636D3Z 客戶端和 ftp 服務器之間的 Python 中構建代理。 所有控制階段和數據階段都做得很好(目前處於活動模式),但是當我發送請求(例如 LIST)時,服務器不會發回信息。 我不知道是什么導致了這個錯誤...

這是 Wireshark 的捕獲:

Wireshark 捕獲

以及對應的代碼:

print(f"Waiting for a message from the server to the PORT message")
answer = fw_proxy_server.recv(BUFFER_FTP)
print(answer) # 200 PORT command successful
fw_proxy_client.send(answer) # forward to client

# Create the socket to listen on 192.168.30.80:port (IP_PROXY:port)
server_socket2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket2.setsockopt(socket.SOL_SOCKET, 25, str(INTERFACE_PROXY_SERVER + '\0').encode('utf-8'))
server_socket2.bind((IP_PROXY, port))
server_socket2.listen()

print(f"Waiting for a message from the client")
message = fw_proxy_client.recv(BUFFER_FTP) # REQUEST: LIST

print(f"Forwarding message from the server")
message = send(fw_proxy_server, "LIST") # REQUEST: LIST (sent to port 21)

# Accept an incoming connection from the Server with data

server_socket2, data_address = server_socket2.accept() # HERE PROGRAM HANG
print(f"Data connection from {data_address} has been established!")

print(f"Waiting for a message from the data from server")
message = fw_proxy_server.recv(BUFFER_FTP) # never executed

IP如下:
客戶:192.168.40.50
代理客戶端:192.168.40.80
代理服務器:192.168.30.80
服務器:192.168.30.90

提前致謝。

編輯:

更改監聽端口的順序,以便在發送 PORT 命令和 LIST 請求之前監聽端口。 結果相同,連接被拒絕:

start = str(message).find("(")
end = str(message).find(")")
tuple = str(message)[start+1:end].split(',')
port = int(tuple[4])*256 + int(list(filter(str.isdigit, tuple[5]))[0])
#Create the socket to listen on 192.168.40.80:port
server_socket2 = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket2.setsockopt(socket.SOL_SOCKET, 25, str(INTERFACE_PROXY_SERVER + '\0').encode('utf-8'))
server_socket2.bind(("192.168.40.80", port)) # With 192.168.30.80 it doesn't work too
server_socket2.listen()

answer = send(fw_proxy_server, "PORT 192,168,30,80," + tuple[4] + "," + tuple[5])
print(f"Waiting for a message from the server to the PORT message")
print(answer) # 200 PORT command successful
fw_proxy_client.send(answer)

#Create the socket to forward the data to the server

print(f"Waiting for a request from the client") # REQUEST: LIST
message = fw_proxy_client.recv(BUFFER_FTP)
print(message)

fw_proxy_server.send(message)
print(f"Waiting for an answer from the server") # Response 425: Unable to build data connection: Connection refused
answer = fw_proxy_server.recv(BUFFER_FTP)
print(answer)


#Accept an incoming connection from the Client
server_socket2, data_address = server_socket2.accept() #Program hang
print(f"Data connection from {data_address} has been established!")

print(f"Waiting for a message from the server")
print(answer)

從 Wireshark 捕獲 session 中,聽起來您發送到 FTP 服務器的端口和您實際在代理服務器上偵聽數據連接的端口不同,因此 ZC728A493673C9A93AF54AZ7 服務器報告連接被拒絕。 確保端口server_socket2已綁定,即port等於256 * tuple[4] + tuple[5] 我相信 socket_option 25指的是SO_BINDTODEVICE ,在這種情況下,當您使用bind()綁定套接字時,無需將套接字顯式綁定到接口(在一般用例中)。 您可以刪除該行並檢查它是否仍在工作? 這對我來說也將是一個學習。 謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM