<?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>Fri, 18 Jun 2010 18:05:52 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</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[linux]]></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脚本。 [bash] #!/bin/bash function usage { echo &#8220;Usage: $0 {host} {shared_key}&#8221; } if test -z $1 &#124;&#124; test -z $2 then usage exit 1 fi HOST=$1 SHARED_KEY=$2 ENDPOINT=&#8221;http://dynamic.wacao.com/api/plain.php&#8221; TIME=`date +%s` SIGN=`echo -n &#8220;${HOST}${TIME}${SHARED_KEY}&#8221; &#124; sha1sum -t [...]]]></description>
			<content:encoded><![CDATA[<p>有自己的VPS，很多服务都可以自己来做了，例如我自己安装一个VPN用来穿墙。今天用<a href="http://www.powerdns.com/">PowerDNS</a>做了一个动态域名解析服务，替换过去<a href="/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脚本。<br />
[bash]<br />
#!/bin/bash</p>
<p>function usage {<br />
    echo &#8220;Usage: $0 {host} {shared_key}&#8221;<br />
}</p>
<p>if test -z $1 || test -z $2<br />
then<br />
    usage<br />
    exit 1<br />
fi</p>
<p>HOST=$1<br />
SHARED_KEY=$2<br />
ENDPOINT=&#8221;http://dynamic.wacao.com/api/plain.php&#8221;</p>
<p>TIME=`date +%s`<br />
SIGN=`echo -n &#8220;${HOST}${TIME}${SHARED_KEY}&#8221; | sha1sum -t | awk &#8216;{print $1}&#8217;`<br />
URL=&#8221;${ENDPOINT}?host=${HOST}&#038;time=${TIME}&#038;sign=${SIGN}&#8221;<br />
curl &#8220;$URL&#8221;<br />
[/bash]</p>
<p>执行后立即能够解析，TTL为5秒。<br />
[plain gutter="false"]<br />
$ update-dynamic-dns.sh testing d035cdac09dd866ed8f4a244567c4daf<br />
ok. 58.33.69.77<br />
$ host testing.dynamic.wacao.com.<br />
testing.dynamic.wacao.com has address 58.33.69.77<br />
[/plain]</p>
<p>我将这个脚本加到crontab里，每5分钟更新一次。<br />
[plain gutter="false"]<br />
*/5 * * * * /usr/local/sbin/update-dynamic-dns.sh ${HOST} ${SHARED_KEY}<br />
[/plain]</p>
<p>如果觉得testing.dynamic.wacao.com这样的域名不好看，而且你有自己的域名，可以想我一样，给自己的域名加一个CNAME。例如我把alcohol.swanpan.com做了一个CNAME指到alcohol.dynamic.wacao.com<br />
[plain gutter="false"]<br />
;; ANSWER SECTION:<br />
alcohol.swanpan.com.	86400	IN	CNAME	alcohol.dynamic.wacao.com.<br />
alcohol.dynamic.wacao.com. 5	IN	A	58.33.69.77<br />
[/plain]<br />
这样我在各个地方都能用alcohol.swanpan.com这个域名访问家里的机器，方便<a href="/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/ [python] #!/usr/bin/env python import cookielib import urllib import urllib2 import time import sys def ddd_checkip(): response = urllib2.urlopen(&#8220;http://www.dragonsoft.net/checkip.php&#8221;) return response.read() def ddd_hello(opener): return opener.open(&#8220;http://www.dns-diy.com/skin.aspx?skin=api&#8221;) def ddd_login(opener, username, password): request = urllib2.Request(&#8220;https://www.dns-diy.com/api/login.aspx&#8221;) params = urllib.urlencode({&#8220;username&#8221;:username, &#8216;password&#8217;:password}) request.add_data(params) return opener.open(request) def ddd_logout(opener): request = urllib2.Request(&#8220;http://www.dns-diy.com/api/logout.aspx?immediately=yes&#038;invalidate=yes&#8221;) return opener.open(request) def ddd_update_rr(opener, id, name, type, data, aux, ttl): [...]]]></description>
			<content:encoded><![CDATA[<p>宿舍的宽带好，写了一个简单的python脚本，自动更新域名解析到动态的IP地址，这样我就可以随时访问宿舍里的机器了。<br />
<a href="http://swanpan.com/phpsysinfo/">http://swanpan.com/phpsysinfo/</a></p>
<p>[python]<br />
#!/usr/bin/env python</p>
<p>import cookielib<br />
import urllib<br />
import urllib2<br />
import time<br />
import sys</p>
<p>def ddd_checkip():<br />
        response = urllib2.urlopen(&#8220;http://www.dragonsoft.net/checkip.php&#8221;)<br />
        return response.read()</p>
<p>def ddd_hello(opener):<br />
        return opener.open(&#8220;http://www.dns-diy.com/skin.aspx?skin=api&#8221;)</p>
<p>def ddd_login(opener, username, password):<br />
        request = urllib2.Request(&#8220;https://www.dns-diy.com/api/login.aspx&#8221;)<br />
        params = urllib.urlencode({&#8220;username&#8221;:username, &#8216;password&#8217;:password})<br />
        request.add_data(params)<br />
        return opener.open(request)</p>
<p>def ddd_logout(opener):<br />
        request = urllib2.Request(&#8220;http://www.dns-diy.com/api/logout.aspx?immediately=yes&#038;invalidate=yes&#8221;)<br />
        return opener.open(request)</p>
<p>def ddd_update_rr(opener, id, name, type, data, aux, ttl):<br />
        request = urllib2.Request(&#8220;http://www.dns-diy.com/api/zone_rr_update.aspx&#8221;)<br />
        params = urllib.urlencode({&#8220;id&#8221;:id, &#8220;rr_name&#8221;:name, &#8220;rr_type&#8221;:type, &#8220;rr_data&#8221;:data, &#8220;rr_aux&#8221;:aux, &#8220;rr_ttl&#8221;:ttl})<br />
        request.add_data(params)<br />
        return opener.open(request)</p>
<p>#<br />
#<br />
#</p>
<p>DEBUG = 5<br />
SLEEP_SECONDS = 600</p>
<p>USERNAME = &#8220;swanpan.com&#8221;<br />
PASSWORD = &#8220;secure&#8221;<br />
RR_ID    = &#8220;secure&#8221;<br />
RR_NAME  = &#8220;&#8221;<br />
RR_TYPE  = &#8220;A&#8221;<br />
RR_DATA  = &#8220;127.0.0.1&#8243;<br />
RR_AUX   = &#8220;0&#8243;<br />
RR_TTL   = &#8220;5&#8243;</p>
<p>def ddd_process():<br />
        if (DEBUG > 0):<br />
                print &#8220;[%(time)s] updating %(host)s.%(zone)s (%(ip)s) &#8230;&#8221; % \<br />
                        {&#8220;time&#8221;:time.strftime(&#8220;%Y-%m-%d %H:%M:%S&#8221;, time.localtime()), \<br />
                        &#8220;host&#8221;:RR_NAME, &#8220;zone&#8221;:USERNAME, &#8220;ip&#8221;:RR_DATA}</p>
<p>        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.CookieJar()))</p>
<p>        response = ddd_hello(opener)<br />
        if (DEBUG > 5):<br />
                print &#8220;HELLO&#8221;<br />
                print response.read()</p>
<p>        response = ddd_login(opener, USERNAME, PASSWORD)<br />
        if (DEBUG > 5):<br />
                print &#8220;LOGIN&#8221;<br />
                print response.read()</p>
<p>        response = ddd_update_rr(opener, RR_ID, RR_NAME, RR_TYPE, RR_DATA, RR_AUX, RR_TTL)<br />
        if (DEBUG > 5):<br />
                print &#8220;UPDATE&#8221;<br />
                print response.read()</p>
<p>        response = ddd_logout(opener)<br />
        if (DEBUG > 5):<br />
                print &#8220;LOGOUT&#8221;<br />
                print response.read()</p>
<p>        if (DEBUG > 0):<br />
                print &#8220;[%(time)s] Finished!&#8221; % \<br />
                        {&#8220;time&#8221;:time.strftime(&#8220;%Y-%m-%d %H:%M:%S&#8221;, time.localtime())}</p>
<p>while True:<br />
        try:<br />
                ip = ddd_checkip()<br />
                if (RR_DATA != ip):<br />
                        RR_DATA = ip<br />
                        ddd_process()<br />
        except:<br />
                if (DEBUG > 4):<br />
                        print &#8220;Unexpected error:&#8221;, sys.exc_info()[0]</p>
<p>        time.sleep(SLEEP_SECONDS)<br />
[/python]</p>
]]></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>
