复活老游戏,让IPv6成为IPv4的桥

nginx虽然高性能,但是配置麻烦

没有公网IP地址使得很多老游戏根本没办法进行联机,但是又不想买 腾讯云/阿里云/华为云,而且通过上面的nginx转发性能也有损耗。

直接从公网上访问IPv4:端口号不太现实,因为运营商的NAT

所以想到用  IPv4-IPv6-IPv4 即IPv6充当两个IPv4服务器的桥梁。

于是在AI的帮助下,写了一套IPv4-IPv6-IPv4的程序,这里的协议是TCP

这样就可以转发1.7.2这样老版本的minecraft服务器的流量了

#服务器需要修改端口号,将其修改为游戏服务器的端口号

import socket
import select
import threading


def handle_client(client_socket):
    print("正在连接")
    try:
        # 连接到目标服务器
        with socket.create_connection((TARGET_HOST, TARGET_PORT)) as target_socket:
            # 使用 select 来监听两个 socket 的可读性
            inputs = [client_socket, target_socket]
            while inputs:
                readable, _, _ = select.select(inputs, [], [])
                for s in readable:
                    data = s.recv(4096)
                    if s is client_socket:
                        # 从客户端接收数据,并发送到目标服务器
                        if data:
                            target_socket.sendall(data)
                        else:
                            # 客户端关闭了连接
                            inputs.remove(s)
                            target_socket.close()
                            break
                    else:
                        # 从目标服务器接收数据,并发送到客户端
                        if data:
                            client_socket.sendall(data)
                        else:
                            # 目标服务器关闭了连接
                            inputs.remove(s)
                            client_socket.close()
                            break
    finally:
        client_socket.close()


def TCPlink():
    # 创建一个 TCP 套接字并绑定到代理服务器的地址和端口
    with socket.socket(socket.AF_INET6, socket.SOCK_STREAM) as server_socket:
        server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        server_socket.bind((IP, port))
        server_socket.listen(5)

        print(f"Proxy listening on {IP}:{port}")

        while True:
            client_socket, client_address = server_socket.accept()
            print(f"Accepted connection from {client_address}")
            # 为每个客户端连接创建一个新线程
            client_thread = threading.Thread(target=handle_client, args=(client_socket,))
            client_thread.start()
#这里是服务器
if __name__ == "__main__":
    IP = '::'                    # IPv6转发
    port = 43325                 # 转发端口
    TARGET_HOST = '127.0.0.1'    # 本地换回接口
    TARGET_PORT = 64871          # 假设 Minecraft 服务器运行在这个端口
    TCPlink()

#客户端需要更改不同IPv6,将其修改为服务器的IPv6值

import socket
import select
import threading


def handle_client(client_socket):
    print("正在连接")
    try:
        # 连接到目标服务器
        with socket.create_connection((TARGET_HOST, TARGET_PORT)) as target_socket:
            message = f"{IP}:{port}".encode('utf-8')
            client_socket.sendall(message)
            # 使用 select 来监听两个 socket 的可读性
            inputs = [client_socket, target_socket]
            while inputs:
                readable, _, _ = select.select(inputs, [], [])
                for s in readable:
                    data = s.recv(4096)
                    if s is client_socket:
                        # 从客户端接收数据,并发送到目标服务器
                        if data:
                            target_socket.sendall(data)
                        else:
                            # 客户端关闭了连接
                            inputs.remove(s)
                            target_socket.close()
                            break
                    else:
                        # 从目标服务器接收数据,并发送到客户端
                        if data:
                            client_socket.sendall(data)
                        else:
                            # 目标服务器关闭了连接
                            inputs.remove(s)
                            client_socket.close()
                            break
    finally:
        client_socket.close()


def TCPlink():
    # 创建一个 TCP 套接字并绑定到代理服务器的地址和端口
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_socket:
        server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        server_socket.bind((IP, port))
        server_socket.listen(5)
        print(f"Proxy listening on {IP}:{port}")
        while True:
            client_socket, client_address = server_socket.accept()
            print(f"Accepted connection from {client_address}")
            # 为每个客户端连接创建一个新线程
            client_thread = threading.Thread(target=handle_client, args=(client_socket,))
            client_thread.start()
#客户端的配置应该与服务器相反
if __name__ == "__main__":
    IP = '127.0.0.1'                                        # 客户端的换回接口(你爱连啥都可以)
    port = 46666                                            # 客户端的转发端口(你进游戏要用的)
    TARGET_HOST = 'ffff:ffff::0'   # 服务器的IP
    TARGET_PORT = 43325                                     # 服务器的转发端口
    TCPlink()

 虽然主体仍然是AI帮写的,但是修改起来也不是那么轻松

后续可能会再升级,现在的状态还不够方便,这个是项目地址:

IPv6桥: 老旧的游戏无法支持IPv6,仅支持IPv4。但是IPv4地址枯竭,所以想到用Python: 服务器:[IPv4->IPv6]-IPv6公网-[IPv6->IPv4]:客户端 转发游戏TCP流量 (gitee.com)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值