使用IPv6公网进行MC联机
本文最后更新于4 天前,其中的信息可能已经过时,如有错误请发送邮件到yokaicraft@foxmail.com

互联网协议第6版(英语:Internet Protocol version 6,缩写:IPv6)是互联网协议的最新版本。
使用它进行联机主要是为了解决IPv4地址枯竭问题,同时它也在其他方面对于IPv4有许多改进。
IPv6地址共有128位,即一共有2^128个地址(约3.4×10^38个),数量远多于IPv4地址的2^32个(约42亿个),因此可以让世界上的每一台互联网设备都能拥有公网地址

一、验证是否拥有ipv6

点击IPv6 测试

显示如下则表明拥有ipv6(测试为9影响不大)

恭喜你的网络支持ipv6访问!如果测试显示不通过,有可能是ipv6网络没有开启。

在计算机上开启IPv6

以Windows为例:

  1. 在搜索栏里搜索“控制面板”。
  2. 依次点击:网络和 Internet→网络和共享中心→(“连接”字样右侧的链接)→属性。
  3. 确保“Internet 协议版本 6 (TCP/IPv6)”选项已勾选。

接下你拥有ipv6了,并且知道了ipv6的地址,但是你现在并不能直接联机。你需要关闭你的防火墙或放行游戏设置的端口(游戏应该会在第一次启动的时候请求通过防火墙,所以一般情况下不用设置。如果好友无法连接至你,且含有“Connection refused”字样,你可能就需要进行这些设置。)

二、利用手机热点移动网络的ipv6进行联机

利用手机热点联机不需要配置路由器的防火墙,如果你使用的是宽带wifi请跳过这个往下看

请确保你已经拥有了ipv6访问,并且你的好友也支持ipv6。

接下来你只需要将刚才检测到的ipv6地址发给你的好友,好友在服务器地址中应在地址两侧加上方括号,就像这样:[xxxx::xxxx]:<端口>注:默认25565端口可以直接输入ipv6地址进入不需要加方括号。

三、家庭带宽IPv6联机

这个比较麻烦,为什么呢。并不是因为没有ipv6公网,而是因为光猫防火墙阻拦了入站流量。

——以电信网络为例——

1、修改光猫开启桥接和IPv6设置

首先你需要获取光猫的超级管理员账号,这个需要你问客服或带宽师傅要(具体请自行搜索)

打开浏览器输入地址:http://192.168.1.1进入电信光猫后台,输入你获取到的管理员账户和密码。

看到这个页面则证明进入到了管理后台

点击网络,会看到 网络连接 页面。

连接名称 选择 3_INTERNET_R_VID_41连接模式 选择 桥接IP模式为 IPv4&IPv6。点击 保存/应用,大约等待 10s 会生效。

此外,如果你 忘记了 PPPoE 拨号的账号密码,也可以在这个页面查看,把 连接模式 选择为 PPPoE,可以查看曾经保存的账号密码,密码看不到的话,用 Chrome 的审查模式,右键密码的输入框,在下图中将 password 删除,这样就能查看拨号密码了。

接下来,在 状态 菜单中,可以看到 IPv4 和 IPv6 已经开启成功。

光猫设置好了,接下来设置路由器。(一般宽带师傅图省事都是将光猫设置为路由模式,而我们改为了桥接模式,这样就将网络权交给了路由器,需要在路由器重新设置拨号上网)进入你的路由器管理页面,具体请自行搜索路由器型号的地址,在上网设置中,上网方式 选择 PPPoE,填写宽带拨号账号密码。(如果不记得,可以在光猫后台找到,或者电话客服。)

配置成功连上网后,在路由器放行你的游戏端口。ps:以上来自网络并非本人实测

个人带宽获取ipv6的访问难点主要是光猫超级管理员账号,只要你获取到账号那么问题都会迎刃而解。

四、配置ddns域名解析

我们获取到的ipv6网络地址都是动态的,而且ipv6网络地址又长又不好记,使用ddns解析后可以动态绑定ipv6地址,达到固定ip访问。

首先注册一个域名,你可以在腾讯云或阿里云等大厂注册,但是这类注册价格都比较贵。正好宝塔推出的域名注册活动,新人低至9.9首年

点击注册宝塔

如果你在其它平台注册了域名,列如宝塔。可以将他接入腾讯云dns以方便我们管理解析。

1.接入域名(如果在腾讯云买的域名请跳过)

进入到腾讯云DNSPod,输入你注册的域名并添加

复制这两个DNS地址,到你的域名注册平台。

在管理域名中修改DNS改为腾讯云的DNS,改完成功后需要等待完成解析。

解析成功就会显示正常。

2.打开并登录控制台-API密钥

(一)、选择腾讯云API密钥,点击创建密钥,这里可能会进行安全验证,按照提示验证即可。

(二)、记录密钥ID及Token

(三)、对于使用手机热点使用ipv6可以使用py脚本自动更新ipv6解析,附上我自用的python程序

一个用于电脑自动更新ipv6的ddns程序请去GitHub查看如何使用

Python
# -*- coding: utf-8 -*-
"""
动态DNS更新脚本 - 适用于IPv6地址
"""
import json
import sys
import socket
import psutil
import configparser
import os

from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
from tencentcloud.dnspod.v20210323 import dnspod_client, models

# 配置文件路径
CONFIG_FILE = "config.ini"

class DDNSConfig:
    """配置管理类"""
    
    def __init__(self, config_file=CONFIG_FILE):
        self.config = configparser.ConfigParser()
        self.config_file = config_file
        self.load_config()
    
    def load_config(self):
        """加载配置文件"""
        if not os.path.exists(self.config_file):
            print(f"错误: 配置文件 '{self.config_file}' 不存在。")
            print("请复制 'config.ini.example' 为 'config.ini' 并填入您的配置信息。")
            sys.exit(1)
        
        try:
            self.config.read(self.config_file, encoding='utf-8')
        except Exception as e:
            print(f"错误: 读取配置文件失败: {e}")
            sys.exit(1)
    
    def get_tencent_credentials(self):
        """获取腾讯云凭证"""
        try:
            secret_id = self.config.get('tencent_cloud', 'secret_id')
            secret_key = self.config.get('tencent_cloud', 'secret_key')
            
            if secret_id == "您的SecretId" or secret_key == "您的SecretKey":
                print("错误: 请在配置文件中设置正确的腾讯云 API 密钥。")
                return None, None
            
            return secret_id, secret_key
        except Exception as e:
            print(f"错误: 读取腾讯云凭证失败: {e}")
            return None, None
    
    def get_dns_config(self):
        """获取DNS配置"""
        try:
            domain = self.config.get('dns_config', 'domain')
            sub_domain = self.config.get('dns_config', 'sub_domain')
            return domain, sub_domain
        except Exception as e:
            print(f"错误: 读取DNS配置失败: {e}")
            return None, None
    
    def get_cache_file(self):
        """获取缓存文件路径"""
        try:
            return self.config.get('settings', 'cache_file', fallback='last_ipv6.txt')
        except Exception as e:
            print(f"警告: 读取缓存文件配置失败,使用默认值: {e}")
            return 'last_ipv6.txt'


def is_public_ipv6(ip_str):
    """判断一个IPv6地址是否是公网地址 (Global Unicast Address)"""
    if not ip_str or not isinstance(ip_str, str):
        return False
    try:
        addr = socket.inet_pton(socket.AF_INET6, ip_str)
        return not (addr.startswith(b'\xfe\x80') or addr == b'\x00'*15 + b'\x01' or 
                   addr.startswith(b'\xfc') or addr.startswith(b'\xfd'))
    except socket.error:
        return False


def get_local_public_ipv6():
    """从本机网络接口获取公网IPv6地址"""
    print("正在从本地网络接口扫描公网IPv6地址...")
    try:
        all_addrs = psutil.net_if_addrs()
        for interface_name, addrs in all_addrs.items():
            for addr in addrs:
                if addr.family == socket.AF_INET6:
                    ipv6_address = addr.address.split('%')[0]
                    if is_public_ipv6(ipv6_address):
                        print(f"在接口 '{interface_name}' 找到一个公网IPv6地址: {ipv6_address}")
                        return ipv6_address
        print("错误: 未能在任何网络接口上找到有效的公网IPv6地址。", file=sys.stderr)
        return None
    except Exception as e:
        print(f"错误: 扫描本地网络接口时发生异常: {e}", file=sys.stderr)
        return None


def main():
    """主函数"""
    # 加载配置
    config = DDNSConfig()
    
    # 获取配置信息
    secret_id, secret_key = config.get_tencent_credentials()
    if not secret_id or not secret_key:
        return
    
    domain, sub_domain = config.get_dns_config()
    if not domain or not sub_domain:
        return
    
    cache_file = config.get_cache_file()
    
    print(f"配置信息: 域名={sub_domain}.{domain}, 缓存文件={cache_file}")
    
    # 1. 从本地获取当前的公网IPv6地址
    current_ipv6 = get_local_public_ipv6()
    if not current_ipv6:
        return

    # 2. 从缓存文件读取上一次的IP地址
    last_ipv6 = None
    try:
        with open(cache_file, 'r') as f:
            last_ipv6 = f.read().strip()
    except FileNotFoundError:
        print("未找到IP缓存文件,将首次运行并创建。")
    except Exception as e:
        print(f"警告: 读取IP缓存文件时出错: {e}")

    if current_ipv6 == last_ipv6:
        print(f"本地IP地址 ({current_ipv6}) 未发生变化,无需更新。")
        return
    
    print(f"IP地址已变更: 旧IP={last_ipv6}, 新IP={current_ipv6}。准备更新DNS记录。")

    try:
        # 实例化客户端
        cred = credential.Credential(secret_id, secret_key)
        http_profile = HttpProfile(endpoint="dnspod.tencentcloudapi.com")
        client_profile = ClientProfile(httpProfile=http_profile)
        client = dnspod_client.DnspodClient(cred, "", client_profile)

        # 3. 查询解析记录列表
        print(f"正在查询域名 '{sub_domain}.{domain}' 的解析记录...")
        req_list = models.DescribeRecordListRequest()
        req_list.from_json_string(json.dumps({"Domain": domain, "Subdomain": sub_domain, "RecordType": "AAAA"}))
        resp_list = client.DescribeRecordList(req_list)
        records = resp_list.RecordList

        record_id = None
        dns_ip = None
        if records:
            record = records[0]
            record_id = record.RecordId
            dns_ip = record.Value
            print(f"找到现有解析记录: ID={record_id}, IP={dns_ip}")

        # 4. 检查云端IP与当前IP是否一致
        if dns_ip == current_ipv6:
            print("云端DNS记录已是最新IP,无需更新。正在更新本地缓存...")
            with open(cache_file, 'w') as f:
                f.write(current_ipv6)
            print("本地IP缓存已更新。")
            return

        # 5. 更新或创建记录
        if record_id:
            print(f"IP地址不一致,准备将记录更新为: {current_ipv6}")
            req_modify = models.ModifyRecordRequest()
            req_modify.from_json_string(json.dumps({
                "Domain": domain, "RecordId": record_id, "SubDomain": sub_domain,
                "RecordType": "AAAA", "RecordLine": "默认", "Value": current_ipv6
            }))
            client.ModifyRecord(req_modify)
            print("成功: 域名解析记录已更新!")
        else:
            print(f"未找到AAAA记录,准备创建新记录,IP地址为: {current_ipv6}")
            req_create = models.CreateRecordRequest()
            req_create.from_json_string(json.dumps({
                "Domain": domain, "SubDomain": sub_domain, "RecordType": "AAAA",
                "RecordLine": "默认", "Value": current_ipv6,
            }))
            client.CreateRecord(req_create)
            print("成功: 新的域名解析记录已创建!")

        # 6. 更新本地缓存
        with open(cache_file, 'w') as f:
            f.write(current_ipv6)
        print("本地IP缓存已成功更新。")

    except TencentCloudSDKException as err:
        print(f"腾讯云 API 操作失败: {err}", file=sys.stderr)


if __name__ == "__main__":
    main()

3.路由器设置ddns

可能老旧的路由器不支持ddns,具体支持情况请自行查询

未完待续。。。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇