配置IPv6端口转发到IPv4,代理服务器程序,解决程序不支持IPv6

怎么配置IPv6的ddns我这里就不多说了,能看这篇文章肯定是因为已经配置好了,但是在实际中遇到了一些问题,这里只先提配置中我遇到的一个问题:一定要去光猫的设置(通常浏览器访问192.168.1.1)里面关闭这个Ipv6Spi防火墙,不然你只能在你的内网里面访问你的IPv6地址(还不如我们的192.168.*.*)

好了,接下来是我要讲的内容,把ddns配置好了以后,你可能会发现:phpstudy搭建的网站不能公网访问,这个可以去修改配置文件,把Apache或者Nginx里面的端口监听改一下,配置文件的地址分别为phpstudy_pro\Extensions\Apache2.4.39\conf\vhosts\  和 phpstudy_pro\Extensions\Nginx1.15.11\conf\vhosts,用的哪个就修改哪个的,也可以都修改,

listen      80;

修改为以下类型的就可以了

listen      [::]:80;

但是像这样直接修改了会导致IPv4又无法访问了,可以直接加一行,不修改原来的,

listen      80;
listen      [::]:80;

但是有些程序不能手动修改配置文件怎么办?

例如这个(具体是什么我就不说了),不能手动修改监听端口,当我尝试直接把端口改为这个时

提示只能输入数字

 

那怎么办,没事,还好我有练习时长。。。反正很长的技术,第一时间想到的是端口转发,网上搜索之后发现普遍使用的是Windows自带的netsh里面的一个模块,但是那个会造成端口占用(也可能是我的问题),导致我想要的程序无法监听,在几次尝试和失败后,我沉默了...诶!😇☝️还可以使用代理服务器,然后抄起屎山代码的技术,写了这个代理程序(不要问为什么里面打印信息都是英文,因为我喜欢)

import socket
import threading

def handle_client(client_socket, target_host, target_port):
    target_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    target_socket.connect((target_host, target_port))

    try:
        # 使用线程来转发数据,防止连接断开后代理关闭
        threading.Thread(target=transfer_data, args=(client_socket, target_socket)).start()
        threading.Thread(target=transfer_data, args=(target_socket, client_socket)).start()
    except Exception as e:
        print(f"An error occurred: {e}")
        client_socket.close()
        target_socket.close()

def transfer_data(src, dest):
    while True:
        data = src.recv(4096)
        if not data:
            break
        dest.sendall(data)

def start_server(ipv6_host, ipv6_port, ipv4_host, ipv4_port):
    server_socket = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server_socket.bind((ipv6_host, ipv6_port))
    server_socket.listen(5)
    print(f"Server is listening on [{ipv6_host}]:{ipv6_port}")

    try:
        while True:
            client_socket, client_addr = server_socket.accept()
            print(f"Accepted connection from {client_addr}")
            # 创建线程来处理客户端连接
            threading.Thread(target=handle_client, args=(client_socket, ipv4_host, ipv4_port)).start()
    except KeyboardInterrupt:
        print("Server is shutting down.")
    finally:
        server_socket.close()

if __name__ == "__main__":
    ipv6_host = '::'  # 监听所有 IPv6 地址,通常无需修改
    ipv6_port = 5215   #需要转发的 IPv6 端口,按需修改
    ipv4_host = '127.0.0.1'  # 本地 IPv4 地址,通常无需修改
    ipv4_port = 7777   #转发到的 IPv4 端口,按需修改
    start_server(ipv6_host, ipv6_port, ipv4_host, ipv4_port)

将最后这几行的转发信息按需修改一下,运行,就可以开始转发了,挂在一边就可以不用管了,但是注意,他会主动开放并占用一个IPv6端口也就是44行配置的,在客户端需要修改为一样的,但是不会占用IPv4端口,然后你的服务端监听端口就是46行的ipv4_port,

例如在phpstudy上搭建了一个网站,未做任何配置修改的情况下,本地地址为192.168.1.100:7777,然后修改我这份python代码,把44行的端口随便修改一个(自己喜欢就好),我就默认的这里5215,然后你看看你ddns域名,如example.me,那么添加IPv6端口在后面像这样example.me:5215,就可以公网访问了

 

 

 

 

IPv4是当前使用最广泛的互联网协议版本,但是由于IPv4地址资源有限,不足以满足日益增长的互联网用户需求,因此IPv6作为下一代互联网协议被广泛推广。IPv6IPv4不兼容,所以在将IPv6网络IPv4网络连接时,需要通过端口映射来实现。 IPv6IPv4端口映射主要有两种方式,一种是通过NAT64实现,另一种是通过代理服务器实现。NAT64是一种网络地址换技术,将IPv6网络的数据包换为IPv4网络的数据包。在这种情况下,IPv6地址被映射到IPv4地址,IPv6端口则被映射到IPv4端口。当从IPv6网络发送数据包到IPv4网络时,NAT64将根据预设的映射规则进行数据包的换与转发,确保数据包能够顺利到达IPv4网络。 另一种方式是通过代理服务器实现IPv6IPv4端口映射。代理服务器作为一个中站,接收来自IPv6网络的数据包,并将其转发IPv4网络。在这种情况下,IPv6地址和端口信息被代理服务器IPv4地址和端口来代替,并通过代理服务器IPv4网络进行数据交互。 不论是通过NAT64还是代理服务器IPv6IPv4端口映射都是为了实现IPv6网络IPv4网络的互通。通过端口映射,IPv6用户可以访问IPv4资源,同时IPv4用户也可以访问IPv6资源,实现互联网的无缝连接。,从而更好地满足了互联网用户的需求。随着IPv6的推广和普及,IPv6IPv4端口映射技术将会越来越重要和广泛应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值