Советы и трюки для настройки сети в Linux

Настройка сети Linux

Большую часть времени мы используем только самые простые возможности сетевого стека Linux. Маршрут по умолчанию, SNAT, несколько правил netfilter — все, что нужно среднему маршрутизатору. Но есть множество функций для менее распространенных и даже весьма нестандартных ситуаций.

Например, возможность использовать нестандартный широковещательный адрес IPv4 sudo ip addr add 192.0.2.1/24 broadcast 192.0.2.2 dev eth0. Технически ни один RFC этого не запрещает. Я данной возможностью не воспользовался ни разу, но почти уверен, что кто-то нашел ей осмысленное применение.

Dummy interfaces

В отличие от Cisco IOS и систем семейства BSD, в Linux может быть только один loopback interface, который всегда называется lo и несет на себе тот самый адрес 127.0.0.1/8. Если надо просто несколько адресов для разных демонов, можно присвоить их на тот же интерфейс lo.

Но что делать, если требуется несколько независимых локальных интерфейсов?

Некоторые советуют решать эту проблему использованием не по назначению интерфейсов других типов, вроде мостов. Не слушайте их. Правильное решение — использовать интерфейсы типа dummy, которые аналогичны loopback во всем, кроме названия. Исторически так сложилось, что loopback — это уникальный интерфейс lo, и для совместимости сделали отдельный тип.

А зачем мне несколько интерфейсов loopback?

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

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

РЕКОМЕНДУЕМ:
Проверка скорости интернет-соединения в терминале Linux

Какой выбрать? Любой интерфейс маршрутизатора потенциально может уйти в down, но сессии BGP и SSH должны работать. Поскольку loopback или dummy самопроизвольно не уйдет в down никогда, можно присвоить ему отдельный адрес и анонсировать его остальной сети через протокол OSPF (Open Shortest Path First), который использует multicast и не зависит от конкретных адресов интерфейсов. В этом случае адрес на loopback останется доступным, если у маршрутизатора есть хотя бы один живой канал в остальную сеть.

MACVLAN

У любого интерфейса L2 может быть один и только один MAC-адрес. Что делать, если надо отправлять кадры с разным MAC-адресом с одного физического интерфейса?

У ядра Linux на это есть ответ, и тип таких интерфейсов называется macvlan. Создать и поднять его можно следующими командами:

В опции link мы указываем родительский физический интерфейс. По умолчанию используется случайный MAC-адрес, но ничто не мешает присвоить любой другой командой ip link set dev macvlan0 address <some MAC>.

Посмотрим на статус нового интерфейса:

Если присвоить нашему виртуальному интерфейсу адрес из сети 203.0.113.0/24, можно увидеть, что весь трафик в эту сеть отправляется с MAC-адреса от macvlan0, а не родительского eth0.

Зеркалирование трафика

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

Правила зеркалирования создаются с помощью tc. Мы рассмотрим только простейший случай: готовый рецепт для зеркалирования с dum0 на dum1 (интерфейсы можно подставить любые):

Опция mirred дает возможность как копировать, так и перенаправлять пакеты с одного интерфейса на другой. В сочетании с классификаторами трафика из tc можно настроить самые разные сценарии, от зеркалирования только определенного трафика до отправки трафика сверх определенной полосы пропускания на другой интерфейс.

Маршруты blackhole

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

РЕКОМЕНДУЕМ:
Аналоги Microsoft Office для Linux

Зараженные хосты шлют трафик к контроллеру ботнета по адресу 192.0.2.10? Просто добавьте такой маршрут:

Теперь трафик к 192.0.2.10 ядро будет сразу отправлять в /dev/null. Кроме blackhole, есть и другие виды маршрутов, которые отличаются действиями ядра. Их можно использовать, чтобы точнее сообщить клиенту, что происходит, или для эмуляции разных ситуаций в сети.

  • blackhole — уничтожить пакет и ничего не делать;
  • prohibit — уничтожить пакет и отправить клиенту ICMP host prohibited;
  • unreachable — уничтожить пакет и отправить клиенту ICMP host unreachable;
  • throw — уничтожить пакет и отправить клиенту ICMP net unreachable.

В маршрутизаторах BGP у маршрутов blackhole есть и более интересное применение, но это другая история.

Группы интерфейсов

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

Неудобство состоит в том, что интерфейсы нужно добавлять в группы по одному, командой ip link set <intf> group <number>. Номер группы должен быть в диапазоне от 1 до 255, по умолчанию интерфейсы принадлежат группе 0.

Создадим пару интерфейсов dummy и добавим их в группу номер 10:

Как обычно, интерфейсы создаются в выключенном состоянии:

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

К сожалению, простого способа увидеть список групп в Linux нет. Зато есть возможность присвоить группам понятные человеку имена. Соответствие номеров и имен хранится в файле /etc/iproute2/group.

По умолчанию там определена только группа 0, новые записи легко добавить по аналогии:

Больше символьных имен

Кроме групп интерфейсов, присвоить символьные имена можно и другим объектам. В /etc/iproute2/ найдутся файлы настроек для разных целей.

Например, если вы используете policy-based routing, можно присвоить имена таблицам маршрутизации, добавив записи в /etc/iproute2/rt_tables:

Поточное выполнение команд iproute2

Все давно привыкли к iptables-save и iptables-restore, но вот команды ip очень часто так и вводят по одной даже в скриптах.

Между тем там давно существует опция -batch, которая позволяет читать команды из файла. Писать ip в командах внутри файла не нужно. Вот так можно было бы автоматизировать создание интерфейсов dummy из предыдущих пунктов:

Машиночитаемый вывод информации

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

Можно получить вывод либо в традиционном для UNIX формате из полей с разделителями, либо в JSON.

Опция --brief ( -br) идеальна для разбора с помощью cut или awk -F' ' и отлично подойдет для применения в традиционных скриптах Shell:

Если адресов у интерфейса несколько, они все будут выведены через пробел после состояния интерфейса, сначала IPv4, затем IPv6.

Вывод в JSON

Если вы решили порвать с прошлым и пишете скрипты, к примеру, на Python, вывод в JSON может быть предпочтительнее.

Эта возможность в iproute2 появилась недавно (с версии 4.13) и имеет ряд особенностей, граничащих с багами. Надеюсь, их исправят в следующих версиях.

Важный момент: опции --json и --brief не взаимоисключающие. Их можно указать одновременно, в этом случае вывод будет менее детальным.

Посмотрим на пример вывода для ip address show:

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

Тем не менее вывод не подвержен ошибкам разбора, предоставляет большое количество информации (особенно без --brief) и не слишком сложен в работе, хотя простор для улучшений явно есть.

РЕКОМЕНДУЕМ:
Аналоги Bash Unix инструментов в PowerShell Windows

Заключение

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

Понравилась статья? Поделиться с друзьями:
Добавить комментарий