Найти - Пользователи
Полная версия: Проверка корректности ввода маски подсети
Начало » Python для новичков » Проверка корректности ввода маски подсети
1 2
PEHDOM
млин, это обратная маска, модуль понимает это. . Но не все понимают обратную маску. Область применения обратной маски это условные операции с IP адресами в cisco like интерфейсе и идеологии. Наврядли ТС это нужно. но на крайний случай можно проверять не обратная ли это маска. перед основной проеркой.
py.user.next
PEHDOM
млин, это обратная маска, модуль понимает это
Ну, и что это значит тогда? Что в модуле ошибка? Ты говоришь “это не маска”, модуль говорит “это маска”. Кто прав?
PEHDOM
млин, что такое ИП адрес и что такое маска сети? на примере ipV4
ИП адрес это 32 бита, 4 октета. Состоит из единиц и нулей
Маска подсети указывает какая часть ИП адреса являеться адресом сети, а какая адресом узла в сети.
Адрес: 192.168.0.1 11000000 10101000 00000000 00000001
маска: 255.255.255.252 11111111 11111111 11111111 11111100
означает что сеть может иметь диапазон адресов от 192.168.0.1 до 192.168.0.2
При этом 192.168.0.0 это адрес подсети, а 192.168.0.3 это броадкаст.
теперь обратная маска для это подсети будет 00000000 00000000 00000000 00000011
но это в общем случае. У обратной маски область применения более широкая чем просто указывать область хоста в IP адресе.
повторюсь: Область применения обратной маски это условные операции с IP адресами в cisco like интерфейсе и идеологии. В частности списки доступа (ACL) – позволяя создавать не просто условия типа “хост из этой сети”, а гораздо более гибкие правила и определение сетей. Например можно указать что пропускать только четные хосты, всего одним выражением, а не перечислять все 128 хостов, при маске /24.
В обратной маске единицы это обозначение битов в IP адресе, которые могут меняться при проверке условий, а нули фиксируют неизменные биты. Поэтому проверить валидность обратной маски вообще нереально, там необязательно чтобы нули и единицы шли подряд. Это всего лишь УСЛОВИЕ при проверке на вхождение.
в твоем примере
 ipaddress.IPv4Network('192.168.0.1/0.0.0.240')
IPv4Network('192.168.0.1/32')
последние 4 бита меняться не могут поэтому ipaddress тебе честно сказал что твоя сеть будет состоять из одного хоста 192.168.0.1 , попробуй назначить такой адрес с такой маской(192.168.0.1/0.0.0.240) сетевому адаптеру, посмотрим что он тебе скажет.

py.user.next
Ну, это так устоялось просто исторически, но это не факт, что можно только так маски применять.
О_о прямые только так, нет никаких “историческисложилось” есть четкое определения что такое маска подсети, она же прямая маска и зачем она нужна, и как она должна выглядеть.
Есть также четкое определения что такое обратная маска где применяеться, и как ее обрабатывать.
По поводу ipaddress не могу сказать как он проверяет обратную маску на валидность, имхо это вообще невозможно.Количество прямых масок — 33, обратных — 4294967296
в догонку:
 >>> ipaddress.IPv4Address(3232235521)
IPv4Address('192.168.0.1')
значит ли это что 3232235521 это валидный ИП адрес?
py.user.next
PEHDOM
О_о прямые только так, нет никаких “историческисложилось” есть четкое определения что такое маска подсети, она же прямая маска и зачем она нужна, и как она должна выглядеть.
Маска берёт своё название от битовой маски, а битовая маска происходит от слова маскировать. Так что то, что в ней должны идти единицы, а потом нули - это очень специфичное дополнение, связанное только с сетями, которые имели определённое историческое устройство.

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

PEHDOM
значит ли это что 3232235521 это валидный ИП адрес?
Там в документации сказано, что 32-битное число можно подать в функцию формирования адреса, поэтому 0xc0a80001 вполне подходит. Ты же не думаешь, что адреса хранятся в виде 192.168.0.1 , они хранятся в 4-х байтах обычно для компактности, тогда как запись 192.168.0.1 занимает 11 байт.
PEHDOM
py.user.next
Так что то, что в ней должны идти единицы, а потом нули - это очень специфичное дополнение, связанное только с сетями, которые имели определённое историческое устройство.
ну так ТС и писал
alexbestalex
проверить корректность ввода маски подсети .

py.user.next
Вот этот код можно только дописать. Всё, что там уже есть, всё делается правильно. Для анализа последовательности битов надо использовать сдвиг в цикле без всяких рекурсий.
ну я же писал что алгритм сложный, и нафиг не нужный, проще перевести в двоичную систему, а еще проще вобще создть кортеж, где перечислены все 33 возможные маски, много памяти это не займет, и потом просто проверять вхождение оператором in.
А твой код, это общая проверка на правильность введенного ИП адреса.
py.user.next
Там в документации сказано, что 32-битное число можно подать в функцию формирования адреса, поэтому 0xc0a80001 вполне подходит. Ты же не думаешь, что адреса хранятся в виде 192.168.0.1 , они хранятся в 4-х байтах обычно для компактности, тогда как запись 192.168.0.1 занимает 11 байт.
Угу я тоже умею читать документацию, там также сказано что ip_network прнимает в качестве аргумента через / или одно число которое явлеться к-вом байт в адресе сети(prefix), или строку ИП адреса, которая в дальнешем интерпретируеться как маска подсети если начинаеться с не нуля, или как маска хоста если начинаеться с нуля.
Ты передаешь аргуметном маску хоста, и на основании того что ipaddress не выдал ошибку, утверждаешь что это маска сети.
PEHDOM
да кстати мне https://www.python.org/shell/ выдает что твой пример не является маской.
 >>> ipaddress.IPv4Network('192.168.0.1/0.0.0.240')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/ipaddress.py", line 1531, in __init__
    self.netmask, self._prefixlen = self._make_netmask(arg)
  File "/usr/lib/python3.6/ipaddress.py", line 1094, in _make_netmask
    prefixlen = cls._prefix_from_ip_string(arg)
  File "/usr/lib/python3.6/ipaddress.py", line 533, in _prefix_from_ip_string
    cls._report_invalid_netmask(ip_str)
  File "/usr/lib/python3.6/ipaddress.py", line 474, in _report_invalid_netmask
    raise NetmaskValueError(msg) from None
ipaddress.NetmaskValueError: '0.0.0.240' is not a valid netmask
py.user.next
PEHDOM
Ты передаешь аргуметном маску хоста, и на основании того что ipaddress не выдал ошибку, утверждаешь что это маска сети.
PEHDOM
выдает что твой пример не является маской.
Там, на самом деле, запутанная история. Наверное, ты прав, а в ipaddress ошибки всякие. Сейчас там в докстринге функции записано, что эти формы должны приниматься, но по факту они не принимаются.


github. ipaddress.py
(строку не даю, может поменяться со временем)

class IPv4Network(_BaseV4, _BaseNetwork):

"""This class represents and manipulates 32-bit IPv4 network + addresses..
Attributes: [examples for IPv4Network('192.0.2.0/27')]
.network_address: IPv4Address('192.0.2.0')
.hostmask: IPv4Address('0.0.0.31')
.broadcast_address: IPv4Address('192.0.2.32')
.netmask: IPv4Address('255.255.255.224')
.prefixlen: 27
"""
# Class to use when creating address objects
_address_class = IPv4Address

def __init__(self, address, strict=True):

"""Instantiate a new IPv4 network object.
Args:
address: A string or integer representing the IP [& network].
'192.0.2.0/24'
'192.0.2.0/255.255.255.0'
'192.0.0.2/0.0.0.255'
are all functionally the same in IPv4. Similarly,
'192.0.2.1'
'192.0.2.1/255.255.255.255'
'192.0.2.1/32'
are also functionally equivalent. That is to say, failing to
provide a subnetmask will create an object with a mask of /32.
...

Вот это - строка из докстринга, которая должна приниматься
  
>>> import ipaddress
>>> 
>>> ipaddress.IPv4Network('192.0.0.2/0.0.0.255')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/mnt/disk100a/guest/gitrepos/cpython/main/Lib/ipaddress.py", line 1536, in __init__
    raise ValueError('%s has host bits set' % self)
ValueError: 192.0.0.2/24 has host bits set
>>>

Так что, видимо, можно содать багрепорт на bugs.python.org , в котором сказать им, что у них докстринг не совпадает с поведением. По blame'у видно, что последний, кто туда лазил, - это Antoine Pitrou в 2014 году, вот он походу и поменял поведение, а докстринг не изменил под него.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB