📅  最后修改于: 2023-12-03 14:46:17.494000             🧑  作者: Mango
端口转发(Port Forwarding)是指将网络服务请求从一个 IP 地址/端口号的组合“转发”到另一个 IP 地址/端口号的过程。本文介绍如何用 Python 实现端口转发。
Python 的 socket 模块提供了对网络套接字的支持。我们可以使用 socket 创建出一个服务器端和客户端,实现端口转发。具体如下:
import socket
local_port = 8888 # 本地端口
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', local_port))
server.listen(1) # 监听连接
remote_port = 80 # 远程服务器端口
remote_addr = 'www.example.com' # 远程服务器地址
client, addr = server.accept()
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as remote: # with 语法:当代码块执行完毕时,自动关闭套接字(语法糖)
remote.connect((remote_addr, remote_port))
while True:
data = client.recv(1024)
if not data:
break
remote.sendall(data)
while True:
data = remote.recv(1024)
if not data:
break
client.sendall(data)
完整代码如下:
import socket
local_port = 8888 # 本地端口
remote_port = 80 # 远程服务器端口
remote_addr = 'www.example.com' # 远程服务器地址
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:
server.bind(('127.0.0.1', local_port))
server.listen(1) # 监听连接
print(f'监听 {local_port} 端口...')
while True:
client, addr = server.accept()
print(f'接收来自 {addr[0]}:{addr[1]} 的连接')
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as remote:
remote.connect((remote_addr, remote_port))
print(f'连接到远程服务器 {remote_addr}:{remote_port}')
while True:
data = client.recv(1024)
if not data:
break
remote.sendall(data)
while True:
data = remote.recv(1024)
if not data:
break
client.sendall(data)
print(f'关闭连接')