Главная страница Статьи / Unix Динамический DNS с использованием ISPmanager и собственного домена

Рекомендую - скидка 25%

Баннер

Поиск по сайту

Добавить в закладки!

odnaknopka.ru/kolyan.cz

Динамический DNS с использованием ISPmanager и собственного домена PDF Печать E-mail
Статьи - 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. В документации есть подробное описание.


2) У зоны следует поставить маленький TTL (поправить руками в файле зоны, минут 5 вполне хватит)

3) Далее, написать PHP-скрипт (нужен xml и curl) который периодически чем-либо, скачивать с домашнего компа, в скрипте получаешь
REMOTE_ADDR, и далее:

a) Получаем старый адрес (список записей домена) который был, чтобы править правильную запись (key)

https://127.0.0.1/manager/ispmgr?authinfo=LOGIN:PASSWORD&out=xml&func=domain.sublist&elid=domain.com

Оттуда берем скажем
<elem><name>home</name><type>

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 );
 }
  


?>

 

 
Документация @ Ihtiandr.Info