Synology は cloudflare の API 経由で DDNS を自動的に更新します
私は以前、freedns を ddns として使用していましたが、これは実は非常に便利です。freedns には dns を更新するための無料のインターフェイスがあり、curl を使用して直接更新できます。
curl http://sync.afraid.org/u/*******ですが、証明書の更新は面倒です。acme.sh実装することはできますが、freedns には標準インターフェースがないため、実装するのはあまり適切ではないように感じられます。さらに、freedns は常にセカンダリドメイン名を他人に渡してしまうため、私は歯を食いしばってドメイン名を cloudflare に移行して管理することにしました。
1. DDNSを実装する
cloudflare を使用して ddns を実装するのは、実は freedns よりも少し面倒です。sh ファイルも記述する必要がありますが、1 文だけで実行できる freedns とは異なり、標準インターフェイスを呼び出す必要があります。実際にはルーターに設置することをお勧めします。私のSynologyは実際には一年中プロキシをハングアップしているからです。理由はわかりません。システムプロキシの後、ip138にアクセスして実際のIPを見つけることができますが、スクリプトを使用するとIP を取得するには、常にプロキシ IP を取得します。したがって、最善のオプションはルーターに移動することです。もちろん、Synology のスケジュールされたタスクを引き続き使用したい場合は、スクリプトを Synology のどこかに配置して、スケジュールされたタスクを使用します。コマンドは、この sh ファイルを bash で実行することです。
スクリプトを書く前に、次の 4 つの値を取得します: API_TOKEN、ZONE_ID、RECORD_ID、RECORD_NAME
1.1. 4つのパラメータを取る
1.1.1. API_TOKEN
まずユーザープロファイルにDNSトークンを作成します

「権限の編集」を選択して保存します。このトークンは保存され、一度だけ表示されます。

1.1.2. Cloudflare Zone ID
これは、Web サイトの概要の右下隅にあります。ゾーン ID は通常、32 ビットの 16 進文字列です。例:0123456789abcdef0123456789abcdef
1.1.3. DNS レコード ID (更新が必要なレコード ID)
これは開発者ツールを使って確認することもできますが、APIを使って確認する方が簡単です。
1curl -X GET "https://api.cloudflare.com/client/v4/zones/<你的Zone ID>/dns_records?name=<你的RECORD_NAME>" \
2 -H "X-Auth-Email: <你的Cloudflare邮箱>" \
3 -H "X-Auth-Key: <你的CloudflareAPI Token>"
DNS レコードの ID を見つけるには、ゾーン ID、電子メール、トークン、RECORD_NAME を置き換えるだけです。
1.1.4. レコード名
これは、IP を更新するドメイン名です。ルート ドメイン名でもサブドメイン名でもかまいません。いずれにしても、A レコードを更新するドメイン名です。
1.2. スクリプトの作成
上記の 4 つの値を取得したら、スクリプトを記述できます。ルーターにSSHでログインし、ルート権限を取得して、保存場所を選択します。私は/usrに保存しました。vi ddns.shを使用してエディターを開き、Iを押して編集モードに入り、次のスクリプトをコピーします。覚えておいてください4つの値を置き換える
スクリプトは次のとおりです。
1#!/bin/sh
2# Cloudflare API令牌
3API_TOKEN=""
4# Cloudflare Zone ID
5ZONE_ID=""
6# DNS记录ID(需要更新的记录ID)
7RECORD_ID=""
8# 需要更新的域名,subdomain.example.com
9RECORD_NAME=""
10
11# 获取当前公网IP
12CURRENT_IP=$(curl -s http://ipv4.icanhazip.com)
13echo "当前公网IP: $CURRENT_IP"
14
15# 获取现有的DNS记录IP
16DNS_RECORD_RESPONSE=$(curl -s -k -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${RECORD_ID}" \
17 -H "Authorization: Bearer ${API_TOKEN}" \
18 -H "Content-Type: application/json")
19
20# 提取现有DNS记录的IP地址
21DNS_RECORD_IP=$(echo "$DNS_RECORD_RESPONSE" | sed -n 's/.*"content":"\([^"]*\)".*/\1/p')
22echo "提取到的DNS记录IP: $DNS_RECORD_IP"
23
24
25# 检查IP是否需要更新
26if [ "$CURRENT_IP" == "$DNS_RECORD_IP" ]; then
27 echo "IP地址未改变,无需更新"
28else
29 echo "IP地址已改变,开始更新DNS记录"
30
31 # 更新DNS记录
32 RESPONSE=$(curl -s -k -X PUT "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records/${RECORD_ID}" \
33 -H "Authorization: Bearer ${API_TOKEN}" \
34 -H "Content-Type: application/json" \
35 --data "{\"type\":\"A\",\"name\":\"${RECORD_NAME}\",\"content\":\"${CURRENT_IP}\",\"ttl\":120,\"proxied\":false}")
36
37 # 检查更新结果
38 if echo "$RESPONSE" | grep -q "\"success\":true"; then
39 echo "DNS记录已成功更新为新IP: ${CURRENT_IP}"
40 else
41 echo "更新DNS记录失败:$RESPONSE"
42 fi
43fi
**追記: **他の場所からコピーしたスクリプトがXiaomiルーターで実行できない場合、またはcurlでhttpsアドレスにアクセスしたときにXiaomiルーターが値を返さない場合は、curlの後に-kパラメータを追加することを忘れないでください。
1.3. スケジュールされたタスク
スクリプトを書いたら、crontab -eでスケジュールされたタスクを追加するだけです。
*/10 * * * * /usr/ddns.sh
10 分ごとに実行されます。動的 IP が週に 1 回更新される場合は、スケジュールされたタスクを適宜調整できます。
2. acme.shを使用してSynologyの証明書を自動的に更新する
docker を使用せずに Synology に acme.sh を直接インストールすることをお勧めします。これにより、証明書を更新する際の検証プロセスが大幅に簡素化されます。
まず SSH ポートを開き、任意のツールを使用して Synology にログインします。私は Termius を使用していますが、これは Mac に適したアプリだと思います。
1sudo su
2cd ~
3curl https://get.acme.sh | sh -s email=[email protected] --force
4cd .acme.sh
5./acme.sh --install --nocron --home /usr/local/share/acme.sh --accountemail "[email protected]"
6source ~/.profile
7cd /usr/local/share/acme.sh
値を1行ずつ入力し、Account_IDとTokenを取得します。上記と同じTokenを使用できます。同じである必要があります。Account_IDはZone IDと同じページにあります。これら2つで値を変更するには、次の手順に進みます。
1export CF_Account_ID="*****************"
2export CF_Token="*****************"
3# 申请证书,--server letsencrypt 指定申请 letsencrypt 证书
4# -d example.com 指定要申请证书的域名是 example.com
5# -d *.example.com 说明申请的证书是泛域名证书
6./acme.sh --issue --server letsencrypt --home . -d example.com --dns dns_cf --keylength 2048
通常、ここで証明書を取得しています。次に、証明書を展開します。ローカルコンピューターに直接展開する場合は、一時的な管理者ユーザーを使用して直接展開できます。そのため、Docker にインストールすることは推奨されません。リモートサーバーに証明書を展開する必要がある場合は、より複雑になります。こちら を参照してください。
デプロイする際は、IPでログインしてHTTPでアクセスする場合は追加の操作は必要ありません。私のようにドメイン名アクセスを使用し、同時にSSLを有効にする場合は、2つの環境変数を追加する必要があります。
1# 设置使用临时管理员账户
2export SYNO_USE_TEMP_ADMIN=1
3export SYNO_SCHEME="https"
4# 这里的端口号需要改成你设置的https的端口号,默认是5001
5export SYNO_PORT="9530"
6# 最后就是部署证书了,使用写好的hook直接搞定
7./acme.sh --deploy --insecure --home . -d nas.igerm.ee --deploy-hook synology_dsm
2.1 自動更新
実際、DDNS を自動的に更新するのと同じように、カスタム cronjob を使用することも可能です。ただし、Synologyでcronjobを使用すると、Synologyのセキュリティアドバイザーから重大な警告が表示されます。これは自分で追加したものですが、この警告を見るのは気分がよくないので、Synologyのスケジュールされたタスクに直接追加することができます。更新する。
DSM コントロール パネルで、タスク スケジューラを開き、ユーザー定義スクリプトの新しいスケジュールされたタスクを作成します。
ユーザー アカウントを root として選択し、タスク設定にカスタム ユーザー スクリプトを入力します。
開始時間を毎月第 1 月曜日に設定していますが、自分で設定することもできます。
1# renew certificates
2/usr/local/share/acme.sh/acme.sh --cron --home /usr/local/share/acme.sh

