Home
Softono

NameSilo DDNS

Open source MIT Python
310
Stars
28
Forks
14
Issues
3
Watchers
5 months
Last Commit

 About NameSilo DDNS

动态域名解析程序: A python Dynamic DNS service for NameSilo, with logger, email notification, docker support, IPv6 support.

Platforms

Web Self-hosted Docker

Languages

Python

Need Help Installing NameSilo DDNS?

We provide expert installation service for this software. Our team will install, configure, and secure NameSilo DDNS on your server. plans start at just $30.

NameSilo DDNS

View on GitHub


简体中文 | English

NameSilo DDNS是一个用于NameSilo的动态域名解析服务,适用于家庭宽带,它能自动检测家庭宽带的IP变动,并自动更新域名的解析。

本项目已通过python3重构,查看Java版本请切换分支。

本程序仅适用于NameSilo上购买的域名

右上角点个 ⭐ Star 不迷路

Features

  • 配置简单但丰富
  • 具有邮件提醒功能,服务通知和异常提醒
  • 支持docker运行
  • 日志记录和滚动
  • 支持同时更新多个域名
  • 支持IPv6

Table of Contents

1. Background

内网映射,内网穿透,在外访问家里的机器的方案

IPv4

目前运营商给家庭宽带的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功能,电脑上确保有IPv6地址和DNS服务器地址即可使用IPv6联网。如果开了全局代理记得测试时关掉。

只要路由器的防火墙策略未限制外网流量访问内网,则无需NET映射,就能通过IPv6地址访问内网机器!

2. Quick Start

快速上手,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程序直接运行

如果在使用nginx等http服务,需要自动申请并更新https证书,建议使用:acme.sh

推荐命令参数:acme.sh --issue -d github.com --dns dns_namesilo --dnssleep 1080

3. Configuration

启动前需要配置conf/conf.json文件,参考conf.json.example,只有domains和key两项配置是必要的,其余的可以不进行配置。

字段 介绍
domains A记录类型的域名,用于IPv4。支持同时更新多个域名,支持二级域名、三级域名等,如["cc.bb.cn","q.w.cc.cn"]。如果只使用IPv6,此项留白即可
程序只能更新已存在的DNS记录,而不能创建一个新的DNS记录。所以你必须先在NameSilo网页上创建一个解析后,才能运行程序。
domain 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
email_after_reboot 从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

4. Note

本程序只能更新域名的DNS记录,无法增加,请确保你的域名存在此DNS记录。

5. Usage - Docker

Doker的优点是不需要安装python环境,在开机自动启动方面不需要将脚本加入systemctl

5.1 Build or Pull Image

从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需要一点时间

5.2 RUN

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

5.3 Start with Linux

systemctl enable docker
docker update --restart=always ddns

5.4 Log - Docker

日志在<local dir>/log文件夹下

查看程序运行状态,以及历史更新记录,运行:

<local dir>/ddns-docker

查看所有日志文件:

ls -lh log/DDNS*.log*

当DDNS服务启动时,若DDNS.log超过2M便会触发自动归档。可以存储使用DDNS以来所有的日志。

6. Usage - Direct

直接在机器上运行程序

6.1 Install

下载即用

git clone -b python https://github.com/Charles94jp/NameSilo-DDNS.git

需要使用python3来运行,python需要安装httpx模块:

pip install httpx==0.28.1

更新程序:

git pull origin python

6.2 Start

快速启动:

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文件,程序运行状态请查看日志

6.3 Log

日志都在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

6.4 Start At Boot

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文件加入策略组

7. Links

相关链接: