php cidr to ip range

Сетевые функции

Содержание

User Contributed Notes 14 notes

A simple and very fast function to check against CIDR.

Your previous examples are too complicated and involves a lot of functions call.

An improved version of claudiu at cnixs dot com not using split and working with the following:
ip: 192.168.101.123, CIRD: 192.168.101.144/24

improved version of philippe-at-cyberabuse.org’s answer:

PHP miss CIDR functions.

This little function might come in handy

In Trevor Hemsley’s translation of the perl range2cidr function, the

condition should be

otherwise it won’t work for /32s, ie if you feed range2cidr(«1.2.3.4», «1.2.3.4»).

function cidr_conv($cidr_address) <
$first = substr($cidr_address, 0, strpos($cidr_address, «/»));
$netmask = substr(strstr($cidr_address, «/»), 1);

$first_bin = str_pad(decbin(ip2long($first)), 32, «0», STR_PAD_LEFT);
$netmask_bin = str_pad(str_repeat(«1», (integer)$netmask), 32, «0», STR_PAD_RIGHT);

Regarding samuele’s note:

You can get faster code if you apply directly what happens in network devices, such as routers. If you AND (logic operation) the remote ip against the local netmask the result will be the network ip if the remote ip is from the local network. Example:

192.168.0.16 = 11000000.10101000.00000000.00010000
& 255.255.255.0 = 11111111.11111111.11111111.00000000
—————————————————————
192.168.0.0 = 11000000.10101000.00000000.00000000

And now the code. My example uses a html form where you place the values you want to test:

When I was working on a project I ran into this problem with redirecting. My solution is as follows:
header(«Refresh: 5; url=../main/main.php?».session_id().»»);

This allowed me to pass the session_id() which is used throughout site to make sure user has loged in.
I hope this helps!

If you want to get the interface of an IP, based on the local route table, use this.

Источник

PHP5 calculate IPv6 range from cidr prefix?

I am able to do this with IPv4 using code snippets from various online sources. I was wondering if there was a way to do it with IPv6.

Basically I just need a form that I can enter an IPv6 address and prefix (ex: address/68) and it calculates the network address, first useable address, last useable address, and broadcast address. Then just prints to screen. Not looking to store it in a database or anything yet.

How would I go about doing this?

Thanks to everyone in advance!

php cidr to ip range. Смотреть фото php cidr to ip range. Смотреть картинку php cidr to ip range. Картинка про php cidr to ip range. Фото php cidr to ip range

4 Answers 4

First of all: IPv6 doesn’t have network and broadcast addresses. You can use all addresses in a prefix. Second: On a LAN the prefix length is always (well, 99.x% of the time) a /64. Routing a /68 would break IPv6 features like stateless auto configuration.

Below is a verbose implementation of an IPv6 prefix calculator:

For those who stumble upon this question, you can do this more effectively using the dtr_pton and dtr_ntop functions and dTRIP class found on GitHub.

We also have noticed a lack of focus and tools with IPv6 in PHP, and put together this article, http://www.highonphp.com/5-tips-for-working-with-ipv6-in-php, which may be of help to others.

Function Source

This converts and IP to a binary representation:

This converts a binary representation to printable IP:

Examples

Using the dtr_pton function you can:

Get your Network and Broadcast:

And your output would be:

Well, for posterity, I’m adding my code here. And also as a thanks to you guys who helped me nail this down as I needed it for an ipv6/ip2country script.

It’s slightly inspired by code posted here by @mikemacintosh and @Sander Steffann, slightly improved (whishful thinking) and returns a nice object packing all the data you do/don’t need:

I like functions and classes and dislike non-reusable code where reusable functionality is implemented.

PS: If you find issues with it, please get back to me. I’m far from an expert in IPv6.

Источник

Конвертируем диапазон IP в бесклассовую адресацию (CIDR) и обратно в Go

При прохождения очередного собеседования мне задали небольшое тестовое задание, написать на Go сетевой сканер открытых портов. Задание в принципе не сложное, но одним из условий было, что в качестве параметра может быть передан как IP-адрес, так и диапазон сетевых адресов в виде сетевой маски: 192.168.8.0/21.

Тема скорее всего очень тривиальная для сетевых инженеров и администраторов и, наверно, даже скучная. Моя цель просто изложить тут алгоритм перевод диапазона IP в сетевую маску (дальше по тексту CIDR) и обратно из CIDR в диапазон адресов.

Немного теории, но тем, кто уже знаком с терминами можно пропустить и сразу перейти к алгоритму.

Итак, что такое IP я думаю всем понятно и пояснять не нужно. Теперь что такое CIDR (или сетевая маска). Представим, что у нас есть IP: «192.168.11.10». На самом деле это 8-битовые значения разделенные точками, и каждая отдельная часть это так называемый октет. Понятно, что IP можно представить в виде 32-битового числа.

php cidr to ip range. Смотреть фото php cidr to ip range. Смотреть картинку php cidr to ip range. Картинка про php cidr to ip range. Фото php cidr to ip range

Именно такое число и передается в IP-пакете. Теперь давайте представим, что у нас есть подсеть состоящая из 8 хостов — 192.168.11.0 до 192.168.11.7 (Note: 192.168.11.0 нельзя использовать в качестве адреса какого-либо сетевого интерфейса, так как этот адрес используется как идентификатор подсети, поэтому фактически адресов будет 7, но для нашего пример это пока не имеет значения.)
Понятно, что подсетей может быть несколько в рамках одном большой сети и отправлять пакет внутри своей подсети нужно напрямую, а скажем если пакет нужно направить в другую подсеть допусти на IP: 192.168.11.22, то его нужно направить сетевому маршрутизатору, который перенаправить этот пакет в другую подсеть. Хранить на хосте отправителе все адреса своей подсети накладно и бессмысленно, поэтому мы просто храним сетевую маску и для выше обозначенной сети из 8 хостов она будет равна — 255.255.255.248. Теперь если разложить сетевую маску на биты — получим 29 единиц и 3 нулей.

php cidr to ip range. Смотреть фото php cidr to ip range. Смотреть картинку php cidr to ip range. Картинка про php cidr to ip range. Фото php cidr to ip range

Aлгоритм c комментариями приведен ниже. Сразу скажу, что для диапазона 216.58.192.12 — 216.58.192.206, нет возможности разбить на одну подсеть и алгоритм сразу разобьет диапазон на несколько подсетей:
<
«216.58.192.12/30»,
«216.58.192.16/28»,
«216.58.192.32/27»,
«216.58.192.64/26»,
«216.58.192.128/26»,
«216.58.192.192/29»,
«216.58.192.200/30»,
«216.58.192.204/31»,
«216.58.192.206/32”
>

Теперь что касается обратного алгоритма, когда нужно перевести такой же диапазон бесклассовой адресации обратно в IP. Лично в моем тестовом задании этот алгоритм не понадобился и возможно кто-то из сетевых администраторов прокомментирует, насколько он нужен в реальной жизни, но я решил написать сразу и тот и другой. Алгоритм до элементарного прост, вы должны в начальному IP подсети прибавить ее размерность.

Note: только для Go разработчиков: алгоритм можно сделать еще более производительным, если возвращать данные в формате — (IP, *IPNet, error), но для универсальности я возвращаю данные как string.

Код сетевого сканера лежит тут: GitHub. Если поставите звездочку, буду благодарен, но только, если я ее заслужил :))

Источник

Получение списка IPs из нотации CIDR в PHP

есть ли способ (или функция/класс) получить список IP-адресов из нотации CIDR?

например, у меня есть 73.35.143.32 / 27 CIDR и я хочу получить список всех IP-адресов в этой нотации. Есть предложения?

12 ответов

я отредактирую вышеуказанного класс чтобы содержать метод для этого. Вот код, который я придумал, который может помочь вам до тех пор.

возвращает нижний конец диапазона ip в качестве первой записи в массиве, а затем возвращает верхний конец в качестве второй записи.

Ну, это битовая маска-73.35.143.32 / 27 означает, что 27 бит являются сетевой маской, а остальные доступны для назначения узлам в сети:

в двоичном формате это (точки показаны для удобочитаемости):

так что вы можете просто и их вместе и получить это:

отсюда, вы можете просто перечислить все комбинации в адрес узла (от 0 00000, 11111 и в 31, так простой loop достаточно), и у вас будут все доступные хосты.

преобразование этого псевдокода в PHP остается в качестве упражнения для читателя;)

О, и обязательное предупреждение об устаревании: IPv4 теперь заполнен, рассмотрим также IPv6.

вот одна быстрая функция 64bits, чтобы сделать это, прокомментируйте обратную строку, которая вам не нужна. Принятие любого допустимого Ipv4 С или без допустимого префикса маршрутизации CIDR, например 63.161.156.0/24 или 63.161.156.0

для быстрого запуска функция не проверяет ввод, но формально это должна быть строка, соответствующая следующему регулярному выражению

если вы хотите проверьте вход перед использованием функции

в получите полный спектр в качестве массива для данного IP (С или без префикса маршрутизации CIDR) вы можете использовать следующий код, но будьте осторожны, потому что, например, 25.25.25.25/16 возвращает массив с 65536 элементами, и вы можете легко запустить из памяти, используя меньший префикс маршрутизации

для быстрой проверки, если данный ipv4 соответствует заданному CIDR вы можете сделать это инлайн, как в этом примере

для быстрой проверки, если данный IPv4-это соответствие заданному массиву IP (С или без префикса маршрутизации CIDR)

надеемся, что эти несколько строк помогли вам.

Я не верю этот класс вернет список IPs, но он предоставляет некоторые полезные методы для работы с блоками CIDR.

Источник

Matching an IP to a CIDR mask in PHP 5?

I’m looking for quick/simple method for matching a given IP4 dotted quad IP to a CIDR notation mask.

I have a bunch of IPs I need to see if they match a range of IPs.

What would cidr_match() look like?

It doesn’t really have to be simple, but fast would be good. Anything that uses only built-in/common functions is a bonus (as I’m likely to get one person to show me something in pear that does this, but I can’t depend on pear or that package being installed where my code is deployed).

php cidr to ip range. Смотреть фото php cidr to ip range. Смотреть картинку php cidr to ip range. Картинка про php cidr to ip range. Фото php cidr to ip range

13 Answers 13

If only using IPv4:

something like this should work:

In a similar situation, I ended up using symfony/http-foundation.

When using this package, your code would look like:

It also handles IPv6.

I found many of these methods breaking after PHP 5.2. However the following solution works on versions 5.2 and above:

Example results

php cidr to ip range. Смотреть фото php cidr to ip range. Смотреть картинку php cidr to ip range. Картинка про php cidr to ip range. Фото php cidr to ip range

Some function changed:

Here is one fast 64bits function to do it, please comment the return line you don’t need. Accepting any valid Ipv4 with or without valid CIDR Routing Prefix for example 63.161.156.0/24 or 63.161.156.0

To fast check if a given ipv4 is matching a given CIDR you can do it inline like in this example

To get the full range as an array for a given IP (with or without CIDR Routing Prefix) you can use the following code but be carefull because for example 25.25.25.25/16 return an array with 65536 elements and you can easily run out of memory using a smaller Routing Prefix

To fast check if a given ipv4 is matching a given array of IP (with or without CIDR Routing Prefix)

To run fast the function don’t check input but formally it should be a string matching the following regex

If you want to verify the input before using the function

Then the formal answer to your question is the following

You can compile your own function using these examples, hope these few lines have helped you…

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *