ugrás a tartalomhoz

IPv6 fejlesztőknek

janoszen · 2011. Jún. 8. (Sze), 08.11

Itt a jövő internet protokollja, a nagy hosting centrumok egymás után kapcsolják be a gépeiken az IPv6-ot. Itt az ideje, hogy felkészítsük az alkalmazásainkat az IPv6 kezelésére. Szerencsére a feladat nem bonyolult, a legtöbb munkát elvégzi helyettünk a webszerver. Nekünk csak a címek kezelését kell megoldani.

Egy kis elmélet

Az IPv6 egyik lényege, hogy sokkal több IP cím van, mint az IPv4 esetén, ezért a címek tárolására sokkal több helyre van szükség. Az IPv6 cím 128 biten tárolható, azaz 16 bájton. Ha a webes fejlesztéshez használt nyelveket nézzük, akkor ez MySQL-ben két Unsigned BigInt, PHP-ban 32 bites platformokon 4 db integer, 64 bites platformokon 2 db integer. Ez a megoldás ugyan helytakarékos, de nem túl praktikus programozási szempontból.

Ahhoz, hogy jobban tárolhassuk az ilyen címeket, nézzük meg egy kicsit közelebbről őket:

2001:0db8:85a3:0000:0000:8a2e:0370:7334

Az első szembetűnő változás, hogy az IPv4-nél megszokott pont helyett itt kettősponttal választjuk el a szegmenseket. A második, hogy a szegmensek maximum négy hexadecimális számot tartalmazhatnak. Az IPv6-os címben mindig 8 szegmens található. Az IPv6-os címre illeszkedő reguláris kifejezés tehát:

/^([a-fA-F0-9]{1,4}):([a-fA-F0-9]{1,4}):([a-fA-F0-9]{1,4}):([a-fA-F0-9]{1,4}):([a-fA-F0-9]{1,4}):([a-fA-F0-9]{1,4}):([a-fA-F0-9]{1,4}):([a-fA-F0-9]{1,4})$/

Az IPv4-gyel ellentétben itt egyetlen egy regexppel száz százalékosan lehet validálni a címet, ha az gépi forrásból (pl. REMOTE_ADDR változóból) jön.

Rövidített írásformák

Ha a felhasználótól kérünk be IPv6-os címet (például egy DNS szerkesztő felületen), könnyen előfordulhat, hogy a rövidített írásformák egyikét fogja használni. Nézzük meg ezeket.

Nullák rövidítése

IPv6-os felírásban a leghosszabb nullákból álló szegmens halmazt ki lehet cserélni egy dupla kettőspontra. Így tehát a fenti példa címből ez lesz:

2001:0db8:85a3::8a2e:0370:7334

A címfeldolgozásnál érdemes arra figyelni, hogy a dupla kettőspont állhat a cím elején vagy végén is.

IPv4-es címek felírása IPv6-os notációval

Az IPv6 definiál egy un. IPv4-mapped IPv6 addresses tartományt, ami arra szolgál, hogy IPv4-es címeket fel tudjunk írni IPv6 notációval is. Ez a tartomány a ::ffff:0000:0000/96, tehát az IPv4-es címet a példa utolsó két szegmensébe írjuk bele hexadecimális formátumban.

Azért, hogy a konverziót ne kelljen fejben elvégezni, megengedett a hibrid notáció használata is:

::ffff:192.168.1.1

Ez utóbbi írásforma helyett javasolt egy külön IPv4-es mező készítése, mert a felhasználónak sokkal egyszerűbb, ha a számára megszokott formában tudja megadni a címet.

Címtartományok

Az IPv6 órási címtartományokkal dolgozik, ezért általános szabály a kiosztásban, hogy az első három szegmens jelöli azt a szolgáltatót, aki közvetlenül kapta az IPv6-os tartományt (LIR, Local Internet Registry), a negyedik szegmens az ún. subnet ID, a többi pedig a gép címét. A szolgáltatók az utóbbi két szabálytól eltérhetnek, de az első három szegmens mindig fix.

Ezt azért fontos tudni, mert pont a címtartományok mérete miatt az IP cím szerinti spam szűrés gyakorlatilag lehetetlenné válik, viszont a címtartományokat továbbra is figyelemmel kísérhetjük.

Támogatás a programnyelvekben

A modern webes programnyelvek szinte mindegyike támogat IPv6-ot (lásd PHP, Java), viszont érdemes arra odafigyelni, hogy nem biztos, hogy azon a gépen, amelyen a PHP fut, van IPv6. Több szolgáltató dolgozik olyan megoldással, hogy az IPv6-ot egy proxy szerveren végződteti, a webkiszolgálóra pedig IPv4-en hozza be a lekérdezést.

Kész programkód PHP-ra

Az IPv6-os és IPv4-es címek egységes kezelésére indítottam egy open source projektet, ami mindkét címet fel tudja dolgozni és egységes formára tudja használni. A funkció kéréseket, hibajegyeket a GitHub issue rendszerében várom.

Egy kis figyelmezetetés, további olvasmányok

Ha szervert üzemeltetsz, rendkívül körültekintően járj el! Ha nincs külön IPv6-os tűzfalad, akkor az IPv6 véletlen bekapcsolása védtelenül hagyja a gépedet!

Ha az IPv6 bevezetés rendszergazdai oldaláról szeretnél bővebben tájékozódni, melegen ajánlom Benedikt Stockebrand – IPv6 in Practice című könyvét.

 
1

PHP IPv6 támogatás

Eddie · 2011. Jún. 8. (Sze), 09.42
Ahhoz hogy PHP alatt használni tudd az IPv6-os dolgokat, természetesen bele kell forgatni a PHP-ba is az IPv6 támogatást, különben nem fog működni. Én pl. abba futottam bele, hogy a AF_INET6 konstans nem létezett enélkül.
2

Így van

janoszen · 2011. Jún. 8. (Sze), 11.59
Így van, ezért is írtam saját osztálygyűjteményt rá. Talán ezt nem hangsúlyoztam ki eléggé a cikkben.
3

for the record: --enable-ipv6

Tyrael · 2011. Jún. 8. (Sze), 12.07
for the record: --enable-ipv6 configure kapcsoloval lehet, ez alapbol elmeletileg be van kapcsolva, de persze van olyan disztributor, aki --disable-all -lal forgatja a php-t, emiatt ezt explicit meg kellene adni, hogy beleforduljon a tamogatas.

Tyrael
4

Hasznos volt olvasni,

prom3theus · 2011. Jún. 8. (Sze), 16.08
Hasznos volt olvasni, köszönöm.
5

Tűzfal

janoszen · 2011. Jún. 8. (Sze), 21.13
Miután belefutottam a témába, szeretném mindenkinek felhívni a figyelmét, hogy az IPv4-el ellentétben IPv6-on automatikusan kapsz IP címet, Linux alatt pedig teljesen külön kell konfigurálni az IPv6-os tűzfalat! (ip6tables)

Ha semmi mást nem csináltok, akkor ezt mindenképpen alkalmazzátok a tűzfalatok elején:

ip6tables -A INPUT -m ipv6header --header ipv6-route --soft -j DROP
ip6tables -A INPUT -s 2002::/16 -j REJECT --reject-with icmp6-port-unreachable
iptables -A INPUT -p 41 -j REJECT --reject-with icmp-port-unreachable
8

Update

janoszen · 2011. Jún. 10. (P), 21.10
Update: Tyrael mester utánaásott és a kurrens Linux kernelekben ezekre már nincs szükség, mert a default opciók úgy vannak beállítva, hogy ne működjenek. Aki tehát frissen tartja a kernelét, annak nincs erre szüksége.
6

Ennel azert egy picit

nagno · 2011. Jún. 10. (P), 18.29
Ennel azert egy picit bonyolultabb a helyzet.
Gondoljatok egy picit bele, hogy innentol kezdve teljesen ujra kell gondolni a felhasznalok tiltasanak modszereit. Amikor te kapni fogsz a szolgaltatotol egy ip cimet, akkor gyakorlatilag nem egy ip cimet fogsz kapni, hanem egy tartomanyt, ami nagyobb lesz, mint a jelenlegi teljes ipv4 tartomany. Vagyis a felhasznalo - ha rossz szandeku - barmikor megvaltoztathatja az ip cimet, mivel o rendelkezik teljeskoruen a szamara kiosztott tartomannyal. Igy az ip cim szuresnek eltunik az ertelme.

Egyebkent nem az osszes php-s fuggveny ipv6 kompatibilis. A kovetkezoek pl nem:
gethostby*
socket_create_listen
ip2long/long2ip

Az idei DPC-n volt egy eloadas az ipv6-rol es volt szerencsem reszt venni rajta. Mondott eleg sok erdekes dolgot az eloado. Tobbek kozott azt is, hogy ha a portszamot szeretned elkuloniteni az ipv6-os ip cimtol, akkor azt igy kell megtenned:
[ipv6cim]:portszam
Tehat hasznalni kell a szogletes zarojeleket az ip cim kore.

Az eloadas dia anyaga megtalalhato itt: http://prezi.com/qlso4kn-iil7/ipv6-for-php-developer/

Van neki egy github acc-ja is, amin keresztul megosztott nehany ipv6-tal kapcsolatos hasznos programot is: https://github.com/dsp/v6tools
7

Ez így nem egészen igaz

janoszen · 2011. Jún. 10. (P), 20.41
Üdv a Weblaboron!

Ha globális szolgáltatásban gondolkozol, eddig sem tehetted meg, hogy IP cím szerint tiltottál bárkit is, mert lehet, hogy egy egész NAT-olt hálózatot tiltottál ki, extrém esetben egy egész netszolgáltatót vagy mondjuk egy akkora céget, mint az Oracle. (Ők ugyanis céges szinten valami proxy szervereken jönnek ki, tehát ugyanazt az IP-t használja fél Európa.)

Azt is érdemes itt figyelembe venni, hogy a jelek szerint sem otthoni felhasználóként, sem alsó kategóriás szerver hostingban nem kapsz önálló tartományt, hanem az előbbi esetben DHCPv6-tal, az utóbbi esetben MAC cím szerint Router Advertisementtel kapod a címedet. (Lásd ezt a hozzászólást.)

Ez azt jelenti, hogy pontosan ugyanolyan bonyolult új címet kérni, mint eddig: semennyire. Újra csatlakozol a netre és viszont látásra.

Önálló tartományra jelenleg nem nagyon van mód a hosting centrumokban és a jövőben is valszeg azért jelentős adminisztratív macera lesz ilyet szerezni. (RIPE bejegyzés készítése, stb.)

Ami a portszámmal együttes felírást illeti, azt valóban kihagytam, jogos. Ha IPv6-os szerverre csatlakozol IP szerint, akkor így kell felírni. Viszont IP cím szerint csatlakozni valahová nem vall jó programozási taktikára, hiszen egy adott szolgáltatás címe bármikor megváltozhat és az jól is van így, mert könnyebb átalakítani az infrastruktúrát.

DSP IPv6-os cuccai tök jók, viszont mind építenek arra, hogy az IPv6 bele van forgatva a PHP-ba, ami bizonyos esetekben nehézzé teheti a fejlesztő életét. Hogy egy példát mondjak, az olyan szolgáltatások, ahol az összes frontend átállítása nagy munkát jelent és ezért csak végzőztetik egy reverse proxyn az IPv6-ot, de magukat a webszervereket nem állítják még át.

Az előadásában pedig érzek némi csúsztatást (vagy utána nem nézést), /64-es tartomány beszerzéséhez egészen biztosan LIR-től kell címet kérned, home userként garantáltan nem kapsz ekkora tartományt. A LIR-es assignmenttel az adataid pedig bekerülnek a RIPE adatbázisba, tehát ugyanúgy működik, mint amikor hivatalosan igényelsz mondjuk egy /24-es IPv4-es tartományt.
11

Globalis szolgaltatasban

nagno · 2011. Jún. 13. (H), 10.50
Globalis szolgaltatasban extrem esetben gondolkozas nelkul tiltottunk IDEIGLENESEN ip cimeket, hogy a tobbi felhasznalot megovjuk. Sajnos ritkan ilyenre is szukseg van, azonban eredmenyes is volt. Igen tudom, dinamikus ip cim is letezik, teljes halozatok is interneteznek proxykon keresztul, itt azonban szerencsere nem ez volt a szituacio, vagy ha igen, akkor eredmenyes volt a tiltas, ugyanis a szolgaltatas rongalasa megszunt.

DSP jelenleg egy ingyenes szolgaltatason keresztul ipv6-ozik, es ott fix tartomanyt kapott. Tobben is voltak az eloadason (elsosorban Nemetorszagbol) es ok is azt mondtak, hogy /64-es tartomanyt kaptak. Elkepzelheto, hogy az egyes orszagokban mas lesz a gyakorlat, bar ketlem. Oszinten megmondom, fogalmam sincs, hogy a technikai oldala hogyan nez ki a szolgaltato felol, de ha az o esetukben megoldhato volt, akkor biztosan megoldhato lesz Magyarorszagon is. Ha belegondolsz, tobb ertelme van egy tartomanynak, mint egy ip cimnek, hiszen igy megszunik a dinamikus cimek kiosztasanak gyakorlata, ami sokszor akadalyozta a vegpont tenyleges helyenek megallapitasat problema eseten. Mivel ipv6 alatt mar nem letezik NAT-olas, ezert a tartomany segitsegevel az egyes eszkozeidnek te adhatsz ip cimet.

Szerintem megette a fene az egeszet, ha ugy akarsz php-bol ipv6-ozni, hogy nincs beleforgatva a php-be az ipv6 tamogatas... Ertem en, hogy nem minden esetben szokas beleforgatni alapbol, azonban a nagyobb disztribuciok csomagjaban alapbol benne van, ha meg kezzel forditod, akkor a szokasos frissitesi eljaras kereteben bele lehet forgatni gond nelkul. (Bele se merek gondolni, hogy nincs frissitve a PHP)

Az ip cim vagy hostnev szerinti csatlakozasrol szerintem ne nyissunk vitat (nem latom ertelmet), mindketto mellett es ellen is szolnak ervek. Ezt mindenki dontse el sajat maga az adott alkalmazas eseteben, hogy melyiket szeretne hasznalni.

Meg mielott felreerted, nem lehuzni akartam a cikkedet, csak egy picit kiegesziteni azzal, amit lattam/hallottam. Nagyon jonak tartom, hiszen ez egy hianypotlo volt mar nagyon sok fejleszto szamara.

Tovabbi jo cikkszerzest!
9

Hogyan?

vbence · 2011. Jún. 11. (Szo), 10.28
Szivesen hallanék tapasztalatokat, hogyan lehet valaki tuajdonosa egy IPv6 címnek.

Jelenleg 5000 HUF / hó általában ha az ADSL szolgáltatómtól fix IP címet szeretnék, kb ugyanennyi, ha a szerveremnek szeretnék egy másodikat. Logikus lenne hogy v6 cím esetén az ár 5000 / 2 ^ 96 legyen, de van egy érzésem, hogy ennél drágább lesz :)

Foglalkozik cég szolgáltatófüggetlen címek "értékesítésével"?
10

Kialakulatlan

janoszen · 2011. Jún. 11. (Szo), 14.20
Ez a terület rendkívül kialakulatlan, sem a nagy hosting centrumok, sem az ADSL solgáltatók nincsenek erre felkészülve.

Ha a szolgáltatófüggetlen címek alatt a v4-es PI tartományokat érted, azok olyan formában megszűntek, viszont helyette legjobb tudomásom szerint fordulhatsz közvetlenül a RIRhez (RIPE). Ha hazaértem, utána ások kicsit jobban. Sajnos erre nem volt szükség eddig, mert a cégcsoportba tartozó DoclerWeb egy LIR, úgyhogy baromi egyszerű volt az ügyintézés, nem is merült fel a PI, mint megoldás.

Update: megtaláltam a leírást, itt lehet elolvasni: http://www.ripe.net/ripe/docs/ripe-481#_8._IPv6_Provider

Röviden ennyi van benne:

  • Bizonyítanod kell, hogy két független netkapcsolatod van
  • Szerződnöd kell a RIPE-al.
  • Az így kapott /48-as tartományt nem oszthatod tovább, mivel nem vagy LIR.
  • Ha LIR-ré válsz, vissza kell adnod a PI tartományt.
12

Köszi

vbence · 2011. Jún. 13. (H), 23.49
Köszi a választ! Per pillanat a dolog egy VPN alapú szolgáltatás kapcsán merült fel bennem. Elvben használható lenne 10.x.x.x tipusú (v4) cím is, ezt viszont senki nem garantálja, hogy egy ügyfél rendszerében nincs éppen használatban.

Egy apró tartomány birtoklásával máris biztosítani lehetne, hogy ne legyen ütközés. Persze v6 címeknél eleve kisebb az esély az ütközésre...
13

Igen

janoszen · 2011. Jún. 22. (Sze), 20.04
Igen, ilyen célra van IPv6-nál az ULA címtartomány kézzel kiosztható része. Arra viszont érdemes figyelni, hogy IPv6-nál jelenleg nincs NAT támogatás, tehát a privát címekről a nem tudod a forgalmat kiengedni a netre.