我的服务器使用了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