<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Erning.write() &#187; dns</title>
	<atom:link href="http://erning.net/tags/dns/feed" rel="self" type="application/rss+xml" />
	<link>http://erning.net</link>
	<description>Reloading</description>
	<lastBuildDate>Thu, 15 Sep 2011 10:04:33 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>动态域名解析服务</title>
		<link>http://erning.net/archives/dynamic-domain-service</link>
		<comments>http://erning.net/archives/dynamic-domain-service#comments</comments>
		<pubDate>Sun, 24 Jan 2010 19:21:58 +0000</pubDate>
		<dc:creator>erning</dc:creator>
				<category><![CDATA[Tech]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[dns]]></category>

		<guid isPermaLink="false">http://erning.net/?p=205</guid>
		<description><![CDATA[有自己的VPS，很多服务都可以自己来做了，例如我自己安装一个VPN用来穿墙。今天用PowerDNS做了一个动态域名解析服务，替换过去老旧的方法。现在不仅可以自己用，还可以提供给其他有动态域名解析需求的同学。 更新域名的API很简单，一个HTTP请求即可。API地址是: http://dynamic.wacao.com/api/plain.php，参数为， host &#8211; 主机名，FQDN为 ${host}.dynamic.wacao.com time &#8211; unixtime形式的请求时间，时间误差在正负5分钟内有效 sign &#8211; 签名，格式为 sha1(${host}${time}${shared_key}) ip &#8211; 可选。如果未提供IP地址则采用客户端请求的来源地址 其中host和shared_key需要我来提供。这里提供一个的host和shared_key给大家测试。testing d035cdac09dd866ed8f4a244567c4daf。域名为testing.dynamic.wacao.com.。 由于仅是一个HTTP请求，客户端很容易用各种语言实现。我自己用的是一个简单的shell脚本。 #!/bin/bash function usage { echo "Usage: $0 {host} {shared_key}" } if test -z $1 &#124;&#124; test -z $2 then usage exit 1 fi HOST=$1 SHARED_KEY=$2 ENDPOINT="http://dynamic.wacao.com/api/plain.php" TIME=`date +%s` SIGN=`echo -n "${HOST}${TIME}${SHARED_KEY}" &#124; sha1sum -t &#124; [...]]]></description>
			<content:encoded><![CDATA[<p>有自己的VPS，很多服务都可以自己来做了，例如我自己安装一个VPN用来穿墙。今天用<a href="http://www.powerdns.com/">PowerDNS</a>做了一个动态域名解析服务，替换过去<a href="http://erning.net/archives/dynamic-dns-diy">老旧的方法</a>。现在不仅可以自己用，还可以提供给其他有动态域名解析需求的同学。</p>
<p>更新域名的API很简单，一个HTTP请求即可。API地址是: <strong>http://dynamic.wacao.com/api/plain.php</strong>，参数为，</p>
<ul>
<li>host &#8211; 主机名，FQDN为 ${host}.dynamic.wacao.com</li>
<li>time &#8211; unixtime形式的请求时间，时间误差在正负5分钟内有效</li>
<li>sign &#8211; 签名，格式为 sha1(${host}${time}${shared_key}) </li>
<li>ip &#8211; 可选。如果未提供IP地址则采用客户端请求的来源地址</li>
</ul>
<p>其中host和shared_key需要我来提供。这里提供一个的host和shared_key给大家测试。<strong>testing</strong> <strong>d035cdac09dd866ed8f4a244567c4daf</strong>。域名为<strong>testing.dynamic.wacao.com.</strong>。</p>
<p>由于仅是一个HTTP请求，客户端很容易用各种语言实现。我自己用的是一个简单的shell脚本。</p>
<pre>
#!/bin/bash

function usage {
    echo "Usage: $0 {host} {shared_key}"
}

if test -z $1 || test -z $2
then
    usage
    exit 1
fi

HOST=$1
SHARED_KEY=$2
ENDPOINT="http://dynamic.wacao.com/api/plain.php"

TIME=`date +%s`
SIGN=`echo -n "${HOST}${TIME}${SHARED_KEY}" | sha1sum -t | awk '{print $1}'`
URL="${ENDPOINT}?host=${HOST}&#038;time=${TIME}&#038;sign=${SIGN}"
curl "$URL"
</pre>
<p>执行后立即能够解析，TTL为5秒。</p>
<pre>
$ update-dynamic-dns.sh testing d035cdac09dd866ed8f4a244567c4daf
ok. 58.33.69.77
$ host testing.dynamic.wacao.com.
testing.dynamic.wacao.com has address 58.33.69.77
</pre>
<p>我将这个脚本加到crontab里，每5分钟更新一次。</p>
<pre>
*/5 * * * * /usr/local/sbin/update-dynamic-dns.sh ${HOST} ${SHARED_KEY}
</pre>
<p>如果觉得testing.dynamic.wacao.com这样的域名不好看，而且你有自己的域名，可以想我一样，给自己的域名加一个CNAME。例如我把alcohol.swanpan.com做了一个CNAME指到alcohol.dynamic.wacao.com</p>
<pre>
;; ANSWER SECTION:
alcohol.swanpan.com.	86400	IN	CNAME	alcohol.dynamic.wacao.com.
alcohol.dynamic.wacao.com. 5	IN	A	58.33.69.77
</pre>
<p>这样我在各个地方都能用alcohol.swanpan.com这个域名访问家里的机器，方便<a href="http://erning.net/archives/my-linux-gateway">用它穿墙</a>。</p>
<p>想试试的朋友告诉我你要的host，我给你发送shared_key。</p>
]]></content:encoded>
			<wfw:commentRss>http://erning.net/archives/dynamic-domain-service/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dynamic DNS-DIY</title>
		<link>http://erning.net/archives/dynamic-dns-diy</link>
		<comments>http://erning.net/archives/dynamic-dns-diy#comments</comments>
		<pubDate>Sun, 02 Apr 2006 05:18:56 +0000</pubDate>
		<dc:creator>erning</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[dns]]></category>

		<guid isPermaLink="false">http://www.erning.net/archives/2006/04/02/dynamic-dns-diy/</guid>
		<description><![CDATA[宿舍的宽带好，写了一个简单的python脚本，自动更新域名解析到动态的IP地址，这样我就可以随时访问宿舍里的机器了。 http://swanpan.com/phpsysinfo/ #!/usr/bin/env python import cookielib import urllib import urllib2 import time import sys def ddd_checkip(): response = urllib2.urlopen("http://www.dragonsoft.net/checkip.php") return response.read() def ddd_hello(opener): return opener.open("http://www.dns-diy.com/skin.aspx?skin=api") def ddd_login(opener, username, password): request = urllib2.Request("https://www.dns-diy.com/api/login.aspx") params = urllib.urlencode({"username":username, 'password':password}) request.add_data(params) return opener.open(request) def ddd_logout(opener): request = urllib2.Request("http://www.dns-diy.com/api/logout.aspx?immediately=yes&#038;invalidate=yes") return opener.open(request) def ddd_update_rr(opener, id, name, type, data, aux, ttl): request [...]]]></description>
			<content:encoded><![CDATA[<p>宿舍的宽带好，写了一个简单的python脚本，自动更新域名解析到动态的IP地址，这样我就可以随时访问宿舍里的机器了。<br />
<a href="http://swanpan.com/phpsysinfo/">http://swanpan.com/phpsysinfo/</a></p>
<pre>
#!/usr/bin/env python

import cookielib
import urllib
import urllib2
import time
import sys

def ddd_checkip():
        response = urllib2.urlopen("http://www.dragonsoft.net/checkip.php")
        return response.read()

def ddd_hello(opener):
        return opener.open("http://www.dns-diy.com/skin.aspx?skin=api")

def ddd_login(opener, username, password):
        request = urllib2.Request("https://www.dns-diy.com/api/login.aspx")
        params = urllib.urlencode({"username":username, 'password':password})
        request.add_data(params)
        return opener.open(request)

def ddd_logout(opener):
        request = urllib2.Request("http://www.dns-diy.com/api/logout.aspx?immediately=yes&#038;invalidate=yes")
        return opener.open(request)

def ddd_update_rr(opener, id, name, type, data, aux, ttl):
        request = urllib2.Request("http://www.dns-diy.com/api/zone_rr_update.aspx")
        params = urllib.urlencode({"id":id, "rr_name":name, "rr_type":type, "rr_data":data, "rr_aux":aux, "rr_ttl":ttl})
        request.add_data(params)
        return opener.open(request)

#
#
#

DEBUG = 5
SLEEP_SECONDS = 600

USERNAME = "swanpan.com"
PASSWORD = "secure"
RR_ID    = "secure"
RR_NAME  = ""
RR_TYPE  = "A"
RR_DATA  = "127.0.0.1"
RR_AUX   = "0"
RR_TTL   = "5"

def ddd_process():
        if (DEBUG > 0):
                print "[%(time)s] updating %(host)s.%(zone)s (%(ip)s) ..." % \
                        {"time":time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), \
                        "host":RR_NAME, "zone":USERNAME, "ip":RR_DATA}

        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))

        response = ddd_hello(opener)
        if (DEBUG > 5):
                print "HELLO"
                print response.read()

        response = ddd_login(opener, USERNAME, PASSWORD)
        if (DEBUG > 5):
                print "LOGIN"
                print response.read()

        response = ddd_update_rr(opener, RR_ID, RR_NAME, RR_TYPE, RR_DATA, RR_AUX, RR_TTL)
        if (DEBUG > 5):
                print "UPDATE"
                print response.read()

        response = ddd_logout(opener)
        if (DEBUG > 5):
                print "LOGOUT"
                print response.read()

        if (DEBUG > 0):
                print "[%(time)s] Finished!" % \
                        {"time":time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())}

while True:
        try:
                ip = ddd_checkip()
                if (RR_DATA != ip):
                        RR_DATA = ip
                        ddd_process()
        except:
                if (DEBUG > 4):
                        print "Unexpected error:", sys.exc_info()[0]

        time.sleep(SLEEP_SECONDS)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://erning.net/archives/dynamic-dns-diy/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>DNS-DIY</title>
		<link>http://erning.net/archives/dns-diy</link>
		<comments>http://erning.net/archives/dns-diy#comments</comments>
		<pubDate>Sat, 20 Sep 2003 21:28:26 +0000</pubDate>
		<dc:creator>erning</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[dns]]></category>

		<guid isPermaLink="false">http://www.erning.net/archives/2003/09/21/dns-diy/</guid>
		<description><![CDATA[DNS-DIY is a DNS control system. After 3 months run, it hosts 12,471 zones currently. And the number is increasing everyday. I believe it is able to host 100,000 zones smoothly under current hardware configuration. DNS-DIY accepts domain names registered by OnlineNIC only for business policy. Reference, http://www.dns-diy.com]]></description>
			<content:encoded><![CDATA[<p>DNS-DIY is a DNS control system. After 3 months run, it hosts 12,471 zones currently. And the number is increasing everyday. I believe it is able to host 100,000 zones smoothly under current hardware configuration.</p>
<p>DNS-DIY accepts domain names registered by OnlineNIC only for business policy.</p>
<p>Reference,<br />
<a href="http://www.dns-diy.com">http://www.dns-diy.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://erning.net/archives/dns-diy/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

