Андрей Смирнов
Время чтения: ~11 мин.
Просмотров: 33

Автоконфигурация сетевых интерфейсов в Debian GNU/Linux

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

В этой статье будет рассмотрена настройка сети Debian 9. Мы разберем как настроить имя хоста, сетевые интерфейсы и получить IP адреса для них. Эта инструкция подойдет как для обычных компьютеров, так и для серверов.

Чтобы посмотреть текущее имя хоста вы можете использовать команду hostname:

debian-v.png

Установить новое имя хоста очень просто, для этого достаточно передать его команде hostname в качестве параметра:

debian-v1.png

После перезагрузки имя хоста не сохранится, поэтому вам нужно отредактировать файл /etc/hostname и добавить туда новое имя хоста, уже это имя останется даже после перезагрузки:

debian-pc-1

debian-v2.png

Осталось только связать новое имя хоста с локальным IP адресом, чтобы иметь возможность обращаться по нему к компьютеру. Для этого добавьте такую строку в файл /etc/hosts:

127.0.0.1 localhost debian-pc

debian-v3.png

Перед тем как мы сможем настроить сеть нужно посмотреть какие сетевые интерфейсы подключены к вашей системе и какие имена им присвоены. Для этого наберите:

debian-v4.pngТакже можно посмотреть только имена интерфейсов, в папке /sys/class/net:

debian-v5.png

Для настройки сетевых интерфейсов в операционных системах, основанных на Debian, используется файл /etc/network/interfaces. Здесь должно находится описание для каждого интерфейса, способ получения IP а другие параметры. В одном файле может быть настроено несколько интерфейсов. Описание каждого интерфейса начинается со слова auto после которого идет имя интерфейса.

Это означает, что указанный интерфейс должен быть запущен при выполнении ifup с опцией -a, именно она используется при инициализации системы. После строки auto идут другие строки настроек, которые касаются именно этого интерфейса. Вот так, например, выглядит строка для включения локального интерфейса:

auto lo;

debian-v6.png

Перед тем как рассматривать все более подробно, поговорим про опции, которые можно использовать:

  • pre-up — выполнить команду перед запуском интерфейса;
  • post-up — выполнить команду после запуска интерфейса;
  • up — выполнить команду при запуске интерфейса;
  • pre-down — команда перед отключением;
  • post-down — команда после отключения;
  • iface — указывает имя интерфейса;
  • inet — указывает
  • description — создать имя синоним для устройства;
  • address — устанавливает ip адрес для статического соединения;
  • netmask — установка маски сети;
  • broadcast — широковещательный адрес;
  • metric — приоритет для шлюза по умолчанию;
  • gateway — шлюз по умолчанию;
  • hwaddress — установить MAC адрес;
  • mtu — размер одного пакета.

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

Мы будем получать IP адрес через DHCP сервер, оттуда же будут получены шлюзы и DNS сервер, поэтому для работы достаточно добавить две строчки. Например, настроем получение IP по DHCP для интерфейса eth0:

auto eth0 iface eth0 inet dhcp

Но если необходимо, то вы можете установить вручную ip адрес DNS сервера:

nameserver 8.8.8.8

Для локального интерфейса настройка будет выполняться таким образом:

auto lo iface lo inet loopback

Здесь мы не получаем адрес по DHCP, но присваиваем локальный адрес 127.0.0.1.

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

iface eth0 inet static address 192.168.1.15 netmask 255.255.255.0 gateway 192.168.1.1 broadcast 192.168.0.255 dns-nameserver 8.8.8.8

debian-v7.png

Здесь указывается, что мы будем использовать метод получения ip адреса static, а затем расписаны все параметры. Но это еще далеко не все, что можно сделать с помощью файла /etc/network/interfaces. Также вы можете создавать виртуальные интерфейсы.

В некоторых случаях нам может понадобиться создать виртуальный интерфейс. Это позволяет добавить еще один IP адрес к интерфейсу. Чтобы создать такой интерфейс достаточно дописать его номер после двоеточия:

auto eth0:0 iface eth0:0 inet static address 192.168.1.101 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8

debian-v8.png

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

Сетевые мосты между виртуальными интерфейсами в системе позволяют настроить полноценный доступ к интернету из виртуальных машин. Они могут применяться для KVM,qemu,XEN и других конфигураций. Для настройки моста используйте:

auto br0 iface br0 inet static address 192.168.1.20 network 192.168.1.0 netmask 255.255.255.0 broadcast 192.168.1.255 gateway 192.168.1.1 bridge_ports eth0 bridge_stp off bridge_fd 0 bridge_maxwait 0

debian-v9.png

Здесь мы указываем имя интерфейса br0, дальше выполняем стандартную настройку получения статического IP адреса, затем связываем этот мост с интерфейсом eth0.

После внесения всех изменений необходимо перезапустить сеть, чтобы сетевые настройки debian вступили в силу, для этого наберите:

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

Решил рассказать о вариантах решения достаточно часто встречающейся проблемы для обладателей мобильных устройств. Проблема заключается в том, что зачастую лаптопы подключаются к достаточно большому количеству разных сетей, в которых далеко не всегда есть DHCP-сервер, либо же DHCP-сервер «отдаёт» не все необходимые настройки, либо же отдаёт неверные.

Автоподнятие интерфейса

Автоподнятие интерфейса — вещь достаточно удобная, так как избавляет от необходимости каждый раз вручную поднимать и опускать интерфейс (хотя я знаю людей, которым больше по душе именно ручное поднятие интерфейсов). В большинстве случаев для этих целей можно использовать замечательную программу ifplugd. Настройка ifplugd не представляет особой сложности сама по себе, но как минимум в Debian есть возможность опции указать в файле /etc/default/ifplugd. Стоит обратить внимание на опцию -d — время между определением отключения среды передачи данных (кабеля) и деконфигурацией интерфейса, возможно, имеет смысл его увеличить, так как весьма неприятно, когда из-за случайно выдернутого кабеля разрываются соединения. Опцию -u же, напротив, можно установить в небольшое значение — поднять интерфейс при появлении кабеля практически никогда не вредно. Теоретически, ifplugd умеет работать и с отключаемыми адаптерами (параметр HOTPLUG_INTERFACES в конфигурационном файле), на практике же мне не удалось заставить его работать, потому это было сделано через udev. Всего у меня использовалось три Wi-Fi-адаптера, один из них подключался как PC Card (PCMCIA), другой — через USB, а позже появился встроенный, подключаемый через MiniPCI. Соответственно, в /etc/udev/rules.d/80-LOCAL-wlan-start.rules постепенно дописывались правила:

# WLAN adapters SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", KERNEL=="wlan*", RUN+="/etc/network/wlan-up $env{INTERFACE}"  SUBSYSTEM=="rfkill", ACTION=="change", ENV{RFKILL_STATE}=="1", ENV{RFKILL_NAME}=="phy0", ENV{RFKILL_TYPE}=="wlan", RUN+="/etc/network/wlan-up wlan2" SUBSYSTEM=="rfkill", ACTION=="change", ENV{RFKILL_STATE}=="0", ENV{RFKILL_NAME}=="phy0", ENV{RFKILL_TYPE}=="wlan", RUN+="/sbin/ifdown wlan2" SUBSYSTEM=="rfkill", ACTION=="change", ENV{RFKILL_STATE}=="2", ENV{RFKILL_NAME}=="phy0", ENV{RFKILL_TYPE}=="wlan", RUN+="/sbin/ifdown wlan2" 

В этом файле первая после комментария строка отрабатывает при подключении внешнего адаптера. Остальные же строки отрабатывают при получении события rfkill, которое означает изменение состояния переключателя встроенного Wi-Fi. Значения параметров здесь указаны для драйвера b43, у других драйверов они могут отличаться. К сожалению, так и не удалось придумать, как не указывать при этом имя интерфейса вручную. Содержимое файла /etc/network/wlan-up:

#!/bin/sh  export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"  if=$1  logger -s -t wlan "Bringing up $if"  ifconfig $if up  poweroff=$(iwconfig $if|grep Tx-Power=off|wc -l)  if [ $poweroff -ne 0 ] ; then         ifconfig $if down         exit fi  ifup --force $if 2>&1 | logger -s -t wlan 

Установка переменной PATH необходима, так как при вызове скрипта из udev эта переменная не установлена, потому многие вещи начинают работать совершенно не так, как хотелось бы. Файл /etc/network/wlan-up изначально представлял собой достаточно сложный bash-скрипт, производивший поиск сетей, а также предпринимавший попытки входа в них, но был значительно упрощён после того, как я случайно наткнулся на пакет guessnet, о котором речь пойдёт ниже.

Автоконфигурация сети

После того, как интерфейс, собственно, поднят, возникают две проблемы. Первая заключается в том, чтобы в случае Wi-Fi определить, какая из знакомых нам сетей доступна. Вторая заключается в том, чтобы непосредственно эту сеть настроить, если по какой-либо причине настройка по протоколу DHCP невозможна. В Debian есть замечательнейший пакет guessnet, который позволяет достаточно легко решить обе проблемы, не прибегая к километровым колдунствам на bash, grep и sed, которыми мне пришлось воспользоваться до того, как я его нашёл. guessnet пользуется такой возможностью механизма настройки сети в Debian /etc/network/interfaces, как логические интерфейсы и ключевое слово mapping. Логические интерфейсы, как подсказывает их название, представляют собой ни что иное, как профили настроек сети, которые можно применить при поднятии того или иного интерфейса примерно так: ifup eth0=home. Ключевое слово mapping представляет возможность написать скрипт, который осуществляет сопоставление физического интерфейса логическому. Всё, что необходимо, чтобы подключить guessnet в /etc/network/interfaces — добавить секцию (stanza) mapping для соответствующего интерфейса:

mapping eth1         script guessnet-ifupdown         # map default: dhcp         # map debug: true         # map verbose: true         map syslog: true

Ключевое слово map приобретает новый смысл: оно используется для передачи параметров в guessnet (про оригинальный смысл можно прочитать на странице interfaces (5) или в документации на ifupdown). Но об этом позже. Сами профили определяются в точности так же, как и любые другие интерфейсы, с одной лишь только разницей: имя логического интерфейса не совпадает с именем физического (хотя может содержать его как подстроку в себе):

iface no-link inet manual         test missing-cable         pre-up echo No link present.         pre-up false          iface dhcp inet dhcp  iface eth-home inet dhcp         post-up route del default 2>&1 >/dev/null || true         post-up pon dsl-eth-vpn         post-up ifup ipv6-vps         pre-down ifdown ipv6-vps         pre-down poff dsl-eth-vpn         test peer address 192.168.1.1 mac 00:19:CB:48:02:2A source 192.168.1.5  iface eth-lab inet static         address 192.168.23.238         netmask 255.255.255.224         gateway 192.168.23.225         test peer address 192.168.23.225

Как видно, в настройках каждого из приведённых логических интерфейсов присутствует ключевое слово test. Очень гибкая архитектура программы ifupdown позволяет сторонним программам (таким, как guessnet) перехватить их обработку либо просто игнорировать их (хотя конкретно guessnet работает иначе — он просто разбирает файл заново). Слово test позволяет задать условие, по которому будет выбрана та или иная конфигурация. Логический интерфейс no-link рекомендуется создавать специально для того, чтобы guessnet не пытался запускать другие тесты при отсутствии кабеля. Конфигурация dhcp принимает все настройки по DHCP, не заменяя ничего. Её бывает полезно установить как конфигурацию по умолчанию — большинство сетей всё же имеют хоть какой-нибудь DHCP сервер, слушая указания которого можно хотя бы получить базовый набор настроек. Конфигурация eth-lab используется в сети с DHCP-сервером, который игнорирует запросы от незнакомых ему клиентов. Потому делается arping шлюза в данной сети — такой запрос отработает только в случае, если оба узла находятся в одном физическом сегменте сети. Наконец, конфигурация eth-home одновременно использует настройки от DHCP-сервера, но дополнительно поднимает IPv6-туннель, а также удаляет IPv4-шлюз по умолчанию, фактически превращая машину в IPv6-only узел. Ещё одна особенность: для того, чтобы получить доступ к «другому концу» IPv6-туннеля, используется ADSL-соединение, которое любезно предоставляет модем Zyxel серии P-660. У модемов этой марки есть одна интересная прихоть: они игнорируют анонимные ARP-запросы (а именно такие рассылает по умолчанию guessnet). Чтобы избежать этого, в явном виде прописан адрес, который записывается в поле «источник» пакета. Кроме того, здесь в явной форме указан MAC-адрес модема. Кроме этого, как я уже упоминал, guessnet умеет обнаруживать Wi-Fi-сети. Для этого ключевое слово test поддерживает опцию wireless:

iface wifi-MTS.BY inet dhcp         test wireless essid MTS.BY         wireless-essid MTS.BY         wireless-key off 

Необходимо учесть, что достаточно часто guessnet не может корректно определить «наличие кабеля» для Wi-Fi (оно и понятно), из-за чего в mapping для Wi-Fi-интерфейса нужно добавлять строку map !no-link. Более подробно с возможностями guessnet можно ознакомиться на странице guessnet(8). Также к пакету прилагается неплохая документация с примерами использования. В принципе, ничто не мешает использовать guessnet и в других дистрибутивах — существует режим работы, «отвязанный» от специфичного для Debian пакета ifupdown.

Пара штрихов

Одна из сетей, в которых мне довольно часто приходится бывать, имеет DHCP-сервер, настроенный так, что запросы на обновление адреса отправляются два раза в минуту. Вместе с тем, через DHCP раздаются не подходящие мне настройки DNS и раз в полминуты перезаписывают мой /etc/resolv.conf. Решением такой проблемы может быть следующий скрипт (для dhclient3):

 case $reason in RENEW)         make_resolv_conf () {                 true         }         ;; *)         return         ;; esac

Поместить его нужно в /etc/dhcp3/dhclient-enter-hooks.d под любым именем. Конечно, такое решение является довольно грубым «хаком», так что возможно, установка пакета resolvconf и «подкручивание» приоритетов интерфейсов будут более предпочтительными. Кроме того, рекомендуется поставить пакет ifupdown-extra, в нём есть несколько полезных дополнений к стандартным возможностям ifupdown. Вот, пожалуй, и всё, что хотелось рассказать. Спасибо за внимание.Используемые источники:

  • https://losst.ru/nastrojka-seti-debian-9
  • https://habr.com/post/121216/

Рейтинг автора
5
Подборку подготовил
Максим Уваров
Наш эксперт
Написано статей
171
Ссылка на основную публикацию
Похожие публикации