በ PHP ውስጥ ከ IPv6 ጋር በመስራት ላይ

በቅርቡ LIR ሁኔታ እና /29 IPv6 ብሎክ ተቀብለናል። እና ከዚያ በኋላ የተመደቡትን ንኡስ መረቦች ለመከታተል አስፈላጊ ነበር. እና የሂሳብ አከፋፈል የተጻፈው በPHP ስለሆነ፣ ወደ ጉዳዩ ትንሽ ልንመረምረው እና ይህ ቋንቋ ከIPv6 ጋር በመሥራት ረገድ በጣም ተግባቢ አለመሆኑን ተረድተናል። ከመቁረጡ በታች ከአድራሻዎች እና ክልሎች ጋር ሲሰሩ ለሚነሱ ችግሮች የእኛ መፍትሄ ነው. ምናልባት በጣም የሚያምር አይደለም, ግን ስራውን ያከናውናል.

በ PHP ውስጥ ከ IPv6 ጋር በመስራት ላይ

ጥቂት ንድፈ-ሐሳቦች

ማስተባበያ IPv6 ምን እንደሆነ እና ምን እንደሚመጣ የሚያውቁ ከሆነ ይህ ክፍል ለእርስዎ አሰልቺ ሊሆን ይችላል. ላይሆን ይችላል።

የIPv6 ማብራሪያን ለመጀመሪያ ጊዜ ያዩ ሰዎች በጣም አዳጋች ሆኖ ሊያገኙት ይችላሉ። ከቆንጆ በኋላ 64.233.177.101 በድንገት ፊት ለፊት እንጋፈጣለን 2607:f8b0:4002:c08::8b እና ግራ ልንጋባ እንችላለን። ሁለቱም እንደቅደም ተከተላቸው በሰው ሊነበቡ የሚችሉ የ32 እና 128 ቢት ውክልናዎች ናቸው። ማንኛውም የአይፒ ፓኬት ለእያንዳንዱ ቢት ጥብቅ ደረጃውን የጠበቀ ዓላማ ያለው ራስጌ ይዟል። ወደ ራስጌዎች መዋቅር በጥልቀት ሳንሄድ አንድ ነገር ልንወስደው የሚገባን ነገር ቢኖር ከአይፒ አድራሻዎች እና ክልሎች ጋር ለሚሰሩ ስራዎች በአጠቃላይ ሁለትዮሽ ሂሳብ እና የቢትዊዝ ኦፕሬሽኖችን ለመጠቀም ምቹ ነው ። እንደ የውሂብ ጎታ ውስጥ እነሱን ለማከማቸት በጣም ምቹ ነው ሁለትዮሽ(4) ለ IPv4 እና ሁለትዮሽ(16) ለ IPv6.

ሌላው ሊነካ የሚገባው አስፈላጊ ገጽታ የኔትወርክ ጭምብሎች እና የሲዲአር ማስታወሻዎች ናቸው. CIDR ለክፍል አልባ ኢንተር-ጎራ ማዘዋወር ምህጻረ ቃል ነው (ክፍል አልባ አድራሻ). ይህ ጽንሰ-ሐሳብ የትኛው የአይፒ አድራሻው የአውታረ መረብ ቅድመ ቅጥያ እንደሆነ እና በዚህ አውታረ መረብ ውስጥ ያለው የአውታረ መረብ በይነገጽ አድራሻ የትኛው ክፍል እንደሆነ ለመወሰን የክፍል ጽንሰ-ሀሳብን ተክቷል። በተግባር፣ ከቅድመ-ቅጥያው ጋር የሚዛመዱ የመጀመሪያዎቹ n ቢትስ ወደ 1፣ የተቀረው ወደ 0 ይቀናበራል።

በሰዎች ሊረዳ በሚችል መልኩ, ይህ በቅጹ ውስጥ ተጽፏል ip.add.re.ss/cidr. ለምሳሌ 64.233.177.0/24 የመጀመሪያዎቹ 24 ቢት ቅድመ ቅጥያውን እንደሚያመለክቱ ይጠቁማል። የመጨረሻዎቹ 8 ቢት ፣ እንዲሁም በሰው ሊነበብ በሚችል ማስታወሻ ውስጥ የመጨረሻው ቁጥር በመባልም ይታወቃል ፣ በንዑስ አውታረ መረብ ውስጥ ያለውን አድራሻ ይመልከቱ። ሁለት ተጨማሪ መልመጃዎች። 64.233.177.101/32 и 2607:f8b0:4002:c08::8b/128 - አንድ የተወሰነ አድራሻ. 2607:f8b0:4002:c08::/64 - የመጀመሪያዎቹ 64 ቢት (የመጀመሪያዎቹ 4 ቡድኖች) ቅድመ ቅጥያ ናቸው ፣ የተቀሩት 64 ቢት የአካባቢ ክፍል ናቸው። በነገራችን ላይ ማንም ሰው በመግቢያው ውስጥ በ "::" ግራ ቢጋባ, ድርብ ኮሎን በዘፈቀደ ቁጥር 0 የያዙ ክፍሎችን ይተካዋል. በማብራሪያው ውስጥ አንድ ጊዜ ብቻ ሊታይ ይችላል. በሌላ ቃል, 2607:f8b0:4002:c08::8b = 2607:f8b0:4002:c08:0:0:0:8b.

ከዚህ ሁሉ ምን መማር አለብን? በመጀመሪያ ፣የመጀመሪያው እና የመጨረሻው ንኡስኔት አድራሻ ሁለትዮሽ AND እና ORን በመጠቀም ማስክን በሁለትዮሽ መልክ ማወቅ ይቻላል። በሁለተኛ ደረጃ፣ የሚቀጥለው የንዑስኔት መጠን (ማለትም ከCIDR ጋር) n 1 በማከል ሊሰላ ይችላል። n- ያ ቦታ በሁለትዮሽ ውክልና ውስጥ. ሁለትዮሽ ስል ተግባራትን የመጠቀም ውጤት ማለቴ ነው። ጥቅል() и inet_pton() እና ተጨማሪ አጠቃቀም bitwise ኦፕሬተሮች፣ በሁለትዮሽ ሊገኝ የሚችለው የሁለትዮሽ ስርዓት ውክልና ነው ፣ ይበሉ ቤዝ_መቀየር().

ታሪካዊ ዳራክፍል አልባ አድራሻ ከክፍል መለያየት ቀድሞ ነበር። በእነዚያ ሩቅ ዓመታት ማንም ሰው ይህን ያህል ንዑስ መረብ ይኖራል ብሎ አላሰበም፤ በግራና በቀኝ በትላልቅ ብሎኮች ተሰራጭተዋል፡ ክፍል A - ቅድመ ቅጥያው የመጀመሪያው 8 ቢት (ማለትም የመጀመሪያው ቁጥር) ሲሆን መሪ ቢት 0; ክፍል B - መጀመሪያ 16 (የመጀመሪያዎቹ ሁለት ቁጥሮች), ቢት 10 እየመራ; ክፍል C - የመጀመሪያዎቹ 24 ቢት ፣ መሪ ቢት 110. እነዚህ መሪ ቢት የአንድ የተወሰነ ክፍል አድራሻ የተሰጠባቸውን ክልሎች ገልጸዋል፡- 0.0.0.0 - 127.255.255.255 ለክፍል A፣ 128.0.0.0 - 191.255.255.255 ክፍል B, 192.0.0.0 - 223.255.255.255 - ክፍል ሐ. ኢንተርኔት በፕላኔቷ ላይ ሲሰራጭ, ተቆጣጣሪዎች ምልክቱን እንዳመለጡ ተገንዝበዋል, እና በ 90 ዎቹ መጀመሪያ ላይ ላለመተሳሰር የሚያስችለውን ክፍል የለሽ ጽንሰ-ሀሳብ አዳብረዋል. ወደ መሪ ቢትስ. ትንሽ ተጨማሪ ዝርዝር ውስጥ ይገኛል፣ በላቸው ታላቅ እና ሁሉን አዋቂ.

ወደ ልምምድ እንሂድ

በተግባር ፣ ለእኔ እንደሚመስለኝ ​​፣ ሊሆኑ የሚችሉትን ሦስቱን ተግባራት እንተገብራለን ።

  1. የክልሉን የመጀመሪያ እና የመጨረሻ አድራሻ ማግኘት;
  2. የሚቀጥለውን የመጠን ክልል ያግኙ (CIDR);
  3. አድራሻ የአንድ ክልል መሆኑን ማረጋገጥ።

አተገባበሩ ለ IPv6 ይሆናል, አስፈላጊ ከሆነ ግን አመክንዮው በቀላሉ ሊስተካከል ይችላል. አንዳንድ ሀሳቦችን አግኝቻለሁ እዚህ, ነገር ግን ትንሽ ለየት ባለ መልኩ ተተግብሯል. እንዲሁም, ምሳሌዎች የግቤት ስህተቶችን አይፈትሹም. ስለዚህ እንሂድ።

ቀደም ብዬ እንደገለጽኩት የአንድ ክልል የመጀመሪያ እና የመጨረሻ አድራሻ የቦታውን መጀመሪያ እና የሁለትዮሽ ሳብኔት ጭንብል በማወቅ ቢትዊዝ ኦፕሬሽኖችን በመጠቀም ሊወሰን ይችላል። በዚህ መሠረት, እኛ ማድረግ ያለብን የመጀመሪያው ነገር ሲዲአርን ወደ ሁለትዮሽ ጭምብል ማዞር ነው. ይህንን ለማድረግ የሄክስ ውክልናውን እንሰበስባለን እና ወደ ሁለትዮሽ እንጠቀልላለን.

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

ግጥሚያ ጥቅል('H*'፣$ ጭንብል) የሄክስ ውክልናውን በተመሳሳይ መንገድ ያሽጉታል inet_pton(). ልዩነቱ ሲደወል ብቻ ነው። ጥቅል() ሁሉም 0s በቦታቸው መሆን አለባቸው፣ እና በመግቢያው ውስጥ ምንም ኮሎን መኖር የለበትም፣ ከሰው ሊነበብ ከሚችለው ግቤት በተቃራኒ።

ቀጣዩ ደረጃ የክልሉን መጀመሪያ እና መጨረሻ ማስላት ነው። እና እዚህ አንዳንድ ነገሮች ይነሳሉ. Bitwise ስራዎች በአቀነባባሪው ቢት አቅም የተገደቡ ናቸው። በዚህ መሠረት፣ እኔ አንዳንድ ጊዜ ለሁሉም ዓይነት የሙከራ ፓምፐርንግ የምጠቀምበት ባለ 32-ቢት CubieTruck ላይ፣ ሁሉንም 128 ቢት አድራሻዎች በአንድ ኦፕሬሽን ማካሄድ አይቻልም። ነገር ግን፣ ወደ 32 ቢት በቡድን እንዳንከፋፍለው የሚከለክለን ምንም ነገር የለም (በምን እንደምናሄድ ማን ያውቃል)።

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

ለወደፊት ጥቅም አይፒን ለማስተላለፍ እና ውጤቱን በሁለትዮሽ እና በሰው ሊነበብ በሚችል መልኩ እንቀበላለን። መለኪያ $ የትኛው እዚህ የክልሉን መጀመሪያ ወይም መጨረሻ ማግኘት እንደምንፈልግ ይገልጻል (እሴቶች 'ጀምር' ወይም 'መጨረሻ' በቅደም ተከተል)።

የሚቀጥለው ተግባር (እና ለድርጅታችን በጣም ተግባራዊ) የሚቀጥለውን ክልል ማስላት ነው። ለዚህ ተግባር አድራሻውን ወደ ሁለትዮሽ ሕብረቁምፊ ከማስፋት እና በተፈለገው ቦታ 1 ከመጨመር እና ከዚያ ሁሉንም ነገር ወደ ኋላ ከመሰብሰብ የተሻለ ምንም ነገር ወደ አእምሮዎ አልመጣም። ቅርሶች በየትኛውም ቦታ እንዳይታዩ፣ በመበስበስ እና በሚሰበሰብበት ጊዜ አድራሻውን በባይት ለመከፋፈል ወሰንኩ።

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

በውጤቱ ላይ የተገለጸውን የሚቀጥለው የመጠን ክልል ቅድመ ቅጥያ እናገኛለን $cidr. በዚህ ተግባር የአድራሻ ብሎኮችን ለደንበኞቻችን እንመድባለን።

በመጨረሻም አድራሻው የክልሉ መሆኑን ማረጋገጥ። ለምሳሌ ብሎኮችን ለደንበኞች ለማከፋፈል አንድ ብሎክ/48 መድበናል። /64, እና ስንመደብ ከተመደበው እገዳ በላይ እንዳንሄድ ማረጋገጥ አለብን (በተግባር ይህ በቅርቡ ሊከሰት አይችልም, ግን አሁንም ሊኖር ይችላል). እዚህ ሁሉም ነገር ቀላል ነው. የክልሉን መጀመሪያ እና መጨረሻ በሁለትዮሽ መልክ አግኝተናል እና አድራሻው በገደቡ ውስጥ መሆኑን ያረጋግጡ።

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

ይህ ጠቃሚ ነበር ብዬ ተስፋ አደርጋለሁ። ከአድራሻዎች ጋር ለመስራት ሌሎች ምን ተግባራት በእርስዎ አስተያየት ጠቃሚ ሊሆኑ ይችላሉ? ማንኛውም ተጨማሪዎች, አስተያየቶች እና የኮድ ግምገማዎች በአስተያየቶች ውስጥ ሞቅ ያለ አቀባበል ያደርጉላቸዋል.

ደንበኞቻችን ከሆኑ ወይም አንድ ለመሆን እያሰቡ ከሆነ ፣ በዚህ ጽሑፍ ህትመት ወቅት እገዳ እንዲቀበሉ እናቀርብልዎታለን። /64 ሙሉ በሙሉ ነፃ ለሁሉም vps አገልግሎቶች ወይም ለልዩ አገልጋይ በ Equinix Tier IV የመረጃ ማዕከል ፣ ኔዘርላንድስ ለሽያጭ ዲፓርትመንት ጥያቄ ሲቀርብ በቲኬቱ ውስጥ የዚህ ጽሑፍ አገናኝ ። ቅናሹ እስከ ማርች 2020 ድረስ የሚሰራ ነው።

አንዳንድ ማስታወቂያዎች 🙂

ከእኛ ጋር ስለቆዩ እናመሰግናለን። ጽሑፎቻችንን ይወዳሉ? የበለጠ አስደሳች ይዘት ማየት ይፈልጋሉ? ትእዛዝ በማዘዝ ወይም ለጓደኞች በመምከር ይደግፉን፣ ደመና ቪፒኤስ ለገንቢዎች ከ$4.99, በእኛ ለእርስዎ የተፈለሰፈው ልዩ የመግቢያ ደረጃ አገልጋዮች አናሎግ፡- ስለ VPS (KVM) ሙሉ እውነት E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps ከ$19 ወይንስ እንዴት አገልጋይ መጋራት ይቻላል? (በRAID1 እና RAID10፣ እስከ 24 ኮሮች እና እስከ 40GB DDR4 ድረስ ይገኛል።

በአምስተርዳም ውስጥ በ Equinix Tier IV የመረጃ ማዕከል ውስጥ Dell R730xd 2x ርካሽ? እዚህ ብቻ 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV ከ$199 በኔዘርላንድስ! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - ከ$99! ስለ አንብብ የመሠረተ ልማት ኮርፖሬሽን እንዴት እንደሚገነባ ክፍል ጋር Dell R730xd E5-2650 v4 አገልጋዮች ዋጋ 9000 አንድ ሳንቲም ዩሮ?

ምንጭ: hab.com

በDDoS ጥበቃ፣ VPS VDS አገልጋዮች ለጣቢያዎች አስተማማኝ ማስተናገጃ ይግዙ 🔥 አስተማማኝ የድር ጣቢያ ማስተናገጃ በዲዶኤስ ጥበቃ፣ በቪፒኤስ ቪዲኤስ አገልጋዮች ይግዙ | ProHoster