Handbook:X86/Networking/Advanced

From Gentoo Wiki
Jump to:navigation Jump to:search
This page is a translated version of the page Handbook:X86/Networking/Advanced and the translation is 100% complete.
X86 Handbook
Установка
Об установке
Выбор подходящего источника для установки
Настройка сети
Подготовка дисков
Установка файла stage
Установка базовой системы
Настройка ядра
Настройка системы
Установка системных утилит
Настройка загрузчика
Завершение
Работа с Gentoo
Введение в Portage
USE-флаги
Возможности Portage
Система сценариев инициализации
Переменные окружения
Работа с Portage
Файлы и каталоги
Переменные
Смешение ветвей программного обеспечения
Дополнительные утилиты
Дополнительные репозитории пакетов
Расширенные возможности
Настройка сети OpenRC
Начальная настройка
Расширенная настройка
Модульное построение сети
Беспроводная сеть
Добавляем функциональность
Динамическое управление


Расширенная настройка

Переменная config_{interface} (где {interface} — это имя интерфейса, например, eth0) — это основа в конфигурации интерфейса. Значение переменной является высокоуровневой инструкцией для конфигурации указанного интерфейса.

Вот список встроенных инструкций:

Значение Описание
null Ничего не делать.
noop Если интерфейс работает и у него есть адрес, тогда успешно завершить настройку.
Адрес IPv4 или IPv6 Добавить адрес к интерфейсу.
dhcp, adsl, или apipa (или пользовательское значение из сторонних модулей) Запустить модуль, реализующий команду. Например dhcp запустит модуль, реализующий DHCP (через dhcpcd, dhclient и так далее).

Чтобы обработать ошибку команды, можно установить соответствующее значение fallback через переменную fallback_{interface}. Значение должно в точности соответствовать структуре переменной config_{interface}.

Можно соединить эти значения вместе. Вот несколько практических примеров:

ФАЙЛ /etc/conf.d/netПримеры конфигурации
# Добавление трёх адресов IPv4
config_eth0="192.168.0.2/24
192.168.0.3/24
192.168.0.4/24"
  
# Добавление адреса IPv4 и двух адресов IPv6
config_eth0="192.168.0.2/24
4321:0:1:2:3:4:567:89ab
4321:0:1:2:3:4:567:89ac"
  
# Хранит адрес, присвоенный ядром, если интерфейс
# не запустился, иначе назначается другой адрес через DHCP.
# Если DHCP не работает, тогда добавляет статический адрес,
# определяемый APIPA
config_eth0="noop
dhcp"
fallback_eth0="null
apipa"
Важно
Для fallback важен порядок! Если опция null не была указана, то apipa будет работать только в случае неудачи noop.
Заметка
При использовании модуля ifconfig и добавление более одного адреса, создаются псевдонимы интерфейса для каждого дополнительного адреса. Таким образом, с указанными выше двумя примерами пользователи получат интерфейсы eth0, eth0:1 и eth0:2. Нельзя сделать ничего особенного с этими интерфейсами, так как ядро, и другие программы обрабатывают eth0:1 и eth0:2 как eth0

Сетевые зависимости

Init-скрипты в /etc/init.d/ могут зависеть от конкретного сетевого интерфейса или просто от "net". Все сетевые интерфейсы в системе инициализации Gentoo обеспечивают то, что называется "net".

Если в /etc/rc.conf переменная rc_depend_strict установлена в YES, тогда все сетевые интерфейсы "net" "должны" быть удачно запущены перед тем как зависимости от "net" смогут запуститься. Другими словами, если в системе есть net.eth0 и net.eth1, то они должны быть оба запущены перед тем, как сможет запустится init-скрипт, зависящий от "net".

С другой стороны, если установлено rc_depend_strict="NO", тогда "net" зависимость считается разрешенной, в том случае, если хотя бы один сетевой интерфейс удачно поднялся.

Но что по поводу зависимости net.br0 от net.eth0 и net.eth1? от net.eth1, возможно, нужно настроить беспроводное или PPP устройство перед добавлением их в сетевой мост. Это нельзя сделать в /etc/init.d/net.br0, так как это символьная ссылка на net.lo.

Ответ в определении настройки rc_net_{interface}_need в /etc/conf.d/net:

ФАЙЛ /etc/conf.d/netДобавление зависимости для net.br0
rc_net_br0_need="net.eth0 net.eth1"

Этого, однако, не достаточно, как такового. Сетевые init-скрипты в Gentoo используют виртуальную зависимость, которая называется "net", которая информирует систему о том, что сеть доступна. Очевидно, что и в предыдущем случае, сеть должна быть помечена как доступной, только тогда, когда поднят интерфейс net.br0, а не другие. Таким образом, мы должны написать в /etc/conf.d/net так:

ФАЙЛ /etc/conf.d/netОбновление виртуальных зависимостей и положений для сети
rc_net_eth0_provide="!net"
rc_net_eth1_provide="!net"

За подробной информацией о зависимостях обратитесь к разделу о написании init-сценариев Руководства Gentoo.

Имена переменных и значения

Имена переменных динамичны. Как правило, они следуют следующей структуре:{variable}_{interface|mac|essid|apmac}. Например, переменная dhcpcd_eth0 содержит значение для параметров dhcpcd на интерфейсе eth0, а dhcpcd_essid — значения параметров для dhcpcd при подключении любого из интерфейсов к ESSID «essid».

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

Однако для работы с сетью в Gentoo используются переменные в стиле Bash, а они не могут содержать ничего кроме цифр и символов английского алфавита. Чтобы обойти это ограничение, мы заменяем любой не английский буквенно-цифровой символ на символ _ (подчеркивание).

Также, для некоторых значений переменных Bash необходимо экранирование определённых символов: " (двойные кавычки), ' (одинарная кавычка) и \ (обратная косая черта). Это можно сделать путем добавления символа «\» (обратная косая черта) перед символами, которые должны быть экранированы.

Например, чтобы определить ESSID My "\ NET:

ФАЙЛ /etc/conf.d/netИмена переменных
# это будет работать, но домен не действительный
dns_domain_My____NET="My \"\\ NET"

Настройка выше устанавливает DNS домен в My "\ NET, когда беспроводная карта подключена к точке доступа у которой ESSID My "\ NET.

Именование сетевых интерфейсов

Как это работает

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

В случае обнаружения сетевой карты в системе, ядро Linux собирает необходимые данные об этой карте. В которые входят:

  • Для встроенных (работающие на основной шине (не PCI, актуально для SoC)) регистрируется имя сетевой карты; позже будет видно в ID_NET_NAME_ONBOARD.
  • Слот в который подключена сетевая карта; позже будет виден в ID_NET_NAME_SLOT.
  • Путь по которому можно получить доступ к сетевой карте; позже будет виден в ID_NET_NAME_PATH.
  • MAC-адрес (предоставляемый поставщиком) сетевой карты; позже будет виден в ID_NET_NAME_MAC.

Основываясь на этой информации менеджер устройств определяет как назвать устройство. По умолчанию, он назначает первое значение из первых трех переменных выше (ID_NET_NAME_ONBOARD, _SLOT или _PATH). Например, если ID_NET_NAME_ONBOARD найден и задан как eno1, тогда интерфейс будет называться как eno1.

Значения переменных для интерфейса можно получить следующей командой udevadm:

root #udevadm test-builtin net_id /sys/class/net/enp3s0 2>/dev/null
ID_NET_NAME_MAC=enxc80aa9429d76
ID_OUI_FROM_DATABASE=Quanta Computer Inc.
ID_NET_NAME_PATH=enp3s0

Поскольку (а это так и есть), первое значение из трех главных переменных это переменная ID_NET_NAME_PATH, ее значение используется в качестве имени интерфейса. Если ни одна из переменных не содержит значение, то система возвращается к предоставляемой ядром схеме именования (eth0, eth1 и так далее)

Использование именования в старом стиле (ядром)

До введения нового стиля именования сетевым интерфейсам присваивались имена самим ядром Linux на основе того, как были загружены драйвера (именование также зависело от других непонятных причин). Такое поведение все еще может быть включено при помощи настройки net.ifnames=0 как загрузочного параметра в загрузчике.

Использование пользовательских имен

Основная идея пользовательских имен предназначена не для запутывания людей, а сделать изменения имен сетевых интерфейсов проще. Предположим, что в системе имеется два интерфейса, которые обычно называются eth0 и eth1. Один подразумевает доступ к сети через провода, другой подразумевает под собой беспроводной доступ. Если использовать поддержку именования интерфейса, пользователи могли бы называть интерфейсы lan0 (проводной) и wifi0 (беспроводной); что поможет избежать от использования хорошо известных имен eth* и wlan*, так как их именование остается не точным.

Уточните параметры карты и используйте эту информацию для создания правил, чтобы назвать карту как нужно:

root #udevadm test-builtin net_id /sys/class/net/eth0 2>/dev/null
ID_NET_NAME_MAC=enxc80aa9429d76
ID_OUI_FROM_DATABASE=Quanta Computer Inc.
root #vim /etc/udev/rules.d/70-net-name-use-custom.rules
# Используется информация о MAC и число 70- , чтобы быть перед другими правилами
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="c8:0a:a9:42:9d:76", NAME="lan0"
root #vim /etc/udev/rules.d/76-net-name-use-custom.rules
# Затем используется информация из ID_NET_NAME_PATH и число 76- , 
# чтобы быть между правилами 75-net-*.rules и 80-net-*.rules
SUBSYSTEM=="net", ACTION=="add", ENV{ID_NET_NAME_PATH}=="enp3s0", NAME="wifi0"

Поскольку эти правила запускаются до любого правила, которые обычно идут по умолчанию (правила запускаются в алфавитном порядке, поэтому 70 сработает до 80), имена, приведенные в файле правил выше, будут использоваться вместо обычно используемых по умолчанию. Номер в имени файла должен быть между 76 и 79 (переменное окружение определяется правилами, которые начинаются с 75, а запасной вариант присвоения имен делается в правиле 80).