DynDNS proxy

И так начну с того, что есть такой провайдер в Саратове - ВолгаТелеком.
Предлагает много услуг, в частности широкополосный интернет (J - джэй) по ADSL.

Есть такое понятие: ФОС - файло-обменная сеть. Т.е. - можно качать друг у друга посредством p2p, открывать свои игровые сервера, веб, ftp, email (дополнить своим ;-)...
Да! Вот только `нормального` интернета нету. Открывается только несколько сайтов. IP адрес при подключении выдаётся динамический (можно купить статический, но здесь не про это ;-).

Решил я воспользоваться сервисом dynamic dns (в интернете несколько таких сервисов), но вот только из под ФОС`а до него нельзя добраться.
Админов, чтобы открыли, как я понял, полазив по форуму, врядли возможно уговорить открыть доступ хоть к одному сервису ddns...

И вот решил я написать что-то типа прокси. Т.е. клиентом (программой) отсылается запрос на web сервер, который доступен из ФОС`а и подключен к `нормальному` интернету запрос на изменение ip адреса для сервиса dyndns.com. Далее скрипт, передаёт информацию на сервер members.dyndns.org, который и делает своё `грязное` дело.

На клиентской стороне работает программа, которая следит за изменением ip адреса и `стучит` серверу в случае его изменения.
Сервис dyndns предлагает несколько клиентов: ссылка1, ссылка2.
`Официального` клиента DynDNS Updater мне не удалось настроить, чтобы он работал через `другой` сервер (я не захотел долго возиться, после того, как в exe`шнике нашёл url на members.dyndns.org).
Зато другой клиент - DirectUpdate прекрасно работает (пришлось немного изменить конфиг (надо положить его в каталог `dns` установленной программы)).


Если кому надо, то вот исходник:
#cat dyndns_proxy.php

<?
  if( strlen($_SERVER["QUERY_STRING"]) == 0)
    die("nothing todo...");

  //пїЅпїЅпїЅпїЅпїЅ
  $cur_dir = getcwd();
  chdir($_SERVER["DOCUMENT_ROOT"] . "/_inc/countler/");
  require_once("include.inc.php");
  counter(); //пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ
  chdir($cur_dir);
  //end  

  $site = "members.dyndns.org";
  $port = "8245";
  $page = "/nic/update";
  $log_fname = "log/" . date("Y-m-d_H_i_s") . ".html";

  $user      = $_SERVER["PHP_AUTH_USER"];
  $pass      = $_SERVER["PHP_AUTH_PW"];
  $base64_up = base64_encode($user . ":" . $pass);

  $sock = fsockopen($site, $port, $errno, $errstr);

  if(!$sock)
  {
    echo "Error: ". $errstr . "(" . $errno . ")<br>\n";
  } else
  {
    fputs($sock, "GET " . $page . "?" . $_SERVER["QUERY_STRING"] . " HTTP/1.0\r\n");
    fputs($sock, "User-Agent: " . $_SERVER["HTTP_USER_AGENT"] . "\r\n");
    fputs($sock, "Authorization: Basic " . $base64_up ."\n\n");

    ob_start();

    echo urldecode($_SERVER["QUERY_STRING"]) . "<br><br>\n\n";
    echo "user=" . $user . ", pass=" . $pass . "<br>\n\n";

    echo "<xmp>\n\n";

    $answer = 0;
    while ( !feof($sock) )
    {
      $html = trim( fgets($sock) );

      if( $answer == 1)
        $out .= $html;

      if( strlen($html) == 0)
        $answer = 1;
     
      echo $html . "\n";
    }

    $buf = ob_get_clean();

    //пїЅпїЅпїЅ пїЅ пїЅпїЅпїЅ
    if( strlen($buf) > 0 )
    {
      $f = fopen($log_fname, "w+");
      fwrite($f, $buf);
      fclose($f);
    }
    //end

    ob_end_clean();

    echo $out;

    fclose($sock);
  }
?>


Обсудить на форуме
 
Pekлamкa