📜  python 端口转发 - Python (1)

📅  最后修改于: 2023-12-03 14:46:17.494000             🧑  作者: Mango

Python 端口转发

简介

端口转发(Port Forwarding)是指将网络服务请求从一个 IP 地址/端口号的组合“转发”到另一个 IP 地址/端口号的过程。本文介绍如何用 Python 实现端口转发。

原理

Python 的 socket 模块提供了对网络套接字的支持。我们可以使用 socket 创建出一个服务器端和客户端,实现端口转发。具体如下:

  1. 创建一个本地服务器
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) # 监听连接
  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)
  1. 接收来自远程服务器的响应,将其发送回给客户端
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'关闭连接')
注意事项
  • 程序需要在具备足够权限的用户下运行
  • 如果你的程序仅作为测试,运行于本地,最好限制本地服务器监听的 IP 地址
  • 不可用于非授权的端口转发行为,可能会被认为是黑客行为