Получить сетевой адрес и маску сети в Python

Вопрос или проблема

В моем скрипте на Python мне нужно получить как IP-адрес машины, на которой выполняется скрипт, так и ее сетевой адрес и сетевые байты.

Что касается IP-адреса, я нашел решение в архиве:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("www.google.com",80))
myAddress = (s.getsockname()[0])
s.close()

Но как мне найти сетевой адрес и сетевые байты? Мне нужно поместить эту информацию в фильтр для tcpdump в формате $NetworkAddress/$NetworkBytes, если это поможет.

Пример:

128.1.2.0/20

Я на самом деле могу найти это под inet, когда запускаю ip addr. Есть ли простой способ получить эту информацию в Python?

Для Linux попробуйте

iface = "eth0"
socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM), 
                             35099, struct.pack('256s', iface))[20:24])

или http://github.com/rlisagor/pynetlinux

(как предложено здесь: Получение сетевой маски в Python)

Для Linux, Windows и MacOS рассмотрите http://alastairs-place.net/projects/netifaces/

Обновление:

Если вам нужен cidr (например, ‘128.1.2.0/20’), вы можете использовать любую из связанных библиотек: http://pypi.python.org/pypi?%3Aaction=search&term=cidr&submit=search

Например, netaddr:

>> from netaddr import IPNetwork
>> print str(IPNetwork('1.2.3.4/255.255.255.0').cidr)
1.2.3.0/24

Вы можете получить любую информацию, связанную с ip, с помощью модуля pyroute2:

from pyroute2 import IPDB
ip = IPDB()
print(ip.interfaces['em1'].ipaddr)
ip.release()

Или как вариант:

from pyroute2 import IPRoute
ip = IPRoute()
info = [{'iface': x['index'],
         'addr': x.get_attr('IFA_ADDRESS'),
         'mask': x['prefixlen']} for x in ip.get_addr()]
ip.close()

Ответ или решение

Для решения задачи получения сетевого адреса и сетевой маски в Python можно воспользоваться несколькими методами, в зависимости от операционной системы и доступных библиотек. Ниже представлены подробные шаги, позволяющие реализовать данную функциональность.

Шаг 1: Получение IP-адреса локальной машины

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

import socket

def get_ip_address():
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    s.connect(("www.google.com", 80))
    ip_address = s.getsockname()[0]
    s.close()
    return ip_address

Шаг 2: Получение сетевой маски и сетевого адреса

Для получения сетевой маски и сетевого адреса можно воспользоваться библиотеками netifaces или pyroute2. Ниже я покажу, как это сделать с использованием обеих библиотек. Если у вас их нет, установите их с помощью:

pip install netifaces pyroute2

Вариант 1: Использование netifaces

import netifaces

def get_network_info(interface='eth0'):
    addrs = netifaces.ifaddresses(interface)

    ip_addr = addrs[netifaces.AF_INET][0]['addr']
    netmask = addrs[netifaces.AF_INET][0]['netmask']

    return ip_addr, netmask

# Пример использования
ip, mask = get_network_info()
print(f"IP: {ip}, Netmask: {mask}")

Вариант 2: Использование pyroute2

from pyroute2 import IPDB

def get_network_info_pyroute2():
    with IPDB() as ipdb:
        for iface in ipdb.interfaces:
            if ipdb.interfaces[iface].ipaddr:
                ip_addr = ipdb.interfaces[iface].ipaddr[0]
                prefixlen = ipdb.interfaces[iface].prefixlen[0]
                print(f"Interface: {iface}, IP: {ip_addr}, Prefix Length: {prefixlen}")

# Пример использования
get_network_info_pyroute2()

Шаг 3: Форматирование сети в CIDR

Чтобы преобразовать сетевой адрес и маску в формат CIDR, можно воспользоваться библиотекой ipaddress, которая встроена в стандартную библиотеку Python (начиная с версии 3.3):

import ipaddress

def format_cidr(ip, netmask):
    network = ipaddress.ip_network(f"{ip}/{netmask}", strict=False)
    return str(network)

# Пример использования
ip, mask = get_network_info()
cidr_format = format_cidr(ip, mask)
print(f"CIDR Format: {cidr_format}")

Заключение

Теперь у вас есть полный код, который осуществляет следующие действия:

  1. Получает IP-адрес локальной машины.
  2. Получает сетевую маску.
  3. Форматирует сетевой адрес в формате CIDR.

Эта функциональность может быть интегрирована в ваш существующий скрипт для фильтров tcpdump. Используйте полученные данные в формате NetworkAddress/NetworkBytes, как показано в примере:

print(f"Filter for tcpdump: {cidr_format}")

Следуя этим шагам, вы сможете быстро и эффективно получить нужные сетевые данные с использованием Python.

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

Капча загружается...