Monthly Archives: January 2023

自动更新 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. 鸡蛋不放在一个篮子里,避免需要“初始化”上网环境时,无法“上网”的窘境。

OpenWrt中通过自定义脚本为Cloudflare域名更新DDNS

  在上一篇文章中,威联通NAS上myQNAPcloud DDNS获取外网地址不准确的问题,提到使用myQNAPcloud服务来设置DDNS。这次尝试不依赖QNAP的服务,在OpenWrt里定时运行自定义脚本来直接更新域名的DNS地址。

  我的域名托管在Cloudflare上,所以主要思路是定时在OpenWrt里运行脚本检测公网IP地址是否有变化,如果有就用Cloudflare的token和API来更新相关DNS设置。

  记录具体步骤如下:

  1. 获取Cloudflare的API token,稍后脚本中会用到。进入 https://dash.cloudflare.com/profile/api-tokens 页面,Create Token,为了使token权限最小化选择Create Custom Token,设置如下图。Specific zone选项可限制token权限为仅允许更新某一个域名。
  2. 在上面所选域名的DNS设置中,添加一条A记录,设置成DDNS想要绑定的域名。IP地址随意设置比如8.8.8.8(之后脚本会付覆盖),Proxy status设置为DNS only。
  3. OpenWrt运行的脚本。参考了一些网上的脚本,发现 https://raw.githubusercontent.com/K0p1-Git/cloudflare-ddns-updater/main/cloudflare-template.sh 这个脚本比较全面(下载链接),注释也清楚。几点注意事项:
    • 第一行的#!/bin/bash需要修改成#!/bin/sh,否则OpenWrt中没有bash环境无法运行。
    • 要填写的项目有auth_email,auth_key,zone_identifier,record_name,其余可留空。
    • auth_method="token" 注意保持token方式,对应步骤1中创建的API token。同一页面还可看到Cloudflare的Global API Key,因为它可以操作账户里的所有设置,不建议使用。
    • 如果OpenWrt设置了科学上网/透明代理,curl -s -4 https://cloudflare.com/cdn-cgi/trace运行时可能获取到代理服务器的ipv4地址。可以注释掉相关if判断部分,改为用其它API直接获取,即ip=$(curl -s https://api.ipify.org || curl -s https://ipv4.icanhazip.com) 。注:此地址需添加到科学上网的“不走代理域名”列表内,否则全局代理时,访问这些地址获取到的也变成了代理地址。
  4. 用scp命令将修改好的脚本上传到/root目录,chmod +x updateDDNS_cloudflare.sh赋予执行权限。先手动运行一次观察输出是否正常/bin/sh -x updateDDNS_cloudflare.sh。如果脚本运行无误的话,可以在Cloudflare中观察到对应A记录的DNS更新成功。
  5. crontab -e编辑计划任务,添加一行内容*/10 * * * * /root/updateDDNS_cloudflare.sh,这样此脚本会每10分钟运行一次以按需更新DDNS。此步骤也可在OpenWrt网页端的“系统->计划任务”里完成。

  其实同样的工作也可以在OpenWrt的web管理页面上完成,如果你可以在“服务->动态DNS->DDNS 服务提供商 [IPv4]”的设置中找到Cloudflare选项的话。我用的OpenWrt编译了动态DNS的应用(luci-app-ddns, ddns-scripts),但没有Cloudflare的入口点。尝试安装ddns-scripts-cloudflare或更早的ddns-scripts_cloudflare.com-v4_2.7.8-3_all.zip,不仅依然找不到Cloudflare入口点,还有可能破坏掉OpenWrt:实际后台依然运行,可以上网,但web页面(LuCI web interface)报错Bad Gateway The process did not produce any response.,只能借助ESXI里的快照恢复或重新安装OpenWrt。所以才有了这篇博客。

威联通NAS上myQNAPcloud DDNS获取外网地址不准确的问题

  威联通(QNAP)NAS上自带的myQNAPcloud服务可以识别到NAS所在网络的外网地址,从而和你注册的QNAP域名(*.myqnapcloud.com)绑定,方便从外网通过该域名访问NAS服务。

  问题:最近发现家里的两台NAS中,一台的myQNAPcloud服务可以识别正确外网地址,而另一台NAS识别出的外网地址不对,实际上是软路由里科学上网的代理地址。猜测有问题的这个NAS不知为什么通过代理访问了myQNAPcloud的服务器。

  解决办法:在软路由的代理设置中,将访问myQNAPcloud服务器的地址 edge.api.myqnapcloud.com 设置成不走代理即可。

myQNAPcloud服务器地址加入不走代理设置

参考文章: