Выполнение подсетей IP и двоичного преобразования в терминале Linux

CompTIABeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы освоите основные навыки подсетирования IP-адресов и двоичного преобразования с использованием командной строки Linux. Используя интерактивный интерпретатор Python, вы получите практический опыт выполнения фундаментальных расчетов, лежащих в основе компьютерных сетей, переходя от теоретических знаний к практическому применению в терминальной среде.

Вы начнете с преобразования IP-адресов из привычной десятично-точечной нотации в их 32-битное двоичное представление и обратно. Затем лабораторная работа проведет вас через перевод CIDR-масок подсети в их двоичные и десятично-точечные эквиваленты. Наконец, вы примените эти навыки для определения сетевой и хостовой частей заданного IP-адреса и расчета общего количества доступных для использования хостов и подсетей в пределах определенного CIDR-блока.

Выполнение преобразований IP-адресов и масок подсети в Python

На этом этапе вы будете использовать интерактивный интерпретатор Python для выполнения нескольких ключевых сетевых преобразований. Вы научитесь преобразовывать IP-адреса между десятично-точечным и двоичным форматами, а также переводить CIDR-маски подсети в их полные двоичные и десятично-точечные представления. Все это будет сделано в одном непрерывном сеансе для оптимизации процесса.

IPv4-адрес — это 32-битное число. Чтобы сделать его читаемым для человека, он представляется в виде четырех 8-битных чисел, называемых октетами, разделенных точками (например, 192.168.1.10). Каждый из этих октетов может быть преобразован в 8-битное двоичное число.

  1. Сначала откроем терминал и запустим интерактивный интерпретатор Python. В среде LabEx Python предустановлен. Введите python3 и нажмите Enter.

    python3
    

    Вы увидите новый приглашение >>>, которое указывает, что вы находитесь внутри интерпретатора Python.

    Python 3.10.x (...)
    Type "help", "copyright", "credits" or "license" for more information.
    >>>
    

Преобразование IP-адреса из десятично-точечного в двоичный

  1. Попрактикуемся в преобразовании одного десятичного числа в его двоичную форму. Мы будем использовать встроенную функцию Python bin(). Например, чтобы преобразовать число 192, введите следующее в приглашении Python:

    bin(192)
    

    Python вернет двоичное представление с префиксом 0b, указывающим, что это двоичное число.

    '0b11000000'
    

    Двоичный эквивалент 19211000000.

  2. Теперь применим это к полному IP-адресу, например, 192.168.1.10. Нам нужно преобразовать каждый октет (192, 168, 1 и 10) по отдельности. Важное правило в IP-адресации заключается в том, что каждый октет должен быть представлен ровно 8 битами. Если двоичное число имеет менее 8 бит, его необходимо дополнить ведущими нулями.

    Преобразуем каждую часть:

    • Для 192: bin(192) дает '0b11000000'. Это уже 8 бит: 11000000.
    • Для 168: bin(168) дает '0b10101000'. Это также 8 бит: 10101000.
    • Для 1: bin(1) дает '0b1'. Мы должны дополнить его до 8 бит: 00000001.
    • Для 10: bin(10) дает '0b1010'. Мы должны дополнить его до 8 бит: 00001010.

    Объединив их, вы получите полное 32-битное двоичное представление IP-адреса 192.168.1.10:

    11000000.10101000.00000001.00001010

Преобразование двоичного IP-адреса обратно в десятично-точечный

  1. Теперь выполним обратную операцию. Для преобразования двоичного числа в десятичное мы будем использовать функцию Python int(). Эта функция может принимать два аргумента: первый — число в виде строки, а второй — основание этой системы счисления. Поскольку мы преобразуем из двоичной системы (основание 2), мы всегда будем использовать 2 в качестве второго аргумента.

    Попробуем преобразовать один двоичный октет, 10101000, в десятичный.

    int('10101000', 2)
    

    Python выполнит преобразование и отобразит десятичный результат.

    168
    
  2. Теперь преобразуем полный 32-битный двоичный IP-адрес из предыдущего шага: 11000000.10101000.00000001.00001010. Вам нужно будет преобразовать каждый 8-битный октет по одному.

    • Преобразуем первый октет: int('11000000', 2), что дает 192.
    • Преобразуем второй октет: int('10101000', 2), что дает 168.
    • Преобразуем третий октет: int('00000001', 2), что дает 1.
    • Преобразуем четвертый октет: int('00001010', 2), что дает 10.

    Объединив эти результаты с точками, вы получите исходный десятично-точечный IP-адрес: 192.168.1.10. Это подтверждает правильность ваших преобразований в обоих направлениях.

Перевод CIDR-маски подсети в ее двоичную и десятично-точечную форму

Маска подсети — это 32-битное число, которое отличает сетевую часть IP-адреса от части хоста. CIDR (Classless Inter-Domain Routing — бесклассовая междоменная маршрутизация) — это сокращенный способ представления маски подсети.

Например, обозначение CIDR /24 означает, что первые 24 бита 32-битной маски подсети равны 1, а оставшиеся биты — 0.

  1. Определим двоичное и десятично-точечное представление для маски подсети /24.

    • Двоичное: Маска /24 имеет 24 последовательных 1, за которыми следуют 32 - 24 = 8 0. При разбиении на октеты она выглядит так: 11111111.11111111.11111111.00000000
  2. Теперь преобразуем эту двоичную маску в ее десятично-точечную форму. Первый октет состоит из одних единиц, 11111111.

    int('11111111', 2)
    

    Результатом будет 255. Последний октет состоит из одних нулей, 00000000.

    int('00000000', 2)
    

    Результатом будет 0. Следовательно, маска подсети /24 в десятично-точечной нотации — 255.255.255.0.

  3. Попробуем более сложный пример, например, /26.

    • Двоичное: Маска /26 имеет 26 1, за которыми следуют 32 - 26 = 6 0. 11111111.11111111.11111111.11000000
    • Первые три октета состоят из одних 1, что, как мы знаем, равно 255. Преобразуем последний октет, 11000000, в десятичное число.
    int('11000000', 2)
    

    Результатом будет 192. Таким образом, маска подсети /26 в десятично-точечной нотации — 255.255.255.192.

  4. После завершения преобразований вы можете выйти из интерпретатора Python и вернуться в обычное приглашение терминала, введя exit() и нажав Enter.

    exit()
    

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

Определение сетевой и хостовой частей IP-адреса

На этом этапе вы примените свои знания масок подсети для определения сетевой и хостовой частей заданного IP-адреса. Основная функция маски подсети заключается в том, чтобы сообщить компьютеру, какая часть IP-адреса идентифицирует сеть, а какая — конкретное устройство (хост) в этой сети.

Это достигается с помощью побитовой логической операции AND. Компьютер берет IP-адрес (в двоичном виде) и маску подсети (в двоичном виде) и выполняет над ними операцию AND. Результатом является сетевой адрес.

Правила для побитового AND просты:

  • 1 AND 1 = 1
  • 1 AND 0 = 0
  • 0 AND 1 = 0
  • 0 AND 0 = 0

По сути, результат равен 1 только в том случае, если оба соответствующих бита равны 1.

Давайте рассмотрим практический пример, чтобы увидеть это в действии. Мы определим сетевой адрес для IP-адреса 192.168.1.74 с маской подсети /26 (255.255.255.192). Вместо того чтобы делать это вручную в интерпретаторе, мы напишем небольшой скрипт на Python для выполнения расчета.

  1. Сначала создайте новый файл скрипта Python с именем network_calc.py в вашем каталоге проекта с помощью редактора nano.

    nano ~/project/network_calc.py
    
  2. В редакторе nano скопируйте и вставьте следующий код Python. Этот скрипт определяет IP-адрес и маску, выполняет операцию AND для каждого октета и выводит результат.

    ## Define the IP address and subnet mask octets
    ip = [192, 168, 1, 74]
    mask = [255, 255, 255, 192]
    
    ## Calculate the network address using a bitwise AND
    network_addr = [ip[i] & mask[i] for i in range(4)]
    
    ## Format the output strings
    ip_str = ".".join(map(str, ip))
    network_str = ".".join(map(str, network_addr))
    
    print(f"IP Address:      {ip_str}")
    print(f"Subnet Mask:     /26 (255.255.255.192)")
    print(f"Network Address: {network_str}")
    
  3. Сохраните файл и выйдите из nano, нажав Ctrl+O, затем Enter, и наконец Ctrl+X.

  4. Теперь запустите ваш скрипт из терминала.

    python3 ~/project/network_calc.py
    

    Вы увидите следующий вывод, который наглядно демонстрирует результат операции AND:

    IP Address:      192.168.1.74
    Subnet Mask:     /26 (255.255.255.192)
    Network Address: 192.168.1.64
    

Из этого вывода мы можем выделить различные части:

  • Сетевая часть (Network Portion): Маска /26 указывает, что первые 26 бит являются сетевой частью. Вычисленный Network Address (192.168.1.64) является идентификатором этой конкретной сети.
  • Хостовая часть (Host Portion): Оставшиеся 32 - 26 = 6 бит являются хостовой частью. Эти 6 бит идентифицируют конкретное устройство (.74) в сети 192.168.1.64.

Вы успешно использовали скрипт для поиска сетевого адреса и теперь можете концептуально различать сетевую и хостовую части IP-адреса.

Расчет доступных хостов и подсетей для заданного CIDR

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

Вот ключевые формулы:

  • Количество доступных хостов: Формула 2^n - 2, где n — количество хостовых битов (нули в маске подсети). Мы вычитаем 2, потому что первый адрес в подсети (где все хостовые биты равны 0) зарезервирован как сетевой адрес, а последний адрес (где все хостовые биты равны 1) зарезервирован как широковещательный адрес (Broadcast Address). Ни один из них не может быть назначен устройству.
  • Количество подсетей: Это рассчитывается, когда вы делите большую сеть (например, /24) на меньшие (например, /26). Формула 2^m, где m — количество битов, которые вы "одолжили" из исходной хостовой части для создания новой, более специфичной маски подсети.

Давайте улучшим наш скрипт network_calc.py для выполнения этих расчетов.

  1. Сначала откройте файл network_calc.py снова с помощью редактора nano.

    nano ~/project/network_calc.py
    
  2. Удалите существующее содержимое и замените его следующим кодом Python. Эта новая версия фокусируется на расчете количества хостов и подсетей на основе заданного префикса CIDR.

    ## Define the CIDR prefix and the base network prefix
    cidr_prefix = 26
    base_prefix = 24 ## The original network we are subnetting from (e.g., a /24)
    
    ## --- Calculations ---
    
    ## 1. Calculate host bits
    host_bits = 32 - cidr_prefix
    
    ## 2. Calculate usable hosts
    ## The ** operator is for exponentiation (power of)
    if host_bits > 0:
        total_hosts = 2**host_bits
        usable_hosts = total_hosts - 2
    else:
        total_hosts = 1
        usable_hosts = 1 ## For /31 and /32, rules are different, but we simplify here
    
    ## 3. Calculate subnet bits borrowed
    subnet_bits = cidr_prefix - base_prefix
    
    ## 4. Calculate number of subnets
    if subnet_bits >= 0:
        num_subnets = 2**subnet_bits
    else:
        num_subnets = "N/A (Prefix is smaller than base)"
    
    
    ## --- Output ---
    print(f"--- Subnet Calculations for a /{cidr_prefix} Network ---")
    print(f"Host Bits: {host_bits}")
    print(f"Total Hosts per Subnet: 2^{host_bits} = {total_hosts}")
    print(f"Usable Hosts per Subnet: {total_hosts} - 2 = {usable_hosts}")
    print("") ## Adds a blank line for readability
    print(f"--- Subnetting from a /{base_prefix} Network ---")
    print(f"Subnet Bits Borrowed: {subnet_bits}")
    print(f"Number of Subnets Created: 2^{subnet_bits} = {num_subnets}")
    
  3. Сохраните файл и выйдите из nano, нажав Ctrl+O, Enter и Ctrl+X.

  4. Запустите обновленный скрипт из вашего терминала.

    python3 ~/project/network_calc.py
    
  5. Скрипт теперь выведет рассчитанные значения:

    --- Subnet Calculations for a /26 Network ---
    Host Bits: 6
    Total Hosts per Subnet: 2^6 = 64
    Usable Hosts per Subnet: 64 - 2 = 62
    
    --- Subnetting from a /24 Network ---
    Subnet Bits Borrowed: 2
    Number of Subnets Created: 2^2 = 4
    

Этот вывод наглядно показывает, что для сети /26 имеется 6 хостовых битов, что позволяет получить 2^6 = 64 общих адреса. После резервирования сетевого адреса и широковещательного адреса остается 62 доступных хоста. Он также показывает, что если вы начали с сети /24, вы одолжили 2 бита для создания маски /26, что приводит к 2^2 = 4 возможным подсетям.

Резюме

В этой лабораторной работе вы научились выполнять основные расчеты IP-адресов и подсетей непосредственно в терминале Linux. Вы использовали интерактивный интерпретатор Python как мощный инструмент для преобразования IP-адресов из удобочитаемого формата с десятичными точками в их 32-битный двоичный эквивалент и обратно. Это включало преобразование каждого октета по отдельности и обеспечение правильного 8-битного дополнения. Вы также отработали перевод обозначения маски подсети CIDR в ее полную двоичную форму и форму с десятичными точками.

Опираясь на эти навыки преобразования, вы применили их для выполнения основных задач сетевого анализа. Вы научились различать сетевую и хостовую части IP-адреса, используя маску подсети. Наконец, вы выполнили необходимые расчеты для определения количества доступных хостовых адресов и общего количества подсетей для сети на основе ее заданного префикса CIDR, что укрепило ваше понимание принципов подсетей IP.