Kun kotikonetta käyttää palvelimena, on kätevää hankkia sille jostain ilmainen osoite. Eräs ilmaisia osoitteita tarjoava palvelu on dy.fi. Palvelusta hankitun osoitteen voi ohjata omalle koneelle dy.fi:n hallintapaneelin kautta, mutta pidemmän päälle on kätevämpää käyttää automaattista skriptiä – siis tätä vinkkiä.
Huomio! Ennen tämän vinkin käyttöä pitää rekisteröityä dy.fi-palveluun ja varata sieltä osoite! Lisäksi seuraaviin koodeihin pitää tietenkin kirjoittaa oma tunnus, salasana ja osoite.
(Vinkkiä päivitetty 2.10.2011.)
<?php // $osoite = ???.dy.fi, osoite, jonka varasit palvelusta. // $tunnus = käyttäjätunnuksesi dy.fi-sivustolla. // $salasana = salasanasi dy.fi-sivustolla. function paivita_dy_fi($osoite, $tunnus, $salasana = false) { // Luodaan tunnistetieto. Jos on annettu vain tunnus, // oletetaan, että se on valmiiksi oikeassa muodossa. if ($salasana === false) { $auth = $tunnus; } else { $auth = base64_encode("$tunnus:$salasana"); } // Asetetaan oikea HTTP-otsikko pyyntöä varten. $context = stream_context_create(array("http" => array( "header" => "Authorization: Basic {$auth}", "ignore_errors" => true, ))); // Lähetetään pyyntö ja palautetaan vastauksen ensimmäinen sana. // Mahdolliset tulokset: http://www.dy.fi/page/specification $url = "http://www.dy.fi:8180/nic/update"; $osoite = rawurlencode($osoite); $ret = file_get_contents("{$url}?hostname={$osoite}", false, $context); sscanf($ret, "%s", $ret); return $ret; }
Funktiolla voi päivittää yhden osoitteen näin:
<?php require_once("funktio.php"); $osoite = "oma.dy.fi"; $tunnus = "tunnus@tunnus.fi"; $salasana = "salasana"; echo paivita_dy_fi($osoite, $tunnus, $salasana);
Palvelun sääntöjen mukaan IP-osoitetta ei saa päivittää turhaan. Toisaalta osoite on päivitettävä vähintään kerran viikossa, ettei se vanhene, ja lisäksi osoite pitää tietenkin päivittää, jos se on muuttunut. Seuraava skripti säilyttää tiedostossa viimeisintä osoitetta, tarkistaa tiedoston muokkaushetkestä, milloin on viimeksi päivitetty, ja päivittää uudestaan vain, jos osoite on vaihtunut tai edellisestä päivityksestä on kulunut jo monta päivää.
<?php // Käytetään ensimmäisen koodilistauksen funktiota. require_once("funktio.php"); $osoite = "oma.dy.fi"; $tunnus = "tunnus@tunnus.fi"; $salasana = "salasana"; // Tähän tiedostoon tallennetaan tieto viimeisimmästä päivityksestä. $tiedosto = 'viimeksi.txt'; // Skripti ilmoittaa lopputuloksen tekstinä. header("Content-Type: text/plain"); // Selvitetään oma IP-osoite checkip.dy.fi-palvelun avulla. $ip = @file_get_contents('http://checkip.dy.fi/'); if (!preg_match('/\d+\.\d+\.\d+\.\d+/', $ip, $tmp)) { echo "Virhe IP-osoitteen hakemisessa!\n"; exit(1); } $ip = $tmp[0]; // Haetaan vanhat tiedot tiedostosta. $paivitetty = $vanha_ip = null; if (file_exists($tiedosto)) { $vanha_ip = (string) @file_get_contents($tiedosto); $paivitetty = (int) @filemtime($tiedosto); } // Jos IP-osoite on entisellään ja aikaa on kulunut alle kuusi päivää, ei tehdä mitään. if ($ip == $vanha_ip && time() < $paivitetty + 60 * 60 * 24 * 6) { echo "Vanha kelpaa.\n"; exit(0); } // Päivitetään. $tulos = paivita_dy_fi($osoite, $tunnus, $salasana); // Jos onnistui, tallennetaan uusi IP-osoite. // Tulokset "nochg" (ei muutosta) ja "good" (hyvä) ovat ok. // Mahdolliset tulokset: http://www.dy.fi/page/specification if ($tulos == "nochg" || $tulos == "good") { echo "Ok: {$tulos}.\n"; file_put_contents($tiedosto, $ip); exit(0); } else { echo "Virhe: {$tulos}!\n"; exit(1); }
Skripti täytyy tietenkin tavalla tai toisella ajaa aina silloin tällöin. Tähän sopii Linux-palvelimella cron ja Windowsissa ajoitetut tehtävät.
Öh... Kun Nat antaa ulos reitittimen osoitteen, ja tuossa ei näyttäisi olevan missään sellaista, jossa annetaan ip erikseen, niin eikös se dy.fi silloin siis ota osoitteksi sen reitittimen? Eli siis ei toimi Natilla tuo päivitys...?
Joo, dy.fi laittaa kyseisen nimen osoittamaan siihen ipsiin mistä pyyntö on tullut.
Eli siis... Natilla se täytyy tehdä niin, että yhteys pyydetään tulemaan reitittimen osoitteeseen ja tiettyyn porttiin, josta yhteys ohjataan palvelimeen sisäisen kiinteän ip-osoitteen avulla...?
Ja juuri silloinhan se toimii NATin kanssa. Mitä järkeä on laittaa dy.fi-nimi osoittamaan johonkin yksityiseen osoitteeseen (192.168.0.123)? Tietenkin sen pitää osoittaa julkiseen, että sitä voi joku käyttääkin. Reititintä pitää sitten vain käskeä reitittämään haluttu liikenne sisäisessä verkossa palvelinkoneelle.
Kuten Metabolix sanoi, se että onko sulla NAT vai ei, ei vaikuta tuon toimintaan. Kyllä se liikenne pitää ohjata sinne palvelimelle samaaa reittiä mitä se on sille palvelimelle tullutkin. Eli ensimmäinen IP on se mahdollinen reititin.
Tieten jos erehdyt käyttämään proxya tuon pyynnön kanssa niin silloin menee metsään.
Jees! Otin tämän käyttöön :)
Crontabilla pyörähtelee 6pv välein tällähetkellä..
C++-versio tästä olisi kiva lisäksi. No, taidampa tehdä sellaisen itse.
Myös tämä on toimiva ja helppo ratkaisu:
http://wiki.ubuntu-fi.org/Dynaaminen_DNS
Toimiiko tuo Windows 7lla
Tietenkin toimii, miksei toimisi? Olisit myös voinut vain testata.
Ihan hyvä niille joiden ip-osoite vaihtuu aina, kun modeemi sammutetaan.
Toisen koodilistauksen rivin 16 perusteella skripti ei taida toimia IPv6-osoitteilla?
Miten noita pitäisi muuttaa että ne toimisi myös IPv6:lla?
Löysin yhden skriptin joka päivittää IPv6-osoitteen dy.fi-palveluun. Tuo on tehty Bourne shell-skriptillä, enkä osaa muuttaa sitä php-skriptiksi.
Omassa kotipalvelinkäytössä on tällä hetkellä Windows 10, johon on asennettu Apache-httpd ja php.
Tämä dy.fi-palvelun nopea rajapinta tukee vain IPv4-osoitteen päivittämistä. IPv6-osoitteet (kuten myös MX-palvelimet) täytyy syöttää palvelussa aivan erilliseen tekstikenttään, eli niiden päivitys ei onnistu tämän helpon rajapinnan kautta vaan vaatii ensin kirjautumisen sivustolle ja sitten lomakkeen lähetyksen.
Lisäys:
Nyt on uusi versio (sis. IPv4, IPv6, MX) erillisenä viestinä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.