<?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>The WebDevil &#187; PowerDNS</title>
	<atom:link href="http://dmitry.shaposhnik.name/category/powerdns/feed/" rel="self" type="application/rss+xml" />
	<link>http://dmitry.shaposhnik.name</link>
	<description>Enjoy development</description>
	<lastBuildDate>Mon, 24 May 2010 01:29:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PowerDNS &#8211; master and slave</title>
		<link>http://dmitry.shaposhnik.name/2009/06/25/powerdns-master-and-slave/</link>
		<comments>http://dmitry.shaposhnik.name/2009/06/25/powerdns-master-and-slave/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 08:49:48 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Newbie]]></category>
		<category><![CDATA[PowerDNS]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=285</guid>
		<description><![CDATA[В связи с переездом на новый сервер пришлось переносить и кучу сервисов, которые крутились на старом. Одним из них был DNS.
Настоятельно рекомендуется делать master и slave (primary и secondary) на разных машинах, дабы в случае отказа одного из них второй мог полноценно работать. Ну это в теории, на практике все несколько упрощается до одного сервера, [...]]]></description>
			<content:encoded><![CDATA[<p>В связи с переездом на новый сервер пришлось переносить и кучу сервисов, которые крутились на старом. Одним из них был DNS.</p>
<p>Настоятельно рекомендуется делать master и slave (primary и secondary) на разных машинах, дабы в случае отказа одного из них второй мог полноценно работать. Ну это в теории, на практике все несколько упрощается до одного сервера, который если ляжет &#8211; то DNS будет уже не столь важен.</p>
<p>Начал подымать master на OpenSuSE 11.1. Конфиг простой и незамысловатый:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#each slave should be put here (space separated) to allow zone details transfer</span><br />
allow-axfr-ips=1.1.1.2<br />
disable-axfr=no<br />
<span style="color: #007800;">daemon</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
<span style="color: #007800;">guardian</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
default-ttl=<span style="color: #000000;">3600</span><br />
soa-refresh-default=<span style="color: #000000;">3600</span><br />
lazy-recursion=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
local-address=0.0.0.0<br />
<span style="color: #007800;">master</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
<span style="color: #007800;">recursor</span>=127.0.0.1:<span style="color: #000000;">5300</span><br />
<span style="color: #007800;">launch</span>=gmysql<br />
gmysql-host=localhost<br />
gmysql-port=<span style="color: #000000;">3306</span><br />
gmysql-dbname=powerdns<br />
gmysql-user=powerdns<br />
gmysql-password=powerdns<br />
gmysql-socket=<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>run<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/</span>mysql.sock</div></div>
<p>и рекурсор:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #007800;">chroot</span>=<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>pdns<br />
local-address=127.0.0.1<br />
local-port=<span style="color: #000000;">5300</span><br />
<span style="color: #007800;">setgid</span>=pdns<br />
<span style="color: #007800;">setuid</span>=pdns</div></div>
<p>Базу для него создавал из <a href="http://www.opensourcery.co.za/powerdns-on-rails/">PowerDNS on Rails</a>, хотя можно ограничиться и той, <a href="http://doc.powerdns.com/configuring-db-connection.html#CONFIGURING-MYSQL">что в документации</a>.</p>
<p>И напоролся на первый занятный баг &#8211; со включенным режимом master он взлетает и долбит базу одинаковыми запросами (пытается получить все записи). На стоящей рядом ubuntu с той же версией такого не наблюдается. Долго пытался отловить что, где и почему &#8211; и решил пересобрать из сорсов. Когда обнаружилась нехватка boost я решил проверить, а нет ли готового свеженького пакета с собраным powerdns? Таки есть &#8211; надо было всего лишь добавить в списки репо вот этот:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">http://download.opensuse.org/repositories/server:/dns/openSUSE_11.1/</div></div>
<p>и была установлена версия pdns-2.9.22-1.1. Проблема с нагрузкой на БД полечилась, но появилась новая &#8211; с репликацией на slave.</p>
<p>В PowerDNS есть такое понятие как supermaster. В общем случае нужно прописывать зону на мастере и слейве. Когда слейв получит от мастера notify, он запросит у мастера записи из этой зоны. Но если сервер, от которого пришел notify, будет обнаружен в списке supermasters, и такой зоны на слейве не будет описано, она создастся автоматически. И потом в нее будут добавлены записи с мастера. Это приятно упрощает жизнь <img src='http://dmitry.shaposhnik.name/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  В табличке запись довольно простая &#8211; ip мастера, имя слейва (ns2.example.org), имя аккаунта (на работу никак не влияет &#8211; просто будет фигурировать в описании зоны; удобно для указания клиента, например).</p>
<p>В порядке эксперимента попинал слейв нотификейшенами для разных доменов. Не с первого раза, но заработало:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">pdns_control notify example.org</div></div>
<p>С первого раза не заработало потому, что в PowerDNS on Rails в имя поддомена по привычке вписал &#8220;@&#8221;, и потом получил записи вида &#8220;@.example.org&#8221; вместо &#8220;example.org&#8221; либо &#8220;@&#8221;. Прошелся простым апдейтом по базе и убрал этот баг.</p>
<p>PS: Хочу выразить благодарность Патрику Фею (<a href="http://blog.nachtarbeiter.net/about/">Patrick Fey</a>) за его <a href="http://blog.nachtarbeiter.net/2009/04/23/powerdns-on-debian-lenny-sarge-or-woody-2/">недавний пост</a>, который помог постичь смысл supermaster&#8217;ов.</p>
<p>PPS: конфиг pdns для слейва мало чем отличается от мастера:</p>
<div class="codecolorer-container bash default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">config-dir=<span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>powerdns<br />
<span style="color: #007800;">daemon</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
disable-axfr=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
<span style="color: #007800;">guardian</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
<span style="color: #007800;">launch</span>=gmysql<br />
lazy-recursion=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
local-address=0.0.0.0<br />
local-port=<span style="color: #000000;">53</span><br />
module-dir=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>powerdns<br />
<span style="color: #007800;">setgid</span>=pdns<br />
<span style="color: #007800;">setuid</span>=pdns<br />
<span style="color: #007800;">slave</span>=<span style="color: #c20cb9; font-weight: bold;">yes</span><br />
socket-dir=<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>run<br />
version-string=powerdns<br />
gmysql-host=localhost<br />
gmysql-port=<span style="color: #000000;">3306</span><br />
gmysql-dbname=powerdns<br />
gmysql-user=powerdns<br />
gmysql-password=powerdns</div></div>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2009/06/25/powerdns-master-and-slave/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PowerDNS URL records and redirector</title>
		<link>http://dmitry.shaposhnik.name/2008/07/25/powerdns-url-records-and-redirector/</link>
		<comments>http://dmitry.shaposhnik.name/2008/07/25/powerdns-url-records-and-redirector/#comments</comments>
		<pubDate>Fri, 25 Jul 2008 19:43:21 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Browsers]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[PowerDNS]]></category>
		<category><![CDATA[lighttpd]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=205</guid>
		<description><![CDATA[В PowerDNS есть пара плюшек, которые я раньше не замечал. Одну из них &#8211; записи &#8220;URL&#8221; я сегодня попробовал, настроил и остался вполне доволен.
Что же такое URL-запись? Это фича PowerDNS, при помощи которой можно делать редирект домена на заданный URL.
Например, запись выглядит как
some.domain.com URL http://other.domain.com/some_domain_com
На самом деле в поле со значением записи может быть ссылка [...]]]></description>
			<content:encoded><![CDATA[<p>В PowerDNS есть пара плюшек, которые я раньше не замечал. Одну из них &#8211; записи &#8220;URL&#8221; я сегодня попробовал, настроил и остался вполне доволен.</p>
<p>Что же такое URL-запись? Это фича PowerDNS, при помощи которой можно делать редирект домена на заданный URL.<br />
Например, запись выглядит как</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">some.domain.com URL http://other.domain.com/some_domain_com</div></div>
<p>На самом деле в поле со значением записи может быть ссылка куда угодно.<br />
В конфиге сервера нужно указать</p>
<div class="codecolorer-container ini default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">...<br />
<span style="color: #000099;">fancy-records</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">yes</span><br />
<span style="color: #000099;">urlredirector</span><span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;">77.120.99.180</span><br />
...</div></div>
<p>Когда приходит запрос к DNS&#8217;у для домена some.domain.com отдается 77.120.99.180, указанный в конфиге, как если бы это была обычная &#8220;А&#8221;-запись.<br />
Браузер отрезолвив имя идет на http://some.domain.com. На этом адресе висит http-сервер (я повесил lighttpd), у которого скрипт лезет в БД и для указанного домена ищет соответствующую ему URL-запись и редиректит браузер туда. Все просто и тривиально.</p>
<p>Для lighttpd у меня конфиг дополнился такими строками:</p>
<div class="codecolorer-container ini default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ini codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">$SERVER<span style="">&#91;</span><span style="color: #933;">&quot;socket&quot;</span><span style="">&#93;</span> <span style="color: #000066; font-weight:bold;">==</span> <span style="color: #933;">&quot;77.120.99.180:80&quot;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp; $HTTP<span style="">&#91;</span><span style="color: #933;">&quot;host&quot;</span><span style="">&#93;</span> <span style="color: #000066; font-weight:bold;">=</span>~ <span style="color: #933;">&quot;(.*)&quot;</span> <span style="">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; magnet.attract-raw-url-to <span style="color: #000066; font-weight:bold;">=</span><span style="color: #660066;"> <span style="">&#40;</span></span><span style="color: #933;">&quot;/var/www/lighttpd/pdns-url-redirector.lua&quot;</span><span style="">&#41;</span><br />
&nbsp; &nbsp; <span style="">&#125;</span><br />
<span style="">&#125;</span></div></div>
<p>То есть все что приходит незамедлительно обрабатывается упомянутым lua-скриптом. Почему <a href="http://www.lua.org/">lua</a>? С ним работает <a href="http://trac.lighttpd.net/trac/wiki/Docs:ModMagnet">mod_magnet</a>, и мне было интересно написать этот скриптик. Вот он:</p>
<div class="codecolorer-container lua default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="lua codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #b1b100;">require</span> <span style="color: #ff0000;">&quot;luasql.mysql&quot;</span><br />
env <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">assert</span> <span style="color: #66cc66;">&#40;</span>luasql.mysql<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
con <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">assert</span> <span style="color: #66cc66;">&#40;</span>env:connect<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;dnsdb&quot;</span>, <span style="color: #ff0000;">&quot;dns_user&quot;</span>, <span style="color: #ff0000;">&quot;dns_pass_for_readonly_records_table&quot;</span>, <span style="color: #ff0000;">&quot;localhost&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
domain <span style="color: #66cc66;">=</span> lighty.request<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;Host&quot;</span><span style="color: #66cc66;">&#93;</span> <br />
<br />
mysql_replacements <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span> <br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\0</span>&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>0&quot;</span>,<br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>n&quot;</span>,<br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\r</span>&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>r&quot;</span>,<br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\'</span>&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span>,<br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span><span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span>,<br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\0</span>26&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>Z&quot;</span>,<br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\b</span>&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>b&quot;</span>,<br />
&nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>t&quot;</span>,<br />
<span style="color: #66cc66;">&#125;</span><br />
<br />
<span style="color: #b1b100;">function</span> fixsql <span style="color: #66cc66;">&#40;</span>s<span style="color: #66cc66;">&#41;</span><br />
&nbsp; <span style="color: #b1b100;">return</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">string.gsub</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">tostring</span> <span style="color: #66cc66;">&#40;</span>s<span style="color: #66cc66;">&#41;</span>, <span style="color: #ff0000;">&quot;[%z<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\r</span><span style="color: #000099; font-weight: bold;">\'</span><span style="color: #000099; font-weight: bold;">\&quot;</span><span style="color: #000099; font-weight: bold;">\0</span>26<span style="color: #000099; font-weight: bold;">\b</span><span style="color: #000099; font-weight: bold;">\t</span>]&quot;</span>, <br />
&nbsp; &nbsp; <span style="color: #b1b100;">function</span> <span style="color: #66cc66;">&#40;</span>str<span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">return</span> mysql_replacements <span style="color: #66cc66;">&#91;</span>str<span style="color: #66cc66;">&#93;</span> <span style="color: #b1b100;">or</span> str<br />
&nbsp; &nbsp; <span style="color: #b1b100;">end</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #b1b100;">end</span> <span style="color: #808080; font-style: italic;">-- fixsql</span><br />
<br />
cur <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">assert</span> <span style="color: #66cc66;">&#40;</span>con:<span style="color: #b1b100;">execute</span><span style="color: #66cc66;">&#40;</span> <span style="color: #b1b100;">string.format</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;SELECT content FROM records WHERE `type` = 'URL' AND `name` = '%s'&quot;</span>, fixsql<span style="color: #66cc66;">&#40;</span>domain<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span><br />
result <span style="color: #66cc66;">=</span> cur:fetch<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #b1b100;">if</span> result <span style="color: #b1b100;">then</span><br />
&nbsp; &nbsp; redirect_to <span style="color: #66cc66;">=</span> <span style="color: #b1b100;">string.format</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;%s&quot;</span>, result<span style="color: #66cc66;">&#41;</span><br />
<span style="color: #b1b100;">else</span><br />
&nbsp; &nbsp; redirect_to <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;http://daemons.org.ua/&quot;</span><br />
<span style="color: #b1b100;">end</span><br />
<br />
cur:close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
con:close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
env:close<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><br />
<br />
<span style="color: #808080; font-style: italic;">--lighty.content = { string.format(&quot;SELECT content FROM records WHERE `type` = 'URL' AND `name` = '%s'&quot;, fixsql(domain) ) &nbsp;}</span><br />
<span style="color: #808080; font-style: italic;">--lighty.header[&quot;Content-Type&quot;] = &quot;text/plain&quot;</span><br />
<span style="color: #808080; font-style: italic;">--return 200</span><br />
<br />
lighty.header<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;Location&quot;</span><span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> redirect_to<br />
<span style="color: #b1b100;">return</span> <span style="color: #cc66cc;">301</span></div></div>
<p>Комментарий начинается с &#8220;&#8211;&#8221;. Закоментарены строки для отладки скрипта.<br />
Для соединения с мускулем из lua доставил пакет liblua5.1-sql-mysql-2.</p>
<p>Скрипт писал долго, но это было интересно. И небесполезно =)</p>
<hr />
<p><strong>UPD</strong>: во избежание DoS/DDoS атаки на мускуль возможны два варианта апгрейда метода:<br />
1. По крону раз в 5 минут генерить sqlite-БД состоящую из одной таблицы из двух полей &#8211; domain, target<br />
2. Раз в 5 минут генерить сам скрипт с вынесенными в него в виде хеша записями. Тогда скрипт вообще никуда подглядывать не будет.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/07/25/powerdns-url-records-and-redirector/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Migration to PowerDNS</title>
		<link>http://dmitry.shaposhnik.name/2008/07/11/migration-to-powerdns/</link>
		<comments>http://dmitry.shaposhnik.name/2008/07/11/migration-to-powerdns/#comments</comments>
		<pubDate>Thu, 10 Jul 2008 22:14:10 +0000</pubDate>
		<dc:creator>dm</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Networking]]></category>
		<category><![CDATA[Newbie]]></category>
		<category><![CDATA[PowerDNS]]></category>
		<category><![CDATA[tutorials]]></category>

		<guid isPermaLink="false">http://dmitry.shaposhnik.name/?p=183</guid>
		<description><![CDATA[Наверняка многие видели сообщение об уязвимости в DNS. Во многих дистрибах линукса весьма скоро появились секьюрити-патчи, которые эту уязвимость исправляли. Уязвимость, может, и не слишком уж страшная, но она напомнила мне о PowerDNS, который я с интересом рассматривал в начале 2008го года.
Расматривал я его в основном из-за родной интеграции с MySQL. Мне весьма понравилось как [...]]]></description>
			<content:encoded><![CDATA[<p>Наверняка многие видели <a href="http://www.opennet.ru/opennews/art.shtml?num=16872">сообщение об уязвимости в DNS</a>. Во многих дистрибах линукса весьма скоро появились секьюрити-патчи, которые эту уязвимость исправляли. Уязвимость, может, и не слишком уж страшная, но она напомнила мне о <a href="http://www.powerdns.com/">PowerDNS</a>, который я с интересом рассматривал в начале 2008го года.</p>
<p>Расматривал я его в основном из-за родной интеграции с MySQL. Мне весьма понравилось как она реализована. Однако у меня были уже рабочие конфиги BIND9, и я просто ленился испытать PowerDNS на собственной шкуре.</p>
<p>А зря боялся, как оказалось. Упомянутая уязвимость не задела PowerDNS, и этим мое внимание было вновь привлечено к нему. И переход таки состоялся.<br />
<span id="more-183"></span></p>
<h2>Что дал переход</h2>
<p>Во-первых, я получил возможность использовать найденый вчера <a href="https://www.poweradmin.org/trac/">poweradmin</a>. Штука оказалась немного неуклюжая, но порадовала меня тем, что не надо более ковыряться в конфигах.</p>
<p>Во-вторых, при изменении/добавлении/удалении записей в зоне маркер (Serial) в SOA меняется сам. Мелочь, но приятно.</p>
<p>В-третьих, теперь можно давать доступ к редактированию зон другим людям.</p>
<p>Вот то, что бросилось мне в глаза. А теперь более подробно о самом переходе.</p>
<h2>Процесс перехода</h2>
<p>PowerDNS состоит из двух компонентов &#8211; основной сервер имен и преобразователь имен. Основной сервер имен выдает информацию только о тех записях, которые в нем есть. Преобразователь имен же помогает резолвить то, чего нету непосредственно у данного сервера.</p>
<p>Итак, понадобится выполнить следующие действия:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">apt-get install pdns-server pdns-recursor pdns-backend-mysql</div></div>
<p>Желательно во время установки стопнуть bind, потому как dpkg будет ругаться из-за неудачного запуска демона.</p>
<p>После установки можно тушить pdns и стартовать bind до окончания миграции.</p>
<p>В конфиге /etc/powerdns/pdns.conf надо сделать следующие изменения:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">...<br />
#allow-recursion=127.0.0.1<br />
...<br />
launch=gmysql<br />
...<br />
local-address=_real_external_ip_here_<br />
...<br />
recursor=127.0.0.1<br />
...</div></div>
<p>Этим мы будем передавать все неизвестные запросы от основного сервера к recursor&#8217;у.<br />
У рекурсора в конфиге стоит local-address=127.0.0.1 по умолчанию, если мне не изменяет память.</p>
<p>В /etc/powerdns/pdns.d/pdns.local вписываем</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">gmysql-host=localhost<br />
gmysql-port=3306<br />
gmysql-dbname=_username_here_<br />
gmysql-user=_dbname_here_<br />
gmysql-password=_dbpass_here_<br />
gmysql-socket=/var/run/mysqld/mysqld.sock</div></div>
<p>Проверяем, есть ли нужная БД и пользователь, и может ли он подключиться к базе.</p>
<p>Пример начальной базы есть в /usr/share/doc/pdns-backend-mysql.<br />
Советую туда сразу добавить в конец</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">ALTER</span> <span style="color: #993333; font-weight: bold;">TABLE</span> records <span style="color: #993333; font-weight: bold;">ADD</span> CONSTRAINT <span style="color: #ff0000;">`records_ibfk_1`</span> <span style="color: #993333; font-weight: bold;">FOREIGN</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`domain_id`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">REFERENCES</span> <span style="color: #ff0000;">`domains`</span><br />
<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`id`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #993333; font-weight: bold;">DELETE</span> CASCADE;</div></div>
<p>При его тестировании было замечено что работает он бытрее с таблицами InnoDB. Наверное, из-за большого кеша у этого типа таблиц. Я не стал менять таблицы на MyISAM, однако добавил при создании таблиц <tt>default collate utf8_general_ci</tt> &#8211; для надежности. </p>
<p>Потом надо втянуть записи имеющиеся у BIND. Для этого в комплекте есть утилита <a href="http://doc.powerdns.com/migration.html">zone2sql</a>. Рекомендую использовать ее с ключиком <tt>--gmysql</tt> &#8211; так она правильнее работает, создавая записи и в domains и в records.</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">zone2sql --named-conf=/etc/bind/named.conf --gmysql &gt; import.sql</div></div>
<p>и вначале выкосил все до основных зон. Потом скормил это mysql&#8217;ю. Также можно во всех <a href="http://doc.powerdns.com/types.html#AEN4582">записях SOA</a> поставить Serial в 0 &#8211; так PowerDNS будет вычислять его автоматически.</p>
<p>Пробуем стопнуть bind9 и запустить pdns и pdns-recursor. Если все правильно &#8211; все взлетит, и в сислоге будут сообщения о состоянии полета.</p>
<p>Проверить можно набрав</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">nslookup - dns.yourserver.com</div></div>
<p>и попробовать ввести что-то существующее на сервере и что-то несуществующее.<br />
У меня основной сервер без recursor&#8217;а не хотел отдавать записи типа CNAME при просмотре nslookup&#8217;ом. Пришлось установит recursor и настроить их общение.</p>
<p>Ну а установка <a href="https://www.poweradmin.org/trac/">poweradmin</a> для управления сервером не должна вызвать трудностей вообще.</p>
]]></content:encoded>
			<wfw:commentRss>http://dmitry.shaposhnik.name/2008/07/11/migration-to-powerdns/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
