(原) Caddy实现的类似DDNS方案

原创文章,请后转载,并注明出处。

我的服务器使用了Caddy,比Nginx简单,功能足够。
家里的网络也有公网IP,虽然被残(80\443被屏),但依然想发挥剩余价值。于是思考基于Caddy的DDNS解决方法。
通过服务器上的Caddy设置好二级域名(例如 abc.scwy.net ),并设置好跳转

abc.scwy.net {
      redir http://1.2.3.4:8000
}

当然还有控制设置

{
        admin :12345 {
                origins ["192.168.2.2"]
        }
}

也可以设置为仅本机可控,提高安全性。

在客户端,即有公网的家里服务器上

#!/bin/bash

WANIP=$(curl -4 ifconfig.me -s)
url="http://$WANIP:8000"
echo "$url"
curl -X PATCH scwy.net:12345/config/apps/http/servers/srv1/routes/13/handle/0/routes/0/handle/0/headers/Location/0 -H "Content-Type: application/json" -d "\"$url\"" -s

即在服务器上找到Caddy里的配置行,在客户机上PATCH修改当前外网IP。
每10分钟运行一次修改(自行优化),从而实现IP变化时提交给服务器。

若要做一个小型DDNS服务,基于以上原理,可以编写一个中间工具,便于用户提交修改。禁止用户直接查看到服务器所有配置以及完成用户授权。

注:以上并未实现DNS及DDNS功能,只是完成了域名跳转动态IP功能。


以下脚本在IP更改时提交

#!/bin/bash


public_ip=$(curl -s ifconfig.me) || public_ip=$(curl -s ifconfig.co) || public_ip=$(curl -s ipv4.icanhazip.com) || public_ip=$(curl -s checkip.amazonaws.com)

# 检查是否成功获取公网IP
if [ -z "$public_ip" ]; then
  echo "未能获取到公网IP地址。"
  exit 1
else
  # 验证是否是有效的IP地址
  if [[ $public_ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
     echo "成功获取公网IP地址:$public_ip"
     url="http://$public_ip:8000"
     # 获取原有IP
     server_url=$(curl -X GET scwy.net:12345/config/apps/http/servers/srv1/routes/13/handle/0/routes/0/handle/0/headers/Location/0 -s | sed 's/\"//g')
     # IP不同时表示有改变,提交
     if [ $url != $server_url ] ; then
       curl -X PATCH scwy.net:12345/config/apps/http/servers/srv1/routes/13/handle/0/routes/0/handle/0/headers/Location/0 -H "Content-Type: application/json" -d "\"$url\"" -s
     fi
  else
    echo "获取到的内容不是有效的IP地址:$public_ip"
    exit 1
  fi
fi

相关文章