Pages

Tuesday, 26 June 2018

GoDNS

A dynamic DNS client tool, supports DNSPod & HE.net, written in Go.

Release MIT licensed Build Status Docker Go Report Card Cover.Run GoDoc

GoDNS is a dynamic DNS (DDNS) client tool, it is based on my early open source project: DynDNS.
Now I rewrite DynDNS by Golang and call it GoDNS.

Supported DNS Provider

Supported Platforms

  • Linux
  • MacOS
  • ARM Linux (Raspberry Pi, etc...)
  • Windows

MIPS32 platform

For MIPS32 platform, please checkout the mips32 branch, this branch is contributed by hguandl, in this branch, the support for mips32 is added, which means it could run properly on Openwrt and LEDE.

Pre-condition

  • Register and own a domain.
  • Domain's nameserver points to DNSPod or HE.net.

Get it

Build it from source code

  • Get source code from Github:
git clone https://github.com/timothyye/godns.git
  • Go into the godns directory, get related library and then build it:
cd cmd/godns
go get -v
go build

Download from releases

Download compiled binaries from releases

Get help

$ ./godns -h
Usage of ./godns:
  -c string
        Specify a config file (default "./config.json")
  -d    Run it as docker mode
  -h    Show help

Config it

  • Get config_sample.json from Github.
  • Rename it to config.json.
  • Configure your provider, domain/sub-domain info, username and password, etc.
  • Configure the SMTP options if you want, a mail notification will sent to your mailbox once the IP is changed.
  • Save it in the same directory of GoDNS, or use -c=your_conf_path command.

Config example for DNSPod

For DNSPod, you need to provide email & password, and config all the domains & subdomains.
{
  "provider": "DNSPod",
  "email": "example@gmail.com",
  "password": "YourPassword",
  "login_token": "",
  "domains": [{
      "domain_name": "example.com",
      "sub_domains": ["www","test"]
    },{
      "domain_name": "example2.com",
      "sub_domains": ["www","test"]
    }
  ],
  "ip_url": "http://members.3322.org/dyndns/getip",
  "log_path": "./godns.log",
  "socks5_proxy": ""
}

Config example for HE.net

For HE, email is not needed, just fill DDNS key to password, and config all the domains & subdomains.
{
  "provider": "HE",
  "email": "",
  "password": "YourPassword",
  "login_token": "",
  "domains": [{
      "domain_name": "example.com",
      "sub_domains": ["www","test"]
    },{
      "domain_name": "example2.com",
      "sub_domains": ["www","test"]
    }
  ],
  "ip_url": "http://members.3322.org/dyndns/getip",
  "log_path":"/users/timothy/workspace/src/godns/godns.log",
  "socks5_proxy": ""
}

HE.net DDNS configuration

Add a new "A record", make sure that "Enable entry for dynamic dns" is checked:

Fill your own DDNS key or generate a random DDNS key for this new created "A record":

Remember the DDNS key and fill it as password to the config.json.
NOTICE: If you have multiple domains or subdomains, make sure their DDNS key are the same.

Email notification support

Update config file and provide your SMTP options, a notification mail will be sent to your mailbox once the IP is changed and updated.
  "notify": {
    "enabled": true,
    "smtp_server": "smtp.example.com",
    "smtp_username": "user",
    "smtp_password": "password",
    "smtp_port": 25,
    "send_to": "my_mail@example.com"
  }
Notification mail example:

SOCKS5 proxy support

You can also use SOCKS5 proxy, just fill SOCKS5 address to the socks5_proxy item:
"socks5_proxy": "127.0.0.1:7070"
Now all the queries will go through the specified SOCKS5 proxy.

Run it as a daemon manually

nohup ./godns &

Run it as a daemon, manage it via Upstart

  • Install upstart first
  • Copy ./upstart/godns.conf to /etc/init
  • Start it as a system service:
sudo start godns

Run it as a daemon, manage it via Systemd

  • Modify ./systemd/godns.service and config it.
  • Copy ./systemd/godns.service to /lib/systemd/system
  • Start it as a systemd service:
sudo systemctl enable godns
sudo systemctl start godns

Run it with docker

Now godns supports to run in docker.

docker run -d --name godns --restart=always \
-v /path/to/config.json:/usr/local/godns/config.json timothyye/godns:latest


from https://github.com/TimothyYe/godns
-------

开源项目: GoDNS


记得之前写过一个开源的DDNS工具: DynDNS,基于Ruby开发,用在PT下载机上感觉还不错,

让我随时可以在公司通过动态域名访问到家里的下载机。

最近学Golang,有了个打算,就是用Golang把这个工具给重写一次。于是,就有了这个开源项目:GoDNS

跟Ruby版本的DynDNS相比,GoDNS用起来更加方便,由于是直接编译为可执行文件,所以在使用的时候,

你不用搭建Ruby环境,安装各种依赖组件,修改好配置文件后,就可以直接运行了.


FROM https://xiaozhou.net/godns-project-2014-05-18.html
--------------------------

利用GoDNS和DNSPod设置DDNS

不管是自己家里的运行在公网IP路由器背后的NAS或是买的NAT主机需要连接的时候需要动态DDNS来确定真正的IP地址,再通过端口转发就可以访问了。

DDNS简单介绍

DDNS是 dynamic DNS(动态DNS)的简写,如果我们普通用户的主机的公网IP地址是一个动态的IP地址的话,在NameServer(DNS托管商)那里不可能每次都手动修改IP地址。想要用自动更新DNS地址的话可以采取的是CNAME主机商分配给你的DDSN主机名,因为主机商采用的是自己的DNS软件可以采集到IP地址,或者家里路由器也有一些DDNS主机名功能,如果想要使用自己的域名的话可以采取CNAME这些,当然也可以用我们今天介绍的GoDNS等DDNS程序。如何使用Linux命令知道自己的真正公网IP地址呢?参考以下: curl whatismyip.akamai.com curl http://members.3322.org/dyndns/getip curl ip.cip.cc

安装GoDNS

GoDNS是我从网上看到的一个DDNS软件,支持的版本有Mac的OS X系统、Windows系统、Linux系统、Arm架构,同时他支持的DNS托管商有DNSPod、Cloudflare、HE.net。当然还有最棒的是他现在开始支持泛域名解析跟多个IP同时更新,同时还可以Email通知IP变更。他的GitHub官网地址是https://github.com/TimothyYe/godns。
这个教程我简单介绍下如果通过GoDNS跟DNSPod给自己的Linux配置DDNS。DNSPod需要提前准备自己的API Token。地址为https://www.dnspod.cn/console/user/security。生成后保存id跟Token值备用。同时域名example.com中需要设置动态DNS的子域名www、test也要先建立一个随机的IP地址1.2.3.4。

1、手动编译

GoDNS是根据Go语言写的,可以在GitHub官网整个库打包下来然后用go语言运行,这种方式可以保证是最新的版本。 yum -y install go git git clone https://github.com/timothyye/godns.git cd cmd/godns go get -v go build 运行完毕以后就会生成godns的一个二进制文件,可以直接运行。

2、下载运行

当然也可以通过https://github.com/TimothyYe/godns/releases地址来下载最新版。 mkdir /usr/local/godns cd /usr/local/godns wget https://github.com/TimothyYe/godns/releases/download/V1.6/godns-linux64-1.6.tar.gz wget -N --no-check-certificate https://raw.githubusercontent.com/TimothyYe/godns/master/config_sample.json wget -N --no-check-certificate https://raw.githubusercontent.com/TimothyYe/godns/master/systemd/godns.service 接下来解压文件,把配置文件重命名:
tar zxvf godns-linux64-1.6.tar.gz mv config_sample.json config.json 修改config.json文件 以下几行是必须修改的范例: { "login_token": "your_id,your_token", "domains": [{ "domain_name": "example.com", "sub_domains": ["www","test"] },{ "domain_name": "example2.com", "sub_domains": ["www","test"] } ], } your_id和your_token都是DNSPod API token中的配置,www、test都是需要配置动态DNS的example.com和example2.com的子域名。这里的子域名还可以修改为*,变成泛域名解析。
接下来就可以直接运行godns了。 ./godns 以下为运行结果。
可以看出来这个每个5分钟检查 一遍IP地址是否有变化,如果有变化就按照config配置文件中的API更新IP地址,这样可以避免频繁使用API造成超出限制。

添加服务

为了方便系统自动启动的时候运行与常驻后台,建议把godns添加成系统服务。之前我们已经把服务文件下载下来了,现在还需要修改里面的配置。 vi godns.service 然后根据自己godns的地址修改 [Unit] Description=GoDNS Service After=network.target

[Service] ExecStart=/usr/local/godns/godns -c=/usr/local/godns/config.json Restart=always KillMode=process RestartSec=2s

[Install] WantedBy=multi-user.target 接下里拷贝到系统服务中并添加到自动启动中,并启动服务。妥! cp godns.service /lib/systemd/system sudo systemctl enable godns sudo systemctl start godns 至于Cloudflare、 HE.net的使用方法请参考官网。Email通知跟代理服务器也请参考官网配置。
---------------------------------------------------------------------------------------

开源项目: DynDNS 

鉴于DNSPod的开放性,以及完备的API,给第三方工具提供了很不错的开发平台。写上篇blog的时候,俺就提到过,要做一个ruby实现的DDNS脚本工具,两个月过去了,利用拼凑起来的时间,断断续续,这个工具算是成型了。在我的BT下载机跑过一段时间,效果令人满意!
打算把这个程序开源了,放在GitHub上,供广大BT爱好者使用。
项目地址:https://github.com/TimothyYe/DynDNS
下面简单介绍一下使用方法:
运行前,请确保你的机器已经配置了Ruby运行环境,关于如何安装Ruby,建议Google一下,这里推荐一篇靠谱的文章
首先,你得从DNSPod的官网,登陆到你的域名管理界面,添加一个用来进行DDNS解析的A记录,比如你的域名是abc.com,想用bt.abc.com来做DDNS解析,那么就添加一个名为abc的A记录吧!
然后,是从GitHub上获取代码,你可以通过网页下载的方式,如果你已经装有git工具,可以直接clone一个下来:
1
git clone git://github.com/TimothyYe/DynDNS.git
下载完毕后,进入DynDNS目录,修改Config.rb Config.yaml文件:
1
2
3
4
5
6
7
# Defination of static strings

login_email : "abc@gmail.com"
login_password : "1234"

your_Domain : "abc.com"
your_SubDomain : "bt"
loginemail:是你的DNSPod帐号 loginpassword:是你的DNSPod登陆密码
yourDomain:是你的域名,比如上面提到的abc.com yourSubDomain:是你新添加那个A记录,比如上面提到的“bt”
修改完毕后,保存文件,直接用如下命令运行即可:
1
ruby DynDNS.rb start
脚本大致工作流程:脚本在后台运行,每5分钟,获取一次你的公网IP,如果发现与A记录解析的IP不一致,就更新A记录的IP。
运行后,可以ping你的二级域名,检查IP是否已经更新为你当前的公网IP。
另外,还可以在当前目录中生成的logger.txt中,查看程序运行日志!

备注:目前脚本只支持单个域名以及单个A记录解析与更新的模式,以后会考虑加入多域名、多A记录解析的支持。

No comments:

Post a Comment