Promiscuous mode как включить linux

Обновлено: 02.07.2024

В статье описана настройка сетевого подключения на 3-м уровне модели OSI и выше. Отдельные способы передачи информации рассматриваются на подстраницах /Ethernet и /Wireless.

Contents

Проверка подключения

При проблемах с подключением к сети последовательно проверьте, что:

Для проверки соединения с хостом, используется утилита ping.

Утилита выводит информацию о каждом полученном ответе. Подробнее см. ping(8) . Учтите, что удалённый хост может быть настроен игнорировать ICMP-запросы [1].

Управление сетевым подключением

Для настройки сетевого подключения сделайте следующее:

  1. Убедитесь, что сетевой интерфейс обнаружен и включён.
  2. Подключитесь к сети. Вставьте Ethernet-кабель или подключитесь к беспроводной сети.
  3. Настройте сетевое подключение:
      .
    • динамический IP-адрес: используйте DHCP.
Примечание: В установочном образе в качестве DHCP-клиента используются systemd-resolved и systemd-networkd для всех типов сетевых интерфейсов — Ethernet, WLAN и WWAN.

net-tools

Утилиты net-tools считаются устаревшими; рекомендуется использовать пакет iproute2 [2].

Устаревшая команда Замена
arp ip neigh
ifconfig ip address, ip link
netstat ss
route ip route

iproute2

iproute2 (зависимость мета-пакета base ) предоставляет утилиту командной строки ip(8) для управления сетевыми интерфейсами, IP-адресами и таблицей маршрутизации. Учтите, что сделанные с помощью ip настройки исчезнут после перезагрузки. Для задания постоянных настроек используйте сетевой менеджер или автоматизируйте ip-команды с помощью сценариев или юнитов systemd. Также обратите внимание, что многие команды ip имеют сокращённую форму, но в этой статье для ясности они указываются полностью.

Сетевые интерфейсы

Обнаружение сетевых интерфейсов

Имена как проводных, так и беспроводных интерфейсов можно узнать командами ls /sys/class/net и ip link . Имейте в виду, что префиксом lo обозначается петлевое устройство, которое не используется для сетевых соединений.

Включение и отключение сетевых интерфейсов

Включение и выключение интерфейса производится командой ip link set интерфейс up|down (подробнее см. ip-link(8) ).

Для проверки текущего состояния интерфейса (например, enp2s0 ) выполните:

На состояние интерфейса указывает UP в <BROADCAST,MULTICAST,UP,LOWER_UP> , а не state UP .

Статический или динамический адрес?

Статический IP-адрес

Настройка статического IP-адреса производится либо посредством сетевого менеджера, либо с помощью демона dhcpcd.

IP-адреса

Для управления IP-адресами используется команда ip-address(8) .

Показать существующие IP-адреса:

Добавить IP-адрес к сетевому интерфейсу:

  • адрес указан в CIDR-нотации с маской подсети;
  • спецсимвол + говорит утилите ip вычислить широковещательный адрес на основе IP-адреса и маски подсети.
Примечание: Убедитесь, что добавленные вручную IP-адреса не конфликтуют с адресами, выданными DHCP.

Удалить IP-адрес устройства:

Удалить все адреса определённого интерфейса:

Совет: IP-адрес можно вычислить с помощью ipcalc ( ipcalc ).

Таблицы маршрутизации

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

Настройка таблицы маршрутизации производится командой ip-route(8) .

В примерах ниже значение ПРЕФИКС либо указывается в CIDR-нотации, либо принимает значение default для шлюза по умолчанию.

Показать маршруты IPv4:

Показать маршруты IPv6:

Сервер DHCP предоставляет клиенту динамический IP-адрес, маску подсети, IP-адрес шлюза по умолчанию и опционально — сервер имён DNS.

Для использования DHCP нужен DHCP-сервер в вашей сети и DHCP-клиент на локальной машине:

Сервер

Сетевые менеджеры

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

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

Имя хоста

Имя хоста — уникальное имя-идентификатор машины в сети. Имя хоста хранится в файле /etc/hostname (см. hostname(5) и hostname(7) ). В файле также может храниться доменное имя системы, если таковое имеется. Чтобы задать имя хоста, добавьте в файл /etc/hostname одну строку:

Совет: Рекомендации по выбору имени хоста приведены в RFC 1178.

В качестве альтернативы имя хоста можно задать утилитой hostnamectl(1) :

Утилита hostname(1) из пакета inetutils позволяет задать имя хоста временно, до первой перезагрузки:

См. machine-info(5) о том, как настроить "красивое" имя машины и другие метаданные.

Локальное разрешение имён

Модуль nss-myhostname входящей в состав systemd службы Name Service Switch (NSS) позволяет выполнять разрешение имени локально без обращения к файлу /etc/hosts . Этот модуль включён по умолчанию. Однако следует иметь в виду, что некоторые программы всё же полагаются на файл /etc/hosts . [5], [6]

Добавьте следующие строки в /etc/hosts :

Примечание: Порядок имён/псевдонимов после IP-адреса имеет значение. Сразу после IP-адреса следует "каноническое" имя хоста, к которому при неоходимости может присоединиться название родительского домена, отделенное от имени точкой (как, например, .localdomain выше). Все последующие значения на той же строке считаются псевдонимами. Подробнее см. hosts(5) .

В результате система будет использовать оба варианта — и NSS, и файл /etc/hosts :

Если хост использует статический IP-адрес, то его следует указать вместо 127.0.1.1 .

Разрешение имён в локальной сети

Чтобы машина была доступна по локальной сети по имени хоста, следует выбрать один из вариантов:

Советы и рекомендации

Смена имени интерфейса

Вы можете изменить имя устройства, установив его вручную при помощи правила udev. Например:

Эти правила будут применяться автоматически при загрузке.

Кое-что на заметку:

  • Узнать MAC-адрес интерфейса можно командой cat /sys/class/net/имя_устройства/address
  • Убедитесь, что в правиле udev шестнадцатеричные значения указаны строго в нижнем регистре.

Если сетевой интерфейс имеет динамический MAC-адрес, вместо последнего можно использовать DEVPATH :

DEVPATH подключённых устройств можно узнать по символическим ссылкам в каталоге /sys/class/net/ :

Паттерн пути устройства (DEVPATH) должен подходить для обоих названий устройств, и нового, и старого, поскольку одно и то же правило udev может срабатывать несколько раз в процессе загрузки. Например, во втором правиле в примере выше шаблон "/devices/pci*/*1c.0/*/net/enp*" будет ошибочным, поскольку после изменения имени на en он перестанет совпадать, и если после этого сработает системное правило по умолчанию, то имя изменится обратно на что-то вида enp1s0 .

Если вы используете USB-интерфейс (например, подключаясь через Android-смартфон) с динамическим MAC-адресом и хотите иметь возможность использовать разные USB-порты, можно создать правило на основе данных о производителе и ID устройства:

Проверить созданное правило из пространства пользователя можно командой udevadm --debug test /sys/class/net/* . Не забудьте предварительно отключить интерфейс, который собираетесь переименовать (например, выполнив ip link set enp1s0 down ).

Примечание: При выборе статических имен вы должны избегать использования формата "ethX" и "wlanX", поскольку это может привести к состоянию гонки между ядром и udev во время загрузки системы. Вместо этого лучше взять имена интерфейсов, которые не используются по умолчанию в ядре, например: net0 , net1 , wifi0 , wifi1 . Подробнее см. документацию systemd.

Традиционные названия интерфейсов

Если вы предпочитаете традиционные названия интерфейсов вроде eth0 , отключите назначение предсказуемых имён интерфейсов, создав маску для правила udev.

Другой способ — добавить net.ifnames=0 в параметры ядра.

Установка MTU и длины очереди

Вы можете изменить MTU и длину очереди для устройства, определив их вручную в правиле udev. Например:

tx_queue_len : Малые значения — для медленных устройств с высокой задержкой (ADSL, ISDN). Большие значения рекомендованы для высокоскоростных соединений с серверами, где предполагается передача значительных объёмов данных.

Объединение сетевых интерфейсов (bonding) или LAG

Бондинг — объединение нескольких сетевых интерфейсов в одно логическое устройство. См. статьи netctl, systemd-networkd и Wireless bonding.

Псевдонимы для IP-адресов

Псевдонимы (aliases) необходимы для назначения нескольких IP-адресов одному сетевому интерфейсу. Благодаря этому один узел сети может иметь несколько подключений, каждое из которых будет использоваться для конкретной цели. Типичное применение этой возможности — виртуальный хостинг Web- и FTP-серверов или реорганизация серверов без необходимости обновления каких-либо других машин (особенно полезно для серверов имен).

Пример

Чтобы вручную назначить псевдоним для определенного сетевого интерфейса (например, enp2s0 ) используйте утилиту ip из пакета iproute2 :

Для удаления псевдонима выполните:

По умолчанию для исходящих из определённой подсети пакетов используется основной псевдоним устройства. Если же отправитель находится в подсети вторичного псевдонима, то IP-адрес отправителя в заголовке пакета будет соответствующим. В случае наличия более чем одного сетевого интерфейса маршруты по умолчанию можно узнать командой ip route .

Promiscuous mode

Promiscuous mode ("неразборчивый" режим) предполагает, что (беспроводной) сетевой интерфейс перенаправляет весь входящий трафик ядру операционной системы для дальнейшей обработки. Это противоположность "нормальному режиму", при котором интерфейс отбрасывает пакеты, которые не ожидались быть полученными. Чаще всего эта возможность используется для решения сетевых проблем и анализа пакетов.

Чтобы включить "неразборчивый" режим для интерфейса eth0 , выполните:

Получение информации о сокетах

Показать все TCP-сокеты с названиями сервисов:

Показать все TCP-сокеты с номерами портов:

Показать все UDP-сокеты:

За подробной информацией обращайтесь к справочной странице ss(8) .

Решение проблем

Проблема масштабирования TCP window

Заголовк TCP-пакета содержит поле "Window", которое определяет, какое количество данных может быть прислано в ответ другим хостом. Ширина поля составляет 16 бит, следовательно, размер окна не может превышать 64 Kбайт. С учётом кэширования пакетов, связанного с необходимостью восстановить их исходный порядок, значение окна легко может быть превышено.

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

В итоге соединение в лучшем случае очень медленное или часто прерывается.

Диагностика

Если у вас появилась такая проблема, вывод dmesg будет нормальным, логи - чистыми, а ip addr сообщит о нормальном состоянии. Все будет выглядеть нормально.

Если вы не можете просматривать никакие веб-сайты, но можете отправлять запросы ping на некоторые узлы, высока вероятность, что у вас именно эта проблема: ping использует ICMP, поэтому проблемы TCP на него не влияют.

С помощью Wireshark можно будет увидеть, что UDP- и ICMP-соединения работают, а TCP-соединение с внешними узлами установить не удаётся.

Способы решения проблемы

Плохой

Плохой способ заключается в изменении значения tcp_rmem , на основе которого вычисляется коэффициент масштабирования. Скорее всего, это решит проблему, кроме случая связи с особо удалёнными хостами.

Хороший

Просто отключите масштабирование. Эта функция — довольно приятное дополнение к стандартному TCP, и без неё может быть некомфортно, особенно если вы не имеете возможности перенастроить неправильно работающий маршрутизатор. Есть несколько способов отключения масштабирования, и, кажется, наиболее надёжный из них (работает с большинством ядер) — добавить следующую строку в файл /etc/sysctl.d/99-disable_window_scaling.conf (см. также sysctl):

Лучший

Проблема вызвана неправильно работающим маршрутизатором/межсетевыми экранами, поэтому просто замените его. Некоторые пользователи отмечали, что таким маршрутизатором был их собственный маршрутизатор DSL.

Дополнительная информация

Этот раздел основывается на статье LWN TCP window scaling and broken routers и архивной статье Kernel Trap Window Scaling on the Internet.

На странице LKML есть также несколько ссылок по теме.

Нет подключения к локальной сети через мост

Первый компьютер подключён к двум локальным сетям. Второй — к одной локальной сети и первому компьютеру. Выполните следующие команды, чтобы дать второму компьютеру доступ к сети за мостовым интерфейсом (на первой машине):

Promiscuous Mode ("Неразборчивый" режим) - это режим, при котором сетевой адаптер начинает получать все пакеты независимо от того, кому они адресованы. Если рассматривать promiscuous mode в контексте виртуального свича (vSwitch), а, точнее, группы портов на этом свиче, то данный режим позволит перехватывать все пакеты, проходящие через данную группу портов, любой виртуальной машине, непосредственно присоединенной к ней.

Зачем нужен Promiscuous Mode?

Чтобы лучше понять назначение promiscuous mode, приведу практический пример. Допустим, у нас есть четыре виртуальные машины:

  1. FreeBSD - на этой ВМ стоит чистая FreeBSD 8.2
  2. WinXP - MySQL Primary
  3. WinXP-2 - MySQL Secondary
  4. Debian - Внешний веб-сервер

Прошу не заострять внимание на роли данных виртуальных машин. На самом деле, на этих ВМ стоят чистые операционные системы, и больше ничего нет. Роли расписаны для примера и полноты картины.

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

Как видно выше, все четыре ВМ находятся в одной группе портов и прекрасно себе работают. Но в один очень хороший день вы решаете на фактически простаивающей ВМ с чистой ОС FreeBSD установить IDS, так сказать, чтобы спалось спокойно.

Для нормальной работы IDS в среде VMware vSphere (да и не только) нужно, чтобы на определенной группе портов или на виртуальном свиче был активирован Promiscuous Mode.

Казалось бы, что проще: нужно всего лишь активировать promiscuous mode для группы портов "VM Network" и установить на FreeBSD какую-нибудь IDS. Но у данного подхода есть очень большой минус - при этом все виртуальные машины, входящие в данную группу портов, смогут перехватывать пакеты, им не адресованные. А это очень большая брешь в безопасности. Тогда как же быть? Как повысить безопасность? Ответить на эти вопросы и решить проблему с безопасностью нам помогут VLAN'ы. Поэтому переконфигурируем нашу сеть, используя для достижения поставленной цели VLAN'ы.

Настройка

Первым делом нужно создать две группы портов на vSwitch0 с одним и тем же VLAN ID:

Чуть выше мы создали группу портов VLAN-10-DPM (DPM - Disable Promiscuous Mode) и VLAN-10-EPM (EPM - Enable Promiscuous Mode). Чтобы изменения вступили в силу, перезапускаем Management Network (перезапустить можно непосредственно через консоль сервера, либо в окне терминала, выполнив dcui):

Как только перезапустится Management Network, наша сеть приобретет вот такой вид:

Следующим шагом активируем Promiscuous Mode для группы портов VLAN-10-EPM:

Затем перенастраиваем ВМ FreeBSD на группу портов VLAN-10-EPM, а остальные три виртуальные машины - на группу VLAN-10-DPM.

Не забывайте про то, что когда вы измените для ВМ группу портов, она сразу же станет недоступна для других (внешних) сетей, если до этого вы НЕ НАСТРОИЛИ физический свич + роутер на корректную обработку VLAN.

Для этого переходим в настройки ВМ, выбираем Network Adapter и, в Network Label, выбираем VLAN-10-DPM или VLAN-10-EPM:

После всех манипуляций наша сеть будет выглядеть следующим образом:

Теперь ВМ с FreeBSD, находясь в группе VLAN-10-EPM, сможет перехватывать и анализировать (если к этому моменту стоит IDS) весь трафик, который проходит внутри группы VLAN-10-DPM. При этом ВМ, входящие в группу VLAN-10-DPM, не смогут перехватывать трафик друг друга.

Тестирование

Чтобы убедиться, что все настроено правильно, нужно протестировать. Для этого на ВМ WinXP (IP: 192.168.33.87) пускаем пинг до виртуальной машины WinXP-2 (IP: 192.168.33.28). А на FreeBSD запускаем на выполнение программу tcpdump, которая переведет сетевой интерфейс в promiscuous mode и начнет выводить на экран захваченные пакеты:

Как видно выше, FreeBSD получает пакеты, которые ей не адресованы, то есть promiscuous mode работает. А это значит, что и IDS будет работать так, как положено, анализируя весь трафик, который "бегает" внутри группы VLAN-10-DPM.

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

Если в настройках vSwitch активировать Promiscuous Mode, то он будет активирован для всех групп портов:

Будьте очень внимательны и активируйте promiscuous mode только для тех групп портов, где это действительно необходимо.

Включаем интерфейс, для работы ifup с enp интерфейсами нужно их переименовывать.

Изменяем MAC на Wi-Fi интерфейсе MAC OS.

PROMISCUOUS
Переименование интерфейсов

Временное (до перезагрузки)

Сохраняется и после перезагрузки

IP multicast
MACSEC


Static настройка интерфейса через файл /etc/network/interfaces

Если на сервере нет vim (есть только vi), возможно есть vim.tiny (на примере Debian).

Пример файла с настройками интерфейса + статическими (permanent) маршрутами через файл interfaces.

Рестарт
NETWORK INTERFACE CARD info (lshw, lspci)
ETHTOOL
ETHTOOL: RSS (HASH) and queues

Receive side scaling (RSS) is a network driver technology that distributes the receiving of network traffic more efficiently by distributing receive processing across multiple CPUs in a multiprocessor system. In simple terms, RSS allows a system to process more received traffic because it uses all available CPUs instead of just one.

По умолчанию сетевые интерфейсы имеют настройку hash SRC & DST IP для UDP трафика и hash SRC & DST IP and PORTs для TCP трафика. Для реализации симметричного (symmetric RSS) распределения по очередям может изменяться (поддерживает незначительное количество сетевых карт):

    • можно посмотреть и изменить используемый ключ для hash (Random Secret Key, RSK) на ряде сетевых карт (напр. Intel X710) на симметричный с меньшей энтропией (т.е. балансировка в целом будет хуже, но это плата за симметричность)
    • можно посмотреть и изменить XOR функцию на ряде сетевых карт (напр. Mellanox ConnectX-5)

    Перераспределение может происходить к процессам ksoftirqd (их еще надо настроить, напр, с использованием qdisc). Количество очередей RSS обычно делается равным количеству процессов, на которые трафик распределяется. Подробнее про распределение трафика в статье про CPU affinity.

    QUEUES

    Пример количества очередей RSS на сетевых картах.

    Описание логики symmetric HASH. Пример настройки на Mellanox, Intel картах выше.

    По умолчанию выделяется по одной очереди RX/TX на виртуалки.

    ethtool: Offload
      • Large Send Offload (LSO),
      • Large Receive Offload (LRO),
      • TCP segmentation offload (TSO),
      • generic segmentation offload (GSO)
      • Общее количество пакетов в дампе будет меньше, чем по факту было в сети
      • Максимальный размер сегмента в снятом дампе трафика может быть значительно более согласованного MSS из-за включенного TCP offload на сетевой карте в виде .
      • Так же из-за включенного offload в дампе могут быть некорректные TCP checksum, хотя с фактическим трафиком в сети такой проблемы нет.

      Рекомендации snort по отключению offload:

      Для удобства выключение offload в одном месте:

      ETHTOOL, sys/class, netstat, ip link: статистика по интерфейсу

      Для получения общей статистики по интерфейсам, помимо ethtool, может помочь ifconfig, netstat, ip link (-s).

      Пример настроенного распределения по 8ми очередям с помощью RSS.

      ethtool: Ошибки

      Для VM ethtool может быть крайне урезан, вплоть до полной нефункциональности.

      пятница, 22 октября 2010 г.

      Standard vSwitch - часть 2

      Продолжаем знакомиться с вирутальной сетевой инфраструктурой VMware vSphere. В этом посте мы рассмотрим расширенный функционал, предлагаемый VMware для vSwitch.

      • Security
        • Promiscuous mode enable/disable
        • MAC Address Change enable/disable
        • Forged Transmit enable/disable


        VLAN A - любой VLAN от 1 до 4094, а VLAN B - любой другой VLAN от 1 до 4094, но не равный A. Конкретные числа не имеют значения, достаточно того, что VLAN'ы не совпадают.

        Итак, чтобы увидеть, кто с кем может общаться:


        Если vSwitch сконфигурирован с включенным режимом "Promiscuous Mode", то vNIC в PG_VGT сможет увидеть весь трафик vSwitch. В то же время, vNIC из PG_EST сможет увидеть только трафик внутри своей портгруппы (или любой другой портгруппы в EST режиме, VLAN = 0). В остальном таблица довольно проста для понимания, за исключением колонки PG_VGT. Строки PG_VLA, PG_VLB и PG_VLB1 содержат и "Yes" и "No" - vNIC в PG_VLA (например) сможет увидеть трафик только для VLAN A, который может включать в себя трафик для PG_VGT.

        MAC Address Change

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

        Forged Transmit

        Параметр Forged Transmit схож по своему действию с MAC Address Change, с той лишь разницей, что он затрагивает исходящий, а не входящий трафик. При "Accept" vSwitch будет обрабатывать и пересылать пакеты с "подделанным" (forged) MAC адресом. "Reject" соотв. запрещает пересылку пакетов от MAC адреса, не совпадающего с прописанным в .vmx, и заставляет vSwitch игнорировать подобные пакеты. Точно так же, без уведомления гостевой ОС.

        Параметры Forged Transmit и MAC Address Change необходимо установить в "Accept" для поддержки Unicast NLB.

        Читайте также: