简体中文 | English
NameSilo DDNS是一个用于NameSilo的动态域名解析服务,适用于家庭宽带,它能自动检测家庭宽带的IP变动,并自动更新域名的解析。
本项目已通过python3重构,查看Java版本请切换分支。
本程序仅适用于NameSilo上购买的域名
右上角点个 ⭐ Star 不迷路
- 配置简单但丰富
- 具有邮件提醒功能,服务通知和异常提醒
- 支持docker运行
- 日志记录和滚动
- 支持同时更新多个域名
- 支持IPv6
内网映射,内网穿透,在外访问家里的机器的方案
目前运营商给家庭宽带的IP都是动态的,庆幸的是虽然IP地址不固定,但分配到家庭路由器的却是一个实实在在的公网IP,所以我们只需设置光猫桥接模式 + 路由器拨号上网 + 路由器NAT映射/DMZ主机即可在公网访问家庭的设备。
需要几个前提条件:
-
路由器支持NAT映射/DMZ主机功能。有的路由器甚至支持DDNS,不过是指定域名厂商的,一般是花生壳,也是需要备案的。所以本项目对比路由器自带DDNS仍有优势
-
获取宽带的账号密码,拨号时使用
-
光猫设置桥接模式。可打电话给运营商,客服可以远程光猫切换到桥接模式;或者自行获取光猫超级用户的账号密码来设置,这个根据光猫型号去网上搜即可
一切顺利的话,我们路由器映射22端口就能远程家里的linux,映射445+3389端口就能用win10自带远程桌面远程家里的windows。如下图
当然运营商会屏蔽80 443等端口
且分配的公网IP会变动(每次间隔几天到十几天不等),为解决这一问题,可以购买一个域名,使用DDNS(Dynamic Domain Name Server,动态域名服务)将域名实时解析到宽带的IP。这样就可以在家搭建各种服务并通过访问固定的域名来访问,而无需租用昂贵的公网服务器
想实现这个目的,你需要一台一直运行的电脑来运行此DDNS程序
IPv6就简单了,运营商目前都给宽带配备了IPv6地址,只需在路由器上开启IPv6功能,电脑上确保有IPv6地址和DNS服务器地址即可使用IPv6联网。如果开了全局代理记得测试时关掉。
只要路由器的防火墙策略未限制外网流量访问内网,则无需NET映射,就能通过IPv6地址访问内网机器!
快速上手,Dokcer:
mkdir -p /home/docker/ddns
docker pull charles94jp/ddns
docker run -d --name ddns -v /home/docker/ddns:/home/NameSilo-DDNS:rw --network host charles94jp/ddns
# run命令可选项-启动docker时启动容器: --restart=always
# run命令可选项-时区: -e TZ=Asia/Shanghai
cp /home/docker/ddns/conf/conf.json.example /home/docker/ddns/conf/conf.json
vi /home/docker/ddns/conf/conf.json
# 填写域名domain和api密钥key
# api密钥在这里获取: https://www.namesilo.com/account/api-manager
docker restart ddns
当然也可以作为python程序直接运行。
启动前需要配置conf/conf.json
文件,参考conf.json.example,只有domains和key两项配置是必要的,其余的可以不进行配置。
字段 | 介绍 |
---|---|
domains | A记录类型的域名,用于IPv4。支持同时更新多个域名,支持二级域名、三级域名等,如["cc.bb.cn","q.w.cc.cn"] 。如果只使用IPv6,此项留白即可程序只能更新已存在的DNS记录,而不能创建一个新的DNS记录。所以你必须先在NameSilo网页上创建一个解析后,才能运行程序。 |
domains 项的旧版本,目前还兼容。字符串类型,只能是一个域名 |
|
domains_ipv6 | AAAA记录类型的域名,用于IPv6。如果只使用IPv4,此项留白即可。docker中使用IPv6,run命令需要--network host 选项 |
ttl | Time To Live, DNS解析记录在DNS服务器上缓存时间,默认3600秒 |
key | 从NameSilo获取的api key,有key才能获取和修改你的域名状态,保管好不要泄露此key |
frequency | 多久检测一次你的ip变动,如有变动才更新你的域名解析状态,单位s |
get_ipv6_local | v2.2.4版本新增,默认ture。启用将从Python socket模块来获取本机ipv6地址,无需依赖外界,关闭则使用HTTP请求其它服务器来获取本机ipv6。 |
mail_host | SMT邮件服务器,如qq、163等。QQ邮箱打开POP3/SMTP即可 |
mail_port | 邮件服务器端口,必须是SMTP SSL端口 |
mail_user | 登录用户名,也是发件人 |
mail_pass | 登录密码或key |
receivers | 数组,收件人地址,可以是多个。收件人 和 发件人 可以是同一个 |
mail_lang | 邮件的语言。默认zh-cn,可选en-us |
从v2.2.0版本起弃用。适用于家里意外断电的情况,当通电后,路由器重新拨号,一般会获得新IP,如果服务器支持来电自动开机,那么DDNS在开机自动启动后,会发送邮件告诉你:你的服务器已成功启动。 | |
auto_restart | Linux、macOS下生效,默认不启用。在程序持续异常一段时间后,自我重启。v2.1.0版本已找到异常原因并解决,此项不再重要。 |
email_every_update | 每次IP更新都发送邮件告知新IP,避免在DNS更新的十几二十分钟内无法访问。默认关闭,打开的前提是设置了邮件。 |
Q:邮件功能有什么用?
A:会收到以下邮件:ip变动后,推送NameSilo成功;推送失败;程序因意外情况停止;程序自动重启
Q:如何开启邮件功能?
A:从mail_host到mail_pass,4个配置都填写正确,就会自动启用
测试邮件设置是否正确,会发送一封邮件到你的邮箱:
DDNS testEmail
# or
python ddns.py --test-email
本程序只能更新域名的DNS记录,无法增加,请确保你的域名存在此DNS记录。
Doker的优点是不需要安装python环境,在开机自动启动方面不需要将脚本加入systemctl
从Docker Hub拉取
docker pull charles94jp/ddns
本镜像基于最小的Linux alpine构建,Docker Hub显示21.37M,docker images
显示镜像大小为57M
Docker Hub中的镜像不一定是最新的,你也可以选择手动构建镜像
手动构建镜像
docker build -t charles94jp/ddns .
构建过程中下载python:3.x.x-alpine
镜像和pip install httpx
需要一点时间
docker run -d --name ddns -v <local dir>:/home/NameSilo-DDNS:rw --network host charles94jp/ddns
# --restart=always
一定要用 -v 参数将本机的目录<local dir>
挂载到容器内的/home/NameSilo-DDNS
,容器会将程序文件写出到<local dir>
接着在<local dir>
中配置conf/conf.json
,参考Configuration
最后记得重启一下容器,因为最开始docker run
时没有配置文件,所以ddns程序是没有成功运行的
docker restart ddns
IPv6请使用--network host
选项,IPv4可以不用
查看ddns程序状态用<local dir>
中的ddns-docker
systemctl enable docker
docker update --restart=always ddns
日志在<local dir>/log
文件夹下
查看程序运行状态,以及历史更新记录,运行:
<local dir>/ddns-docker
查看所有日志文件:
ls -lh log/DDNS*.log*
当DDNS服务启动时,若DDNS.log
超过2M便会触发自动归档。可以存储使用DDNS以来所有的日志。
直接在机器上运行程序
下载即用
git clone -b python https://github.com/Charles94jp/NameSilo-DDNS.git
需要使用python3来运行,python需要安装httpx模块:
pip install httpx
更新程序:
git pull origin python
快速启动:
python ddns.py
Linux | Mac进阶使用:
DDNS
文件是一个功能强大的脚本,可以后台启动ddns.py程序,检测程序是否在后台运行,以及杀死程序
使用之前先编辑DDNS文件,修改第8行为NameSilo-DDNS项目的绝对路径,修改第17行为python 3可执行文件路径即。这样做是为了在使用软链或设置程序随系统启动时能找到项目路径
DDNS
脚本使用方法:
chmod +x DDNS
# usage
./DDNS {start|stop|status|restart|force-reload}
功能类似Log - Docker,但更强大
如果想在任何地方使用DDNS
命令,可以在/usr/bin
目录下建立软链接,注意ln
命令要使用绝对路径,如
ln -s /root/NameSilo-DDNS/DDNS /usr/bin/DDNS
Windows使用: 双击bat或vbs文件,程序运行状态请查看日志
日志都在log文件夹下
Linux
查看日志文件
ls -lh log/DDNS*.log*
当DDNS服务启动时,若DDNS.log
超过2M便会触发自动归档。可以存储使用DDNS以来所有的日志。
手动归档日志,用于在DDNS status
打印信息过多时
DDNS archiveLog
# or
python ddns.py --archive
Windows
当DDNS服务启动时,若DDNS.log
超过2M便会将旧的DDNS.log
文件重命名为DDNS-xxx.log.back
手动归档日志:
python ddns.py --archive
Linux
设置开机启动,仅示范RedHat系列,如CentOS 7 8和Rocky Linux 8,其他Linux发行版请自行编写脚本。
将DDNS注册为systemctl管理的服务
首先要按照start中的步骤配置DDNS文件
接着配置DDNS.service文件,修改其中DDNS文件的路径,最后
cp ./DDNS.service /usr/lib/systemd/system/DDNS.service
systemctl daemon-reload
systemctl enable DDNS
Windows
将vbs文件加入策略组
相关链接:
- Docker Hub
- NameSilo API Document: Domain API Reference - NameSilo
- 当前IP查询: speedtest.cn ; 南京大学测速网 ; myip.com ; ipify
- 当前IPv6查询: 中科大测速网 ; ipify ; 清华大学IPv6