my_proxy.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import asyncio
  2. from aioquic.asyncio import connect
  3. from aioquic.quic.configuration import QuicConfiguration
  4. from aioquic.quic.events import StreamDataReceived, ConnectionTerminated
  5. from aioquic.asyncio.protocol import QuicConnectionProtocol
  6. import ssl
  7. # Trojan 配置
  8. config = {
  9. "server": "lbso.bnnodeservice.com", # 目标服务器地址
  10. "port": 443, # 目标服务器端口
  11. "sni": "cert.bitbyte.one", # SNI 伪装域名
  12. "password": "f2e8e50c-ffb8-48a1-a460-2e72dfaf7845", # 密码
  13. "local_address": "127.0.0.1", # 本地监听地址
  14. "local_port": 1080, # 本地监听端口
  15. }
  16. # 创建 QUIC 配置
  17. quic_config = QuicConfiguration(is_client=True, alpn_protocols=["h3"], max_datagram_frame_size=65536)
  18. quic_config.verify_mode = ssl.CERT_NONE # 禁用证书验证
  19. quic_config.server_name = config["sni"] # 设置 SNI
  20. # 创建 QUIC 连接
  21. class TrojanClientProtocol(QuicConnectionProtocol):
  22. def __init__(self):
  23. super().__init__()
  24. self.writer = None
  25. def connection_established(self, quic):
  26. self.quic = quic
  27. def quic_event_received(self, event):
  28. if isinstance(event, StreamDataReceived):
  29. if self.writer:
  30. self.writer.write(event.data)
  31. self.writer.drain()
  32. elif isinstance(event, ConnectionTerminated):
  33. if self.writer:
  34. self.writer.close()
  35. # 处理客户端请求
  36. async def handle_client(reader, writer):
  37. protocol = TrojanClientProtocol()
  38. protocol.writer = writer
  39. # 创建到目标服务器的 QUIC 连接
  40. async with connect(
  41. config["server"],
  42. config["port"],
  43. configuration=quic_config,
  44. create_protocol=lambda: protocol,
  45. ) as quic_connection:
  46. # 发送密码
  47. quic_connection.send_stream_data(0, config["password"].encode() + b"\r\n")
  48. # 处理客户端请求
  49. async def client_to_server():
  50. try:
  51. while True:
  52. data = await reader.read(4096)
  53. if not data:
  54. break
  55. quic_connection.send_stream_data(0, data)
  56. except Exception as e:
  57. print(f"Client to server error: {e}")
  58. finally:
  59. quic_connection.close()
  60. # 处理服务器响应
  61. async def server_to_client():
  62. try:
  63. while True:
  64. event = quic_connection.next_event()
  65. if isinstance(event, StreamDataReceived):
  66. writer.write(event.data)
  67. await writer.drain()
  68. elif isinstance(event, ConnectionTerminated):
  69. break
  70. except Exception as e:
  71. print(f"Server to client error: {e}")
  72. finally:
  73. writer.close()
  74. # 启动两个任务
  75. await asyncio.gather(client_to_server(), server_to_client())
  76. # 关闭连接
  77. writer.close()
  78. # 启动本地代理服务器
  79. async def start_proxy():
  80. server = await asyncio.start_server(handle_client, config["local_address"], config["local_port"])
  81. print(f"代理服务器已启动,监听地址:{config['local_address']}:{config['local_port']}")
  82. async with server:
  83. await server.serve_forever()
  84. # 运行代理服务器
  85. if __name__ == "__main__":
  86. asyncio.run(start_proxy())