近几个月来科学上网的环境持续不稳定,即使方式从 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。参考步骤和文章:
- 安装:Installing or updating the latest version of the AWS CLI
- 配置 Lightsail policy和用户:Managing access to Amazon Lightsail for an IAM user
- 创建access key
- 设置 AWS CLI:Configuration basics。其中region可以在这里查询 Regions and Availability Zones in Amazon Lightsail
2. 用 AWS CLI 更新 Lightsail 实例的 IP 地址
在 Lightsail 控制台界面上操作时只需要删除掉目前的静态公网 IP 地址并重新创建一个新的地址即可,创建过程中可以顺便绑定到你的实例机器。同样的过程用命令行操作,需要依次输入以下命令:
- 根据名称删除当前的 IP 地址
aws lightsail release-static-ip --static-ip-name StaticIp-1
- 申请新的 IP 地址并命名
aws lightsail allocate-static-ip --static-ip-name StaticIp-1
- 将新的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. 鸡蛋不放在一个篮子里,避免需要“初始化”上网环境时,无法“上网”的窘境。