Nagtrabaho uban sa IPv6 sa PHP

Bag-ohay lang nakadawat kami og status sa LIR ug /29 IPv6 block. Ug unya mitungha ang panginahanglan sa pagsubay sa gi-assign nga mga subnet. Ug tungod kay ang among billing gisulat sa PHP, kinahanglan namon nga tun-an ang isyu ug makaamgo nga kini nga pinulongan dili ang labing mahigalaon sa mga termino sa pagtrabaho uban sa IPv6. Ubos sa pagputol mao ang among solusyon sa mga problema nga motumaw kung nagtrabaho kauban ang mga adres ug sakup. Tingali dili ang labing elegante, apan kini ang trabaho.

Nagtrabaho uban sa IPv6 sa PHP

Usa ka teoriya

Disclaimer. Kung pamilyar ka kung unsa ang IPv6 ug kung unsa ang kauban niini, kini nga bahin mahimong makalaay alang kanimo. Mahimong dili.

Ang mga tawo nga nakakita sa IPv6 annotation sa unang higayon mahimong makahadlok kaayo. Pagkahuman elegante 64.233.177.101 kalit mi nag atubang 2607:f8b0:4002:c08::8b ug basin maglibog ta. Ang duha mga representasyon nga mabasa sa tawo nga 32 ug 128 bits, matag usa. Ang bisan unsang IP packet adunay usa ka header nga adunay usa ka estrikto nga estandard nga katuyoan alang sa matag bit. Kung wala’y pag-adto sa labi ka lawom nga istruktura sa mga ulohan, usa ka butang nga kinahanglan naton tangtangon gikan niini mao nga alang sa mga operasyon nga adunay mga adres sa IP ug mga sakup, kasagaran nga kombenyente nga gamiton ang binary mathematics ug mga operasyon sa bitwise. Kini usab labing kombenyente nga tipigan kini sa database ingon BINARY(4) para sa IPv4 ug BINARY(16) alang sa IPv6.

Ang laing importante nga aspeto nga angay hikap-hikap mao ang mga network mask ug CIDR notation. Ang CIDR maoy acronym sa Classless Inter-Domain Routing (walay klase nga adres). Gipulihan niini nga konsepto ang konsepto sa klase sa pagtino kung asa nga bahin sa IP address ang prefix sa network, ug asa nga bahin ang adres sa interface sa network sulod niini nga network. Sa praktis, ang una nga n bit nga katumbas sa prefix itakda sa 1, ang nahabilin sa 0.

Sa porma nga masabtan sa tawo, kini gisulat sa porma ip.add.re.ss/cidr. Pananglitan 64.233.177.0/24 nagpakita nga ang unang 24 bits nagtumong sa prefix. Ang katapusang 8 bits, nailhan usab nga katapusang numero sa mabasa sa tawo nga notasyon, nagtumong sa adres sulod sa subnet. Pipila pa nga mga ehersisyo. 64.233.177.101/32 и 2607:f8b0:4002:c08::8b/128 - usa ka piho nga adres. 2607:f8b0:4002:c08::/64 - ang unang 64 bits (ang unang 4 ka grupo) mao ang prefix, ang nahibiling 64 bits mao ang lokal nga bahin. Pinaagi sa dalan, kung adunay naglibog sa "::" sa entry, ang dobleng colon mopuli sa usa ka arbitraryong gidaghanon sa mga seksyon nga adunay 0. Kini mahimong makita kausa lamang sa anotasyon. Sa laing pagkasulti, 2607:f8b0:4002:c08::8b = 2607:f8b0:4002:c08:0:0:0:8b.

Unsay angay natong makat-onan gikan niining tanan? Una, ang una ug katapusan nga subnet nga adres mahimong makuha gamit ang binary AND ug OR, nahibal-an ang maskara sa binary nga porma. Ikaduha, ang sunod nga gidak-on sa subnet (ie sa CIDR) n mahimong kalkulado pinaagi sa pagdugang 1 sa n-kana nga posisyon sa binary nga representasyon. Pinaagi sa binary gipasabut nako ang resulta sa paggamit sa mga gimbuhaton pakete() и inet_pton() ug dugang nga paggamit bitwise nga mga operator, pinaagi sa binary mao ang representasyon sa binary nga sistema nga makuha pinaagi sa, ingnon ta, base_convert().

Kasaysayan sa KasaysayanAng walay klase nga adres giunhan sa paglainlain sa klase. Niadtong lagyo nga mga tuig, walay usa nga naghunahuna nga adunay daghan kaayo nga mga subnet, kini gipang-apod-apod sa wala ug tuo sa dagkong mga bloke: class A - ang prefix mao ang unang 8 bits (ie ang unang numero), nga adunay nag-unang bit nga 0; klase B - una 16 (unang duha ka numero), nanguna nga mga bit 10; class C - ang unang 24 bits, nanguna nga bits 110. Kining nag-unang bits nagtino sa mga han-ay diin ang adres sa usa ka partikular nga klase gi-isyu: 0.0.0.0 - 127.255.255.255 para sa klase A, 128.0.0.0 - 191.255.255.255 - class B, 192.0.0.0 - 223.255.255.255 - class C. Samtang ang Internet mikaylap sa tibuok planeta, ang mga regulators nakaamgo nga sila nawad-an sa marka, ug sa sayong bahin sa 90s nakahimo sila og usa ka walay klase nga konsepto nga nagpaposible nga dili mahigot. ngadto sa nag-unang mga bit. Ang usa ka gamay nga dugang nga detalye makita sa, ingon, dako ug nahibalo sa tanan.

Magpadayon ta sa pagpraktis

Sa praktis, atong ipatuman ang tulo nga lagmit, ingon sa akong tan-aw, mga buluhaton:

  1. pagkuha sa una ug katapusan nga adres sa range;
  2. pagkuha sa sunod nga gihatag nga gidak-on sa gidak-on (CIDR);
  3. pagsusi kung ang usa ka adres nahisakop sa usa ka range.

Ang pagpatuman alang sa IPv6, apan kung gikinahanglan, ang lohika dali nga mapahiangay. Naa koy mga ideya gikan dinhi, apan gipatuman kini sa usa ka gamay nga lahi. Usab, ang mga pananglitan wala magsusi sa mga sayup sa pag-input. So, adto ta.

Sama sa nahisgotan na nako, ang una ug katapusan nga adres sa usa ka range mahimong matino gamit ang mga operasyon sa bitwise, nahibal-an ang sinugdanan sa range ug ang binary subnet mask. Tungod niini, ang unang butang nga kinahanglan natong buhaton mao ang paghimo sa CIDR ngadto sa binary mask. Aron mahimo kini, among kolektahon ang hex nga representasyon niini ug i-pack kini sa usa ka binary.

function cidrToMask ($cidr) {
    $mask = str_repeat('f', ceil($cidr / 4));
    $mask .= dechex(4 * ($cidr % 4));
    $mask = str_pad($mask, 32, '0');
    return pack('H*', $mask);
}

Hagit pack('H*', $mask) giputos ang hex nga representasyon sa samang paagi sa inet_pton(). Ang kalainan lang kay kung manawag pakete() ang tanan nga 0 kinahanglan nga naa sa ilang mga lugar, ug kinahanglan nga wala’y mga colon sa entry, dili sama sa mabasa sa tawo nga entry.

Ang sunod nga lakang mao ang pagkalkulo sa pagsugod ug katapusan sa range. Ug dinhi mitungha ang mga nuances. Ang mga operasyon sa bitwise limitado sa gamay nga kapasidad sa processor. Tungod niini, sa akong 32-bit nga CubieTruck, nga usahay akong gigamit alang sa tanan nga mga matang sa pagsulay nga pagpaayo, dili posible nga maproseso ang tanan nga 128 ka piraso sa adres sa usa ka operasyon. Apan, walay makapugong kanato sa pagbahin niini ngadto sa mga grupo sa 32 bits (sa kaso lang, kinsa nahibalo kon unsa nga mga processor ang atong padaganon).

function getRangeBoundary ($ip, $cidr, $which, $ipIsBin = false, $returnBin = false) {
    $mask = cidrToMask($cidr);
    if (!$ipIsBin) {
        $ip = inet_pton($ip);
    }
    $ipParts   = str_split($ip, 4);
    $maskParts = str_split($mask, 4);
    $rangeParts  = [];
    for ($i = 0; $i < count($ipParts); $i++) {
        if ($which == 'start') {
            /* Побитовый & адреса и маски оставит только биты префикса. */
            $rangeParts[$i] = $ipParts[$i] & $maskParts[$i];
        } else {
            /* Побитовый | с обратной маской (~) оставит биты префикса и установит все биты локальной части в 1. */
            $rangeParts[$i] = $ipParts[$i] | ~$maskParts[$i];
        }
    }
    $rangeBoundary = implode($rangeParts);
    if ($returnBin) {
        return $rangeBoundary;
    } else {
        return inet_ntop($rangeBoundary);
    }
}

Alang sa umaabot nga paggamit, kami maghatag ug abilidad sa pagpasa sa IP ug makadawat sa resulta sa binary ug mabasa sa tawo nga porma. Parameter $unsa dinhi nagtino kung gusto ba naton makuha ang sinugdanan o katapusan sa range (values 'pagsugod' o 'katapusan' matag usa).

Ang sunod nga buluhaton (ug usab ang labing praktikal alang sa among kompanya) mao ang pagkalkula sa sunod nga range. Alang sa kini nga buluhaton, wala’y mas maayo nga nahunahunaan kaysa sa pagpalapad sa adres sa usa ka binary string ug idugang ang 1 sa gusto nga posisyon, ug dayon i-collapse ang tanan. Aron malikayan ang mga artifact nga makita bisan asa, nakahukom ko nga bahinon ang adres pinaagi sa byte sa panahon sa pagkadunot ug asembliya.

function getNextBlock ($ipStart, $cidr, $ipIsBin = false, $returnBin = false) {
    if (!$ipIsBin) {
        $ipStart = inet_pton($ipStart);
    }
    $ipParts = str_split($ipStart, 1);
    $ipBin   = '';
    foreach ($ipParts as $ipPart) {
        $ipBin .= str_pad(base_convert(unpack('H*', $ipPart)[1], 16, 2), 8, '0', STR_PAD_LEFT);
    }
    /* Добавляем 1 в нужном разряде двоичного представления строки "влоб" :) */
    $i = $cidr - 1;
    while ($i >= 0) {
        if ($ipBin[$i] == '0') {
            $ipBin[$i] = '1';
            break;
        } else {
            $ipBin[$i] = '0';
        }
        $i--;
    }
    $ipBinParts = str_split($ipBin, 8);
    foreach ($ipBinParts as $key => $ipBinPart) {
        $ipParts[$key] = pack('H*', str_pad(base_convert($ipBinPart, 2, 16), 2, '0', STR_PAD_LEFT));
    }
    $nextIp = implode($ipParts);
    if ($returnBin) {
        return $nextIp;
    } else {
        return inet_ntop($nextIp);
    }
}

Sa output makuha nato ang prefix sa sunod nga gidak-on nga gitakda sa $cidr. Uban niini nga function naggahin kami mga bloke sa mga adres sa among mga kliyente.

Sa katapusan, pagsusi kung ang adres nahisakop sa range. Pananglitan, among gigahin ang usa ka block /48 alang sa pag-apod-apod sa mga bloke sa mga kliyente /64, ug kinahanglan natong siguroon nga kung mag-assign kita dili molapas sa gigahin nga block (sa praktis dili kini mahitabo sa dili madugay, apan adunay posibilidad). Ang tanan yano dinhi. Atong makuha ang sinugdanan ug katapusan sa range sa binary nga porma ug susihon kung ang adres naa sa sulod sa mga limitasyon.

function ipInRange ($ip, $rangeStart, $cidr) {
    $start = getRangeBoundary($rangeStart, $cidr, 'start',false, true);
    $end = getRangeBoundary($rangeStart, $cidr, 'end',false, true);
    $ipBin = inet_pton($ip);
    return ($ipBin >= $start && $ipBin <= $end);
}

Nanghinaut ko nga kini makatabang. Unsa ang ubang mga gimbuhaton sa pagtrabaho sa mga adres nga mahimong mapuslanon sa imong opinyon? Ang bisan unsang mga pagdugang, mga komento ug mga pagsusi sa code mainiton nga gidawat sa mga komento.

Kung ikaw na ang among kliyente o naghunahuna lang nga mahimong usa, sa okasyon sa pagmantala sa kini nga artikulo kami nagtanyag kanimo nga makadawat usa ka block /64 bug-os nga libre para sa tanang serbisyo sa vps o dedikado nga server sa Equinix Tier IV data center, ang Netherlands kon hangyoon sa sales department pinaagi sa paghatag ug link niini nga artikulo sa tiket. Ang tanyag balido hangtod sa Marso 2020.

Pipila ka mga ad 🙂

Salamat sa pagpabilin kanamo. Ganahan ka ba sa among mga artikulo? Gusto nga makakita og mas makapaikag nga sulod? Suportahi kami pinaagi sa pag-order o pagrekomenda sa mga higala, cloud VPS alang sa mga developers gikan sa $4.99, usa ka talagsaon nga analogue sa mga entry-level server, nga giimbento namo alang kanimo: Ang tibuok kamatuoran bahin sa VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps gikan sa $19 o unsaon pagpaambit sa usa ka server? (anaa sa RAID1 ug RAID10, hangtod sa 24 ka mga core ug hangtod sa 40GB DDR4).

Dell R730xd 2 ka beses nga mas barato sa Equinix Tier IV data center sa Amsterdam? Dinhi lang 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV gikan sa $199 sa Netherlands! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - gikan sa $99! Basaha ang mahitungod sa Unsaon pagtukod sa infrastructure corp. klase sa paggamit sa Dell R730xd E5-2650 v4 server nga nagkantidad ug 9000 euros sa usa ka sentimos?

Source: www.habr.com

Pagpalit kasaligan nga pag-host alang sa mga site nga adunay proteksyon sa DDoS, mga server sa VPS VDS 🔥 Pagpalit og kasaligang website hosting nga adunay proteksyon sa DDoS, VPS VDS servers | ProHoster