互联网协议第6版(英语:Internet Protocol version 6,缩写:IPv6)是互联网协议的最新版本。
使用它进行联机主要是为了解决IPv4地址枯竭问题,同时它也在其他方面对于IPv4有许多改进。
IPv6地址共有128位,即一共有2^128个地址(约3.4×10^38个),数量远多于IPv4地址的2^32个(约42亿个),因此可以让世界上的每一台互联网设备都能拥有公网地址。
一、验证是否拥有ipv6
显示如下则表明拥有ipv6(测试为9影响不大)
恭喜你的网络支持ipv6访问!如果测试显示不通过,有可能是ipv6网络没有开启。
在计算机上开启IPv6
以Windows为例:
- 在搜索栏里搜索“控制面板”。
- 依次点击:网络和 Internet→网络和共享中心→(“连接”字样右侧的链接)→属性。
- 确保“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,具体支持情况请自行查询
未完待续。。。