通过IPV6+DDNS实现路由器远程管理和Win远程桌面控制

前期需要的准备:

软路由,什么系统都可以,要支持IPV6,能够自动添加解析
光猫的管理员账号,能够进入光猫修改配置,拨号上网账号
域名账号和DNS服务

主要步骤:

利用管理员账号,进入光猫,新增一个Internet配置,绑定千兆网口,比如Lan1,然后记录原本上网配置里的VLAN ID,新建的配置也要设置这个Tag,IP协议版本选择V4/V6后,选择桥接保存就可以了,光猫就设置好了,但目前还不能上网,需要记录一下拨号账号和密码。
进入路由器界面,此时路由器应该连着刚才绑定的LAN1口,这里要设置PPPoE拨号上网模式,输入账号与密码,然后就可以上网了。
打开IPV6功能,选择NativeDHCPv6,WAN0(PPPoE),Stateless:RA,自动获取DNS,打开内网DHCPv6, 路由器通告,启用服务器选择Stateless。
保存后应该可以看到路由器多了ipv6 WAN和ipv6 LAN,其中WAN是可以直接外网访问的,而LAN网络里的ipv6地址目前应该还不能直接访问,这里主要原因是防火墙设置不对,包括电脑防火墙、路由器防火墙和光猫防火墙,可以直接关掉测试。然后根据服务判断端口是不是打开了in和out。
防火墙问题解决后,就意味着可以通过公网直接访问你的所有ipv6地址,现在我们要做的就是将这个地址,解析绑定我们的域名,这里我用的是腾讯云,你可以将路由器管理界面的地址设置成router.xxx.com.也可以将LAN网络里的主机地址设置为Computer.xxx.com.这样就可以直接通过域名访问ipv6地址了
目前的ipv6地址是动态的,所以,域名解析也要不断更新,这个时候就需要一个程序,专门按时更新域名指向的ipv6地址.在软路由上,应该可以找到类似的功能,只需要你申请对应的API接口就行,输入你的域名和二级域名,ID和KEY,就能自动更新路由器的WAN地址到你的router.xxx.com
主机的话,需要写一个简单的脚本来实现,我是直接搭了Python3的环境,写了一个py脚本,然后windows设置计划执行就可以,具体的脚本如下,主要功能就是得到当前主机的ipv6地址,然后将其通过腾讯云API接口上传更改。
python 复制代码
import json
import requests
import subprocess
import re
import time
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

def ReturnRecordId(Domain, SubDomain):
    """
    获取指定记录的RecordId
    :param Domain: 主域名
    :param SubDomain: 待修改的子域
    :return: RecordId 或错误码
    """
    try:
        cred = credential.Credential(SecretId, SecretKey)  # 凭证
        httpProfile = HttpProfile()
        httpProfile.endpoint = "dnspod.tencentcloudapi.com"

        clientProfile = ClientProfile()
        clientProfile.httpProfile = httpProfile
        client = dnspod_client.DnspodClient(cred, "", clientProfile)

        req = models.DescribeRecordListRequest()
        params = {"Domain": Domain}
        req.from_json_string(json.dumps(params))

        resp = client.DescribeRecordList(req)
        for record in resp.RecordList:
            if record.Name == SubDomain:
                return record.RecordId
        
        # print("未找到对应的记录值,请先创建相应的主机记录!")
        return -2

    except TencentCloudSDKException:
        # print("获取域名的记录列表失败,请重试!")
        return -1

def ModifyDynamicDNS(RecordId, Domain, SubDomain, Ip):
    """
    动态域名解析API
    :param RecordId: 待修改记录ID
    :param Domain: 主域名
    :param SubDomain: 子域名
    :param Ip: IP地址
    :return: 操作成功返回1,否则返回0
    """
    try:
        cred = credential.Credential(SecretId, SecretKey)
        httpProfile = HttpProfile()
        httpProfile.endpoint = "dnspod.tencentcloudapi.com"

        clientProfile = ClientProfile()
        clientProfile.httpProfile = httpProfile
        client = dnspod_client.DnspodClient(cred, "", clientProfile)

        req = models.ModifyDynamicDNSRequest()
        params = {
            "Domain": Domain,
            "SubDomain": SubDomain,
            "RecordId": RecordId,
            "RecordLine": "默认",
            "Value": Ip
        }
        req.from_json_string(json.dumps(params))

        resp = client.ModifyDynamicDNS(req)
        # if str(RecordId) in resp.to_json_string():
        #     print("更新成功!")
        return 1

    except TencentCloudSDKException:
        return 0

def get_global_ipv6_address():
    # 适用于Windows的命令
    command = "ipconfig"
    process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, shell=True)
    stdout, stderr = process.communicate()
    # 解析ipconfig输出查找IPv6地址
    ipv6_addresses = re.findall(r"IPv6 地址 . . . . . . . . . . . . : ([\da-fA-F:]+)", stdout)
    # 过滤掉本地链接地址
    global_ipv6_addresses = [addr for addr in ipv6_addresses if not addr.startswith("fe80:")]
    return global_ipv6_addresses[0]

if __name__ == "__main__":
    SecretId = "xxx"  # 腾讯云账户API密钥ID
    SecretKey = "xxx"  # 腾讯云账户API密钥Key
    Domain = "xxx.xxx"  # 主域名
    SubDomain = "xxx"  # 指定要修改的子域名
    interval = 600  # 每10分钟检查一次IP

    RecordId = ReturnRecordId(Domain=Domain, SubDomain=SubDomain)
    if RecordId < 0:
        exit()

    CurrentIP = get_global_ipv6_address()
    res = ModifyDynamicDNS(RecordId=RecordId, Domain=Domain, SubDomain=SubDomain, Ip=CurrentIP)
    # if res:
    #     print(f'IP成功更新!IPV6:{CurrentIP}')
    # else:
    #     print('动态域名解析API出问题了')
相关推荐
codigger30 分钟前
负载均衡到底在干嘛?7 个场景给你说明白
网络·架构·负载均衡
吴建旭 智宅焕12 小时前
智能家居全国交付中执行端能力跃迁的架构设计:从标准装调到交付专家的系统化路径
网络·网络协议·智能家居
Eyfcom14 小时前
〖全球化架构 05〗跨国网络专线优化:QUIC 协议与 SD-WAN 在跨境传输中的实战
网络·架构·跨境物流快递系统·全球化架构
Dream Cosmos16 小时前
传输层协议之UDP
网络·网络协议·udp
鸿蒙开发爱好者19 小时前
下班后做的小工具和小游戏,我把它们整理成了 WyanHub
网络·人工智能·职场和发展·个人开发
乐橙开放平台19 小时前
海康和大华摄像头能统一管理吗?可以通过 GB28181 或视频融合平台接入
网络·后端·物联网·音视频
张小姐的猫21 小时前
【基于 WebSocket 的多用户网页五子棋】—— 项目结构设计与实用工具类模块
网络·websocket·网络协议
QXWZ_IA1 天前
测绘单位采购RTK:设备价格、账号年费、售后,用时间轴分权重
网络·人工智能·安全
IT大白鼠1 天前
GitLab 未认证 RCE 应急实战CVE-2026-97229(CVSS 10.0)
网络·安全·gitlab
陈希1231 天前
Linux 网络诊断工具实战:ping、curl、tcpdump、mtr、dig 用法详解
linux·网络·tcpdump