Logo 我的trilium分享

New note

有时候对于拨号的主机,需要ddns服务,方便连接,以下命令基于v6,如果有v4需求,涉及6的参数用4即可。

1. 绑定到he net服务商可参考社区已有精华  
https://www.nodeloc.com/t/topic/58016

2. 新建一条A或AAAA记录,勾选 `Enable entry for dynamic dns`,点击绿色submit提交
![image|603x321](upload://vcDLwtHFs1xlGlAWRI7kW5a68cs.png)


3. 返回点击新记录后面的刷新DDNS key按钮
![image|295x35](upload://dkAzBPVPKWWttpOdZKyKAkQVckb.png)
两次输入自己的key后提交,也可以点击蓝色`generate a key`按钮, ***切记复制或记录在记事本,将无法再次看见***, 记录好子域名和key待用,如a.a.loc.cc 和 abc123 。点击绿色submit提交。
![image|238x182](upload://cGUtRU75R4CwsZqvn9CjRnhUQYZ.png)

4. henet网页设置到此结束。 接下去就是ssh主机上脚本使用,分成3种,简单到复杂,参考的henet官方和github早期脚本。

## 情况一:最简单

如果主机防火墙简单,能够通过类似于ip.im正确获取本机ip,则使用官方命令即可刷新

`curl -6 "https://a.a.loc.cc:[email protected]/nic/update?hostname=a.a.loc.cc"`

一般首次会返回`good 240x:……`这样的记录,再次运行提示`nochg 240x. ` 
可以在`crontab -e`中定时运行更新,如每小时1分运行
```
1 * * * * curl -6 "https://a.a.loc.cc:[email protected]/nic/update?hostname=a.a.loc.cc"
```

## 情况二:查询无法获取本机ip
如果在ip.im等网站上查询到的是网关ip,通常结尾是`前缀::1`形式,那就要先通过ip命令获取ip再更新接口eth0需根据主机实际修改。

`ip6=$(ip -6 addr show dev eth0 scope global | grep "inet6" | awk '{print $2}' | cut -d'/' -f1 | head -1) && curl -6 "https://a.a.loc.cc:[email protected]/nic/update?hostname=a.a.loc.cc&myip=$ip6"`

## 情况三:通过bash脚本更新
无法获取时也可以通过bash脚本,基于 https://gist.github.com/joemiller/9fcbf1c953a8ed1095e95fe4396cec4a 修改成直接单文件脚本,不再新建etc下conf文件。
新建脚本,如/usr/local/bin/he-dns-update.sh,其中HOSTNAME、KEY及eth0按实际修改,
使用`/usr/local/bin/he-dns-update.sh 6`刷新或通过crotab中定时运行, 如 `0 * * * * /usr/local/bin/he-dns-update.sh 6`

```
#!/bin/bash
#
# origin Author
# ------
# Joe Miller / https://gist.github.com/joemiller/9fcbf1c953a8ed1095e95fe4396cec4a
#

LOGGER_BIN="logger"
CURL_BIN="curl"
CURL_TIMEOUT_SECS=10
HOSTNAME=a.a.loc.cc   # 必须修改
KEY=abc123   # 必须修改,eth0按主机实际
ipv6=$(ip -6 addr show dev eth0 scope global | grep "inet6" | awk '{print $2}' | cut -d'/' -f1 | head -1)

# load config file and verify required args

if [ -z "$HOSTNAME" ] || [ -z "$KEY" ]; then
 echo "ERROR:  missing one or more required vars: HOSTNAME, KEY"
 exit 1
fi

proto="$1"
if [ -z "$proto" ]; then
 echo "Usage: $0 [4|6]"
 exit 1
fi

out=$("$CURL_BIN" \
 -"$proto" \
 --silent \
 -m "$CURL_TIMEOUT_SECS" \
 -k \
 https://dyn.dns.he.net/nic/update \
 -d "hostname=$HOSTNAME" \
 -d "password=$KEY" \
 -d "myip=$ipv6" 2>&1)

# $out will be empty on timeout, so we catch curl's return code for timeout and populate
# $out with a helpful message. Could do this for other common errors from curl too.
rc=$?
if [ "$rc" == 28 ]; then
 out="curl timed out."
fi

case $out in
 *good*)
   "$LOGGER_BIN" -p local0.info   -t HE-DNS "OK: ipv$proto address updated: $out" ;;
 *nochg*)
   "$LOGGER_BIN" -p local0.notice -t HE-DNS "OK: ipv$proto address no change: $out" ;;
 *)
   "$LOGGER_BIN" -p local0.err    -t HE-DNS "ERROR: ipv$proto address not updated : $out" ;;
esac
```

通过以上三种情况刷新后, henet后台应该能够看到域名对应的ip了,不再是::1