| Динамический DNS с использованием ISPmanager и собственного домена |
|
|
|
| Статьи - Unix |
|
Используется виртуальный выделенный сервер (VDS) с ISPmanager на хостинге FirstVDS (или ISPserver, это не важно, подойдет любой хостинг с ISPmanager и возможностью самостоятельно управлять записями в DNS) Автором скрипта на PHP является Pavel Pacific - webxed один специальный знак gmail еще один знак com. Идея использования средств API ISPmanager (первоначально поднятая в рассылке webdev) для автоматического обновления зоны придумана мной Алгоритм работы Dynamic DNS (динамического DNS с использованием собственнного домена): Панель ISPmanager позволяет править конфиги DNS простыми запросами по https и соответственно можно сделать все используя PHP-скрипт.1) У панели есть API, использую который можно менять записи в DNS. В документации есть подробное описание. A</type><addr>10.10.10.12</addr><key>home A 10.10.10.12</key></elem> б) Редактируем запись в DNS https://127.0.0.1/manager/ispmgr?authinfo=LOGIN:PASSWORD&out=xml&name=home&sdtype=A&addr=NEW_IP&func=domain.sublist.edit&elid=home+A++10.10.10.12&plid=domain.com&sok=yes" Где LOGIN:PASSWORD - логин-пароль юзера который владелец домена в панели NEW_IP - адрес который надо сделать у записи home типа A в домене, получаешь из адреса с которого обратились к скрипту. domain.com - собственно твой домен, в котором запись правится home - запись которая вносится в DNS home+A++10.10.10.12 - <key>home A 10.10.10.12</key> - уникальный идентификатор элемента списка 4) дергаете со своего компа периодически этот PHP-скрипт чем-либо ("планировщик windows" + wget.exe раз в 5-10 минут) Собственно все. Ты будешь обновлять свой home.domain.com на новый адрес в DNS и будет работать свой собственный DynDNS. Hint: В конфиге панели (/usr/local/ispmgr/etc/ispmgr.conf) включить LogLevel 9 (в первой строке написать и затем killall ispmgr и заново открыть в браузере), смотреть /usr/local/ispmgr/var/ispmgr.log, можно создать запись вручную и смотреть что именно передается, и если что не работает, тоже видно все. Теперь собственно скрипт - все права на него принадлежат его автору. Написан ровненько, я так писать не умею :): <? $D = new ISP_class( __ЛОГИН__, __ПАРОЛЬ__); $D->F_domain_sublist_edit(__ДОМЕН__, __ПОДДОМЕН__); class ISP_class { public $IP = null; private $Auth = null; private $Login = ''; private$Pass = ''; private $xml = null; function __construct( $login = '', $pass = '' ) { $this->IP = $_SERVER['REMOTE_ADDR']; echo "\n".print_r($this->IP, true); $this->Login = $login; $this->Pass = $pass; $this->F_auth(); } public function F_auth() { $this->Query( array('func' => 'auth', 'username' => $this->Login, 'password' => $this->Pass) ); $this->Auth = (string) $this->xml->auth; echo "\n this->Auth: ".$this->Auth; } public function F_domain_sublist_edit( $domain = '', $subd = '' ) { $subinfo = $this->F_domain_sublist( $domain, $subd ); if( is_array($subinfo) && ($subinfo['addr'] !== $this->IP) ) { $this->Query( $i = array( 'func' => 'domain.sublist.edit', 'sok' => 'yes', 'plid' => $domain, // Домен первог оуровня 'name' => $subinfo['name'], // новое имя 'sdtype' => $subinfo['type'], // новый тип 'addr' => $this->IP, // новый IP 'elid' => str_replace(' ', '+', $subinfo['key']), // ключ текущей записи ) ); echo "\n Update info: ".print_r($i, true); echo "\n return: ".print_r($this->xml, true); } else echo "\n No changes."; } public function F_domain_sublist( $domain = '', $subd = '' ) { if( empty($domain) ) return; $this->Query( array('func' => 'domain.sublist', 'elid' => $domain) ); foreach($this->xml->elem as $e) { if( (string) $e->name == $subd ) { echo "\n ".print_r($e, true); return (array) $e; } } return null; } private function Query( $q = array() ) { if( empty($q) ) return false; if( ! empty($this->ISP_authID) ) { $q += array( 'auth' => $this->ISP_authID); } $url = 'https://127.0.0.1/manager/ispmgr?out=xml'; foreach( $q as $k => $v ) { $url .= '&'.$k.'='.$v; //urlencode($v); } // echo "\n Q: ".print_r($url, true)."\n"; $this->xml = simplexml_load_file( $url ); } } ?>
|



