文章目录
- 域名配置
- 域名更新
- frp配置修改
在成功完成frp改造Windows笔记本实现家庭版免费内网穿透之后,某天我突然发现内网穿透失效了,一番排查之后原来是路由器对应的公网IP更换了。果然我分到的并不是固定的公网IP,而是会定期变化的。为了免受定期在配置文件中更换IP之苦,我决定将变化的IP与固定的域名绑定,过上懒人该过的快乐躺平生活。
DDNS(Dynamic DNS,动态DNS)是一种网络服务,它允许您将静态域名(如example.com)绑定到动态IP地址。动态IP地址通常是指从互联网服务提供商(ISP)获得的IP地址,这些地址可能会在用户每次连接到互联网时发生变化。
DDNS服务的核心功能是跟踪用户IP地址的变化,并在IP地址发生变化时自动更新域名解析记录,确保域名始终指向当前的IP地址。这样,即使用户的IP地址发生变化,其他网络用户仍然可以通过静态域名访问到用户的服务或设备。
域名配置
进入阿里云一元域名购买页,搜索合适的域名并斥巨资一元购买,接下来一年你就拥有了一个可用的IP。
然后准备好身份证,按照指引完成实名认证。
进入解析设置页,将域名与当前的IP绑定,虽然生效时间写着十分钟,不过实测是立即生效的。
域名更新
首先在Windows下的Python3环境中装这几个包:
pip3 install aliyun-python-sdk-core-v3 --user
pip3 install aliyun-python-sdk-domain --user
pip3 install aliyun-python-sdk-alidns --user
根据创建AccessKey教程,按如下步骤创建RAM用户的AccessKey:
添加权限:
复制AccessKey ID和AccessKey Secret或直接导出CSV文件
查看API使用文档:
编写如下代码更新dns:
import warnings
warnings.filterwarnings('ignore')
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.request import CommonRequest
from aliyunsdkcore.auth.credentials import AccessKeyCredential
import json
from urllib.request import urlopen
class DnsUpdater:
def __init__(self):
accessKeyId = "***"
accessSecret = "***"
credentials = AccessKeyCredential(access_key_id=accessKeyId, access_key_secret=accessSecret)
self.client = AcsClient(region_id='cn-hangzhou', credential=credentials)
self.domain = "***"
self.myip = self.get_ip()
def get_ip(self):
ip = urlopen('https://api-ipv4.ip.sb/ip').read()
ipv4 = str(ip, encoding='utf-8').strip()
print("\n本机当前IP为:", ipv4)
return ipv4
def DescribeDomainRecords(self):
request = CommonRequest()
request.set_accept_format('json')
request.set_domain('alidns.cn-hangzhou.aliyuncs.com')
request.set_method('POST')
request.set_protocol_type('https')
request.set_version('2015-01-09')
request.set_action_name('DescribeDomainRecords')
request.add_query_param('DomainName', self.domain)
response = self.client.do_action(request)
data = json.loads(response.decode('utf-8'))
order = 1
for item in data["DomainRecords"]["Record"]:
print("域名"+str(order)+":", item["DomainName"])
print("IP"+str(order)+":", item["Value"])
order += 1
if item["DomainName"] == self.domain:
self.RecordId = item["RecordId"]
self.RR = item["RR"]
self.Type = item["Type"]
self.RecordIp = item["Value"]
def UpdateDomainRecord(self):
request = CommonRequest()
request.set_accept_format('json')
request.set_domain('alidns.cn-hangzhou.aliyuncs.com')
request.set_method('POST')
request.set_protocol_type('https')
request.set_version('2015-01-09')
request.set_action_name('UpdateDomainRecord')
request.add_query_param('RecordId', self.RecordId)
request.add_query_param('RR', self.RR)
request.add_query_param('Type', self.Type)
request.add_query_param('Value', self.myip)
response = self.client.do_action(request)
print(str(response, encoding = 'utf-8'))
def QueryDSRecord(self):
request = CommonRequest()
request.set_accept_format('json')
request.set_domain('domain.aliyuncs.com')
request.set_method('POST')
request.set_protocol_type('https')
request.set_version('2018-01-29')
request.set_action_name('QueryDSRecord')
request.add_query_param('DomainName', self.domain)
response = self.client.do_action(request)
print(str(response, encoding = 'utf-8'))
if __name__ == '__main__':
dnsupdater = DnsUpdater()
dnsupdater.DescribeDomainRecords()
if dnsupdater.myip != dnsupdater.RecordIp:
print("主机IP与公网IP不一致,进入更新模式")
print(dnsupdater.myip)
print(dnsupdater.RecordIp)
dnsupdater.UpdateDomainRecord()
frp配置修改
将服务器端的start.bat
修改如下
@echo off
:home
python3 updateDNS.py
frps -c frps.toml
goto home
最后将客户端的toml中文件的IP地址设置为域名