购买了 AWS Lightsail 的 VPS 后,使用了一段时间,发现偶尔会出现 IP 不可访问的情况,参考 AWS 的开发文档,用 Python 写了一个更换 IP 的脚本。
同时参考了 Cloudflare API,在更换了 IP 之后,把域名对应的记录也更新一下。
开始使用脚本之前,需要准备一些必要的信息,以下脚本已提供符合格式的假数据,可参考替换。
将密钥信息明文存储在脚本内是非常危险的行为!
AWS
在 IAM 管理面板创建用户,附加策略,添加操作 Lightsail 的最小权限,以下是示例的 json 数据:
1 | { |
然后在用户的安全凭证中,生成访问密钥,用于脚本中的 access_key_id
和 secret_access_key
。
在 Amazon Lightsail 实例中,记录以下信息:vps_name
:实例名字region
:实例所在的区域名ip_name
:附加到实例中静态 IP 的名字,脚本会先释放掉这个 IP,然后重新创建同名的 IP 后附加到实例
参考:Creating an IAM user in your AWS account
Cloudflare
获取 API 令牌:
生成 API 令牌,权限选择允许编辑 DNS,令牌用于脚本中的Authorization
。获取域名区域 ID:
在 Cloudflare 管理面板中,找到域名,右侧的 API 栏里的区域 ID,用于脚本中的zone_uuid
。获取域名记录 ID:
将上面获取到的Authorization
和zone_uuid
填入以下 shell 脚本,运行后找到域名记录对应的 id,用于脚本中的ipv4_id
和ipv6_id
。1
2
3
4
5
6zone_uuid="386ece75e4340c05fa147666a991fc31"
Authorization="Bearer EuWDbgnjW7SY0Y13SerCVfNeBIApDTs3Ou61BMrw"
curl --request GET \
--url https://api.cloudflare.com/client/v4/zones/${zone_uuid}/dns_records \
--header 'Content-Type: application/json' \
--header "Authorization: ${Authorization}"
测试 IP 可用性
因为这个 VPS 的主要作用是提供 https 服务,所以测试 IP 可用性使用的是 tcping。
这个更换 IP 的脚本主要是在 WSL 2 使用,而 WSL 2 目前并没有 IPv6 支持,所以需要先将 tcping.exe
放到 Windows 或 WSL 2 的 PATH 路径中。
脚本通过 os.popen
调用 ping_cmd
里指定的命令内容执行并获取结果分析。
其他方式(未测试):
pouriyajamshidi/tcping: Ping TCP ports using tcping. Inspired by Linux’s ping utility. Written in Go
EnginEken/tcppinglib: An Easy Way to Measure the Connectivity and Latency with TCP Ping
完整脚本
1 | from boto3 import client |
该脚本先是获取了实例的具体信息,并通过定义的命令测试 IP,然后展示测试结果询问是否需要更换 IP。
确认要更换后,将会释放并重新创建静态 IP,然后附加到实例,然后切换一下实例的 IPv6 开关来更新 IPv6 的地址。
更新完成后,重新查询实例的信息,用新的 IP 信息更新 DNS 记录。
测试 IP 那部分,可以改为自动判断,如果丢包达到一定的程度就切换 IP,这样可以作为定时检测脚本来自动更新 IP。