Ukusebenza nge-IPv6 ku-PHP

Sisanda kuthola isimo se-LIR kanye /29 IPv6 block. Futhi-ke kwavela isidingo sokulandelela ama-subnet abelwe. Futhi njengoba inkokhiso yethu ibhalwe nge-PHP, bekufanele singene odabeni kancane futhi sabona ukuthi lolu limi akulona olunobungane kakhulu mayelana nokusebenza ne-IPv6. Ngezansi kokusikiwe kunesixazululo sethu sezinkinga eziphakamayo lapho sisebenza namakheli nobubanzi. Mhlawumbe akuyona into enhle kakhulu, kodwa yenza umsebenzi.

Ukusebenza nge-IPv6 ku-PHP

A little ofory

Umshwana wokuzihlangula. Uma ujwayele ukuthi i-IPv6 iyini nokuthi iza nani, le ngxenye ingase ibe yisicefe kuwe. Kungase kungabi njalo.

Abantu ababona isichasiselo se-IPv6 okokuqala bangasithola sesabisa kakhulu. Ngemva nenhle 64.233.177.101 sibhekane ngokuzumayo 2607:f8b0:4002:c08::8b futhi singase sidideke. Zombili ziyizethulo ezifundeka ngabantu zamabhithi angu-32 kanye namabhithi angu-128, ngokulandelana. Noma yiliphi iphakethe le-IP liqukethe unhlokweni onenjongo eqinile yebhithi ngayinye. Ngaphandle kokungena ngokujulile esakhiweni sezihloko, into eyodwa okudingeka siyisuse kulokhu ukuthi ekusebenzeni ngamakheli e-IP nobubanzi, ngokuvamile kulula ukusebenzisa izibalo kanambambili kanye nokusebenza okuhlakaniphile. Kuyasiza kakhulu futhi ukuwagcina ku-database njenge UNAMBAMBILI(4) ye-IPv4 kanye UNAMBAMBILI(16) ye-IPv6.

Esinye isici esibalulekile okufanele sithintwe kuso amamaski enethiwekhi nokuphawula kwe-CIDR. I-CIDR isifinyezo se-Classless Inter-Domain Routing (ukukhuluma okungenaklasi). Lo mqondo umiselele umqondo wekilasi ekunqumeni ukuthi iyiphi ingxenye yekheli le-IP eyisiqalo senethiwekhi, futhi iyiphi ingxenye eyikheli lesixhumi esibonakalayo senethiwekhi ngaphakathi kwale nethiwekhi. Empeleni, amabhithi angu-n okuqala ahambisana nesiqalo azosethwa ukuze athi 1, okunye kube ngu-0.

Ngesimo somuntu esiqondakalayo, lokhu kubhalwa ngendlela ip.add.re.ss/cidr... Ngokwesibonelo, 64.233.177.0/24 kubonisa ukuthi amabhithi okuqala angu-24 abhekisela kusiqalo. Izingcezu eziyisi-8 zokugcina, ezaziwa nangokuthi inombolo yokugcina ekubhaleni okufundekayo komuntu, zibhekisela ekhelini elingaphakathi kwe-subnet. Ukuvivinya umzimba okwengeziwe. 64.233.177.101/32 и 2607:f8b0:4002:c08::8b/128 - ikheli elilodwa. 2607:f8b0:4002:c08::/64 - amabhithi angama-64 okuqala (amaqembu ama-4 okuqala) ayisiqalo, amabhithi angama-64 asele ingxenye yendawo. Kodwa-ke, uma noma ubani edidwe u-“::” ekungeneni, ikholoni ekabili ithatha indawo yenombolo engafanele yezigaba eziqukethe u-0. Ingavela kanye kuphela esichasiselweni. Ngamanye amazwi, 2607:f8b0:4002:c08::8b = 2607:f8b0:4002:c08:0:0:0:8b.

Yini okudingeka siyifunde kukho konke lokhu? Okokuqala, ikheli le-subnet lokuqala nelokugcina lingatholakala kusetshenziswa kanambambili KANYE kanye noma NOMA, ukwazi imaski ngendlela kanambambili. Okwesibili, usayizi olandelayo we-subnet (okungukuthi nge-CIDR) n ingabalwa ngokungeza u-1 ku n-leso sikhundla sokumelela kanambambili. Ngokusebenzisa kanambambili ngiqonde umphumela wokusebenzisa imisebenzi iphakethe() и inet_pton() nokusetshenziswa okwengeziwe bitwise opharetha, by kanambambili imelela isistimu kanambambili engatholwa ngokuthi, isisekelo_guqula().

Isizinda EsimlandoUkukhuluma okungenazigaba kwandulelwa ukuhlukaniswa kwezigaba. Kuleyo minyaka ekude, akekho owayecabanga ukuthi kuzoba nama-subnets amaningi kangaka, asakazwa kwesokunxele nakwesokudla ngamabhulokhi amakhulu: isigaba A - isiqalo sasiyizibhithi eziyi-8 zokuqala (okungukuthi inombolo yokuqala), enencanyana ehamba phambili engu-0; ikilasi B - lokuqala 16 (izinombolo ezimbili zokuqala), ukuhola izingcezu 10; isigaba C - amabhithi okuqala angu-24, amabhithi aholayo angu-110. Lawa mabhithi aholayo acacise ububanzi lapho kukhishwe khona ikheli lekilasi elithile: 0.0.0.0 - 127.255.255.255 wekilasi A, 128.0.0.0 - 191.255.255.255 - isigaba B, 192.0.0.0 - 223.255.255.255 - ikilasi C. Njengoba i-inthanethi isakazeka emhlabeni wonke, abalawuli baqaphela ukuthi babephuthelwe uphawu, futhi ekuqaleni kwawo-90s bahlakulela umqondo ongenaklasi owenza kube nokwenzeka ukuthi ungaboshelwa kuma-bits ahamba phambili. Imininingwane eyengeziwe ingatholakala kokuthi, omkhulu futhi owazi konke.

Asiqhubeke sizilolonge

Empeleni, sizosebenzisa imisebenzi emithathu okungenzeka kakhulu, njengoba bekubonakala kimi,:

  1. ukuthola ikheli lokuqala nelokugcina lobubanzi;
  2. thola usayizi olandelayo onikeziwe ububanzi (CIDR);
  3. ihlola ukuthi ikheli lingelebanga yini.

Ukuqaliswa kuzoba okwe-IPv6, kodwa uma kunesidingo, ingqondo ingashintshwa kalula. Ngithole imibono kusuka lapha, kodwa ikwenze ngokuhlukile. Futhi, izibonelo azihloli amaphutha okokufaka. Ngakho, asihambe.

Njengoba ngike ngasho, ikheli lokuqala nelokugcina lebanga linganqunywa kusetshenziswa ukusebenza okuhlakaniphile, ukwazi ukuqala kobubanzi kanye nemaski kanambambili ye-subnet. Ngakho-ke, into yokuqala okudingeka siyenze ukuguqula i-CIDR ibe imaski kanambambili. Ukwenza lokhu, sizoqoqa ukumelwa kwayo kwe-hex futhi sikupakishe kube kanambambili.

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

Shayela iphakethe('H*', $imaski) ipakisha ukumelwa kwe-hex ngendlela efanayo ne inet_pton(). Umehluko kuphela ukuthi uma ufona iphakethe() bonke o-0 kufanele babe sendaweni yabo, futhi akumele kube namakholoni ekungeneni, ngokungafani nokufakwayo okufundwa umuntu.

Isinyathelo esilandelayo ukubala isiqalo nesiphetho sobubanzi. Futhi lapha kuphakama ama-nuances. Ukusebenza kwe-Bitwise kukhawulelwe umthamo webhithi wephrosesa. Ngokufanelekile, ku-32-bit CubieTruck yami, engiyisebenzisela zonke izinhlobo zokuhlola ukuhlolwa, ngeke kwenzeke ukucubungula wonke amabhithi angu-128 ekheli ekusebenzeni okukodwa. Kodwa-ke, akukho okusivimbelayo ekuhlukaniseni ngamaqembu ama-bits angu-32 (uma kwenzeka, ngubani owaziyo ukuthi yiziphi iziprosesa esizosebenza kuzo).

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

Ukuze sisetshenziswe esikhathini esizayo, sizohlinzeka ngekhono lokudlulisa i-IP futhi sithole umphumela kukho kokubili ifomu kanambambili nengafundwa umuntu. Ipharamitha $okuyinto lapha icacisa ukuthi siyafuna yini ukuthola isiqalo noma isiphetho sobubanzi (amanani 'qala' noma 'phela' ngokulandelana).

Umsebenzi olandelayo (futhi osebenza kakhulu enkampanini yethu) ukubala uhla olulandelayo. Ngalo msebenzi, akukho okungcono okwafika engqondweni kunokwandisa ikheli libe yiyunithi yezinhlamvu kanambambili bese wengeza u-1 endaweni oyifunayo, bese ugoqa yonke into emuva. Ukuze ngigweme ama-artifact ukuthi avele noma yikuphi, nginqume ukuhlukanisa ikheli nge-byte ngesikhathi sokubola nokuhlanganisa.

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

Kokukhiphayo sithola isiqalo sebanga elilandelayo likasayizi elishiwo kulo $cidr. Ngalo msebenzi sabela amakhasimende ethu amabhlogo amakheli.

Okokugcina, ihlola ukuthi ikheli lingelebanga yini. Isibonelo, sabele ibhulokhi eyodwa /48 yokusabalalisa amabhulokhi kumakhasimende /64, futhi kudingeka siqiniseke ukuthi lapho sabela asidluli ibhulokhi eyabelwe (ngokusebenza lokhu ngeke kwenzeke maduzane, kodwa kusekhona okungenzeka). Konke kulula lapha. Sithola isiqalo nesiphetho sebanga ngendlela kanambambili futhi sihlole ukuthi ikheli lingaphakathi kwemikhawulo yini.

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

Ngethemba ukuthi lokhu kube usizo. Yimiphi eminye imisebenzi yokusebenza ngamakheli engase ibe usizo ngokubona kwakho? Noma yikuphi okungeziwe, ukuphawula kanye nokubuyekezwa kwekhodi kwamukelekile ngokufudumele kumazwana.

Uma usuvele uyiklayenti lethu noma ucabanga nje ukuba ngomunye, ngesikhathi sokushicilelwa kwalesi sihloko sikunikeza ukuthi uthole ibhulokhi. /64 mahhala ngokuphelele kuzo zonke izinsizakalo ze-vps noma iseva ezinikezele esikhungweni sedatha se-Equinix Tier IV, eNetherlands ngesicelo somnyango wokuthengisa ngokunikeza isixhumanisi salesi sihloko esithikithini. Umtitilizo uyasebenza kuze kube uMashi 2020.

Ezinye izikhangiso 🙂

Siyabonga ngokuhlala nathi. Uyazithanda izindatshana zethu? Ufuna ukubona okuqukethwe okuthakaselayo okwengeziwe? Sisekele ngokufaka i-oda noma ngokuncoma kubangani, I-VPS yefu yonjiniyela kusuka ku-$4.99, i-analogue ehlukile yamaseva ezinga lokungena, esungulwe yithi ngenxa yakho: Lonke iqiniso nge-VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps kusuka ku-$19 noma ukwabelana ngeseva? (itholakala nge-RAID1 kanye ne-RAID10, kufika kuma-cores angu-24 kuze kufike ku-40GB DDR4).

I-Dell R730xd 2x ishibhile esikhungweni sedatha se-Equinix Tier IV e-Amsterdam? Lapha kuphela 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV kusukela ku-$199 eNetherlands! I-Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - isuka ku-$99! Funda mayelana Indlela yokwakha ingqalasizinda corp. ikilasi ngokusetshenziswa kwe-Dell R730xd E5-2650 v4 amaseva abiza u-9000 euros ngepeni?

Source: www.habr.com

Thenga ukusingathwa okuthembekile kwamasayithi anokuvikelwa kwe-DDoS, amaseva e-VPS VDS 🔥 Thenga ukusingathwa kwewebhusayithi okuthembekile ngokuvikelwa kwe-DDoS, amaseva e-VPS VDS | ProHoster