Ag obair le IPv6 ann am PHP

O chionn ghoirid fhuair sinn inbhe LIR agus /29 IPv6 bloc. Agus an uairsin dh'èirich an fheum air sùil a chumail air na subnets ainmichte. Agus leis gu bheil ar bilean sgrìobhte ann am PHP, bha againn ri beagan tuigse fhaighinn air a’ chùis agus tuigsinn nach e an cànan seo an cànan as càirdeile a thaobh a bhith ag obair le IPv6. Fon gearradh tha am fuasgladh againn air na duilgheadasan a thig am bàrr nuair a bhios sinn ag obair le seòlaidhean agus raointean. Is dòcha nach e an fheadhainn as eireachdail, ach nì e an obair.

Ag obair le IPv6 ann am PHP

Pàirt de theòiridh

Àicheadh. Ma tha thu eòlach air dè a th’ ann an IPv6 agus cò leis a tha e, is dòcha gum bi am pàirt seo dòrainneach dhut. Is dòcha nach eil.

Is dòcha gum bi e eagallach do dhaoine a chì an nota IPv6 airson a’ chiad uair. Às deidh eireachdail 64.233.177.101 tha sinn gu h-obann air ar n-aghaidh 2607:f8b0:4002:c08::8b agus faodaidh sinn a dhol troimh-a-chèile. Tha an dà chuid dìreach nan riochdachaidhean a ghabhas leughadh le daoine de phìosan 32 agus 128, fa leth. Ann am pasgan IP sam bith tha bann-cinn le adhbhar teann àbhaisteach airson gach pìos. Gun a bhith a’ dol eadhon nas doimhne a-steach don structar cinn, is e an aon rud a dh’ fheumas sinn a thoirt air falbh bho seo, airson gnìomhachd le seòlaidhean IP agus raointean, gu bheil e sa chumantas goireasach matamataig binary agus gnìomhachd bitwise a chleachdadh. Tha e cuideachd nas freagarraiche an stòradh san stòr-dàta mar DÌONRA (4) airson IPv4 agus DÌONRA (16) airson IPv6.

Is e taobh cudromach eile as fhiach suathadh air masgaichean lìonra agus comharrachadh CIDR. Tha CIDR na acronaim airson Slighe Eadar-fhearann ​​​​gun chlas (seòladh gun chlas). Tha am bun-bheachd seo air a dhol an àite bun-bheachd a’ chlas ann a bhith a’ dearbhadh dè am pàirt den t-seòladh IP a th’ ann an ro-leasachan an lìonraidh, agus dè am pàirt a th’ ann an seòladh an eadar-aghaidh lìonra taobh a-staigh an lìonraidh seo. Ann an cleachdadh, thèid a’ chiad n pìosan a fhreagras air an ro-leasachan a shuidheachadh gu 1, an còrr gu 0.

Ann an cruth tuigseach daonna, tha seo sgrìobhte san fhoirm ip.add.re.ss/cidr. Mar eisimpleir 64.233.177.0/24 a’ nochdadh gu bheil a’ chiad 24 pìosan a’ toirt iomradh air an ro-leasachan. Tha na 8 pìosan mu dheireadh, ris an canar cuideachd an àireamh mu dheireadh ann an comharradh a ghabhas leughadh le daoine, a’ toirt iomradh air an t-seòladh taobh a-staigh an subnet. Dà eacarsaich eile. 64.233.177.101/32 и 2607:f8b0:4002:c08::8b/128 - aon seòladh sònraichte. 2607:f8b0:4002:c08::/64 - is e a’ chiad 64 pìosan (a’ chiad 4 buidhnean) an ro-leasachan, is e na 64 pìosan a tha air fhàgail am pàirt ionadail. Air an t-slighe, ma tha an “::" air a mhì-mhisneachadh le neach sam bith san inntrig, bidh an coloin dùbailte a’ dol an àite àireamh neo-riaghailteach de earrannan anns a bheil 0. Chan urrainn dha nochdadh ach aon turas san nota. Ann am faclan eile, 2607:f8b0:4002:c08::8b = 2607:f8b0:4002:c08:0:0:0:8b.

Dè dh'fheumas sinn ionnsachadh bho seo uile? An toiseach, gheibhear a’ chiad agus an seòladh subnet mu dheireadh le bhith a’ cleachdadh binary AND agus OR, le eòlas air an masg ann an cruth binary. San dàrna h-àite, an ath mheud subnet (ie le CIDR) n Faodar a thomhas le bhith a’ cur 1 ris n- an suidheachadh sin ann an riochdachadh binary. Le binary tha mi a’ ciallachadh toradh cleachdadh gnìomhan paca() и inet_pton() agus tuilleadh cleachdaidh oibrichean bitwise, le binary tha an riochdachadh siostam binary a gheibhear le, can, bonn_tionndaidh().

Cùl-eachdraidh EachdraidheilRo sheòladh gun chlas bha sgaradh clas ann. Anns na bliadhnaichean fad às sin, cha robh duine a 'smaoineachadh gum biodh uiread de subnets ann; bha iad air an sgaoileadh clì is deas ann am blocaichean mòra: clas A - b' e an ro-leasachan a 'chiad 8 pìosan (ie a' chiad àireamh), le prìomh phàirt de 0; clas B - a 'chiad 16 (a' chiad dà àireamh), a 'stiùireadh pìosan 10; clas C - a’ chiad 24 pìosan, prìomh phìosan 110. Shònraich na prìomh phìosan sin na raointean anns an deach seòladh clas sònraichte a thoirt a-mach: 0.0.0.0 - 127.255.255.255 airson clas A, 128.0.0.0 - 191.255.255.255 - clas B, 192.0.0.0 - 223.255.255.255 - clas C. Mar a sgaoil an eadar-lìon air feadh na planaid, thuig luchd-riaghlaidh gun robh iad air an comharra a chall, agus tràth anns na 90an leasaich iad bun-bheachd gun chlas a rinn e comasach gun a bhith ceangailte. gu na pìosan stiùiridh. Gheibhear beagan a bharrachd mion-fhiosrachaidh ann an, can, mòr agus fiosrach uile.

Gluaisidh sinn air adhart gu bhith a 'cleachdadh

Ann an cleachdadh, cuiridh sinn an gnìomh na trì gnìomhan as coltaiche, mar a bha e coltach riumsa:

  1. a 'faighinn a' chiad agus an seòladh mu dheireadh den raon;
  2. faigh an ath raon meud ainmichte (CIDR);
  3. sgrùdadh a bheil seòladh ann an raon.

Bidh am buileachadh airson IPv6, ach ma tha sin riatanach, faodar an loidsig atharrachadh gu furasta. Fhuair mi beagan bheachdan bho seo, ach chuir e an gnìomh e beagan eadar-dhealaichte. Cuideachd, chan eil na h-eisimpleirean a’ sgrùdadh airson mearachdan cuir a-steach. Mar sin, rachamaid.

Mar a thuirt mi mu thràth, faodar a ’chiad agus an seòladh mu dheireadh de raon a dhearbhadh le bhith a’ cleachdadh gnìomhachd bitwise, le eòlas air toiseach an raoin agus am masg subnet binary. Mar sin, is e a’ chiad rud a dh’ fheumas sinn a dhèanamh an CIDR a thionndadh gu masg dà-chànanach. Gus seo a dhèanamh, cruinnichidh sinn an riochdachadh hex aige agus cuiridh sinn a-steach e ann am fear 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);
}

Dùbhlan pasgan ('H *', $ masc) a’ pacadh an riochdachadh hex san aon dòigh ri inet_pton(). Is e an aon eadar-dhealachadh nuair a bhios tu a’ gairm paca() feumaidh a h-uile 0s a bhith nan àitean, agus cha bu chòir coloin sam bith a bhith san inntrigeadh, eu-coltach ri inntrigeadh a ghabhas leughadh le daoine.

Is e an ath cheum obrachadh a-mach toiseach is deireadh an raoin. Agus an seo tha nuances ag èirigh. Tha gnìomhachd Bitwise air a chuingealachadh le comas bit a’ phròiseasar. Mar sin, air mo 32-bit CubieTruck, a bhios mi uaireannan a 'cleachdadh airson a h-uile seòrsa de pampering deuchainn, cha bhith e comasach a phròiseasadh a h-uile 128 pìosan an t-seòladh ann an aon obrachadh. Ach, chan eil dad a’ cur stad oirnn bho bhith ga roinn ann am buidhnean de 32 pìosan (dìreach gun fhios, cò aig a tha fios dè na pròiseasairean air am bi sinn a’ ruith).

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

Airson cleachdadh san àm ri teachd, bheir sinn seachad an comas IP a thar-chuir agus an toradh fhaighinn ann an cruth dà-chànanach agus a ghabhas leughadh le daoine. Paramadair $ a tha an seo tha e a’ sònrachadh a bheil sinn airson toiseach no deireadh an raoin fhaighinn (luachan 'tòiseachadh' no 'crìoch' fa leth).

Is e an ath ghnìomh (agus cuideachd an rud as practaigeach don chompanaidh againn) an ath raon obrachadh a-mach. Airson na h-obrach seo, cha tàinig dad na b 'fheàrr na inntinn na bhith a' leudachadh an t-seòlaidh gu sreang dà-chànanach agus cuir 1 ris anns an t-suidheachadh a bha a dhìth, agus an uairsin a h-uile càil air ais. Gus artifacts a sheachnadh a 'nochdadh an àite sam bith, chuir mi romham an seòladh a roinn le byte aig àm lobhadh agus co-chruinneachadh.

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

Aig an toradh gheibh sinn an ro-leasachan den ath raon meud a tha air a shònrachadh ann $cidr. Leis a’ ghnìomh seo bidh sinn a’ riarachadh bhlocaichean de sheòlaidhean don luchd-dèiligidh againn.

Mu dheireadh, dèan cinnteach ma bhuineas an seòladh don raon. Mar eisimpleir, thug sinn seachad aon bhloc /48 airson blocaichean a sgaoileadh gu teachdaichean /64, agus feumaidh sinn dèanamh cinnteach nuair a bhios sinn a’ sònrachadh nach tèid sinn nas fhaide na a’ bhloc ainmichte (ann an cleachdadh cha tachair seo a dh’ aithghearr, ach tha comas ann fhathast). Tha a h-uile dad sìmplidh an seo. Bidh sinn a’ faighinn toiseach is deireadh an raoin ann an cruth binary agus dèan cinnteach a bheil an seòladh taobh a-staigh nan crìochan.

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

Tha mi an dòchas gun robh seo cuideachail. Dè na gnìomhan eile airson obrachadh le seòlaidhean a dh’ fhaodadh a bhith feumail nad bheachd-sa? Tha fàilte chridheil air cur-ris, beachdan agus lèirmheasan còd anns na beachdan.

Ma tha thu mar neach-dèiligidh againn mar-thà no ma tha thu dìreach a’ smaoineachadh air a bhith nad aon, nuair a thèid an artaigil seo fhoillseachadh tha sinn a ’tabhann dhut bloc fhaighinn /64 gu tur an-asgaidh airson a h-uile seirbheis vps no frithealaiche sònraichte ann an ionad dàta Equinix Tier IV, an Òlaind ma thèid iarraidh air an roinn reic le bhith a’ toirt seachad ceangal don artaigil seo san tiogaid. Tha an tairgse dligheach gu Màrt 2020.

Cuid de shanasan 🙂

Tapadh leibh airson fuireach còmhla rinn. An toil leat na h-artaigilean againn? A bheil thu airson susbaint nas inntinniche fhaicinn? Thoir taic dhuinn le bhith a’ cur òrdugh no a’ moladh do charaidean, sgòth VPS airson luchd-leasachaidh bho $4.99, analog sònraichte de luchd-frithealaidh ìre inntrigidh, a chaidh a chruthachadh leinn dhut: An fhìrinn gu lèir mu VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps bho $ 19 no ciamar a roinn thu frithealaiche? (ri fhaighinn le RAID1 agus RAID10, suas ri 24 cores agus suas ri 40GB DDR4).

Dell R730xd 2x nas saoire ann an ionad dàta Equinix Tier IV ann an Amsterdam? A-mhàin an seo 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV bho $199 anns an Òlaind! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - bho $99! Leugh mu dheidhinn Ciamar a thogail bun-structair Corp. clas le bhith a’ cleachdadh frithealaichean Dell R730xd E5-2650 v4 luach 9000 iùro airson sgillinn?

Source: www.habr.com

Ceannaich aoigheachd earbsach airson làraich le dìon DDoS, frithealaichean VPS VDS 🔥 Ceannaich aoigheachd làrach-lìn earbsach le dìon DDoS, frithealaichean VPS VDS | ProHoster