FTP 服务器未使用套接字向 Python 中的代理发送数据

FTP server not sending data to proxy in Python with sockets

我正在 Python 中 ftp 客户端和 ftp 服务器之间构建代理。所有控制阶段和数据阶段都做得很好(当前处于活动模式),但是当我发送请求(例如 LIST)时,服务器不会发回信息。我不知道是什么导致了这个错误...

这里是 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 + '[=12=]').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 + '[=13=]').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 捕获会话来看,听起来您发送到 FTP 服务器的端口和您实际侦听代理服务器上数据连接的端口不相同,因此 FTP 服务器报告连接被拒绝。确保端口 server_socket2 已绑定,即 port 等于 256 * tuple[4] + tuple[5]。我相信 socket_option 25 指的是 SO_BINDTODEVICE,在这种情况下,当您使用 bind() 绑定套接字时,则无需显式地将套接字绑定到接口(在一般用例)。你能删除那条线并检查它是否还在工作吗?这对我来说也是一种学习!谢谢。