自动更新 AWS Lightsail 实例的公网 IP 地址并同步到 Cloudflare 的域名 DNS 记录

  近几个月来科学上网的环境持续不稳定,即使方式从 v2ray 的 websocket+tls 换成了 xray 的 vless+xtls-rprx-direct 配置,印象中去年底开始,刚刚更新好的上网环境,包括自建和订阅,用一阵以后(几天时间不等)也会断流继而彻底失效。

  经过观察发现,如果是自己搭建的环境,刚开始ping域名是可以返回背后的 IP 地址,但断流失效后,ping域名就没有响应了;此时 VPS 里的相关服务是持续稳定的,所以可能是 VPS 的 IP 地址被加入了“黑名单”。这时如果更换 VPS 的 IP 地址,并重新绑定到先前的域名,上网环境又重新可用,如此往复。这篇文章针对自建环境的情况,分享一种解决目前问题的方法。对于订阅的情况,只要更新一次订阅的服务器节点即可。

  根据上面的思路,只需要定期自动更新 VPS 的外网 IP 地址,然后同步到自己域名的 DNS 解析记录即可。我目前使用的是 AWS Lightsail 和 Cloudflare,在 Linux 环境里解决问题的具体步骤如下。如果你使用其它服务商,需要查询一下相关的 API。

1. 安装和配置 AWS CLI

  AWS Lightsail可以看作是廉价的EC2服务,因此其实例同样可以用AWS CLI来进行操作。安装只需要依次执行以下命令:

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install

  完成之后需要使用 aws configure 命令配置安全认证以便能够和你的 Lightsail 交互。这里需要提前创建好 IAM 用户和 access key。参考步骤和文章:

2. 用 AWS CLI 更新 Lightsail 实例的 IP 地址

  在 Lightsail 控制台界面上操作时只需要删除掉目前的静态公网 IP 地址并重新创建一个新的地址即可,创建过程中可以顺便绑定到你的实例机器。同样的过程用命令行操作,需要依次输入以下命令:

  1. 根据名称删除当前的 IP 地址 aws lightsail release-static-ip --static-ip-name StaticIp-1
  2. 申请新的 IP 地址并命名 aws lightsail allocate-static-ip --static-ip-name StaticIp-1
  3. 将新的ip绑定到指定的实例上 aws lightsail attach-static-ip --static-ip-name StaticIp-1 --instance-name Ubuntu2004LTS-Tokyo1

  参考 https://docs.aws.amazon.com/cli/latest/reference/lightsail/index.html

3. 利用 Linux shell 脚本更新 Cloudflare 中域名的 DNS 记录

  这一步在之前文章“OpenWrt中通过自定义脚本为Cloudflare域名更新DDNS“中有具体内容,此处略过。这里给出完整的脚本供参考。

  上面步骤2中的命令有些需要用户输入才能继续,因此脚本里禁用了 AWS CLI 的输出以便可以自动执行。

4. 定时自动执行以上脚本

  在稳定的 Linux 环境中 crontab -e 将上述脚本加入 cron 任务定时运行。比如我这里是每天早上6点执行一次:

0 6 * * * /root/updatePublicStaticIPForLightsailAndCloudflare.sh

  尾巴:如果问为什么要同时使用自建和订阅服务,考虑的因素有两点:1. 隐私安全;2. 鸡蛋不放在一个篮子里,避免需要“初始化”上网环境时,无法“上网”的窘境。

Leave a Comment

Your email address will not be published. Required fields are marked *