Все операционные системы предоставляют команды и интерфейс для настройки сети из командной строки. В дистрибутивах Linux нам даже это не нужно, потому что мы можем сами редактировать конфигурационные файлы и вносить необходимые изменения. В некоторых случаях настройка через конфигурационные файлы будет проще, чем с помощью графических утилит, потому что вы можете полностью все контролировать.
В этой статье будет рассмотрена настройка сети Debian 9. Мы разберем как настроить имя хоста, сетевые интерфейсы и получить IP адреса для них. Эта инструкция подойдет как для обычных компьютеров, так и для серверов.
Чтобы посмотреть текущее имя хоста вы можете использовать команду hostname:
Установить новое имя хоста очень просто, для этого достаточно передать его команде hostname в качестве параметра:
После перезагрузки имя хоста не сохранится, поэтому вам нужно отредактировать файл /etc/hostname и добавить туда новое имя хоста, уже это имя останется даже после перезагрузки:
debian-pc-1
Осталось только связать новое имя хоста с локальным IP адресом, чтобы иметь возможность обращаться по нему к компьютеру. Для этого добавьте такую строку в файл /etc/hosts:
127.0.0.1 localhost debian-pc
Перед тем как мы сможем настроить сеть нужно посмотреть какие сетевые интерфейсы подключены к вашей системе и какие имена им присвоены. Для этого наберите:
Также можно посмотреть только имена интерфейсов, в папке /sys/class/net:
Для настройки сетевых интерфейсов в операционных системах, основанных на Debian, используется файл /etc/network/interfaces. Здесь должно находится описание для каждого интерфейса, способ получения IP а другие параметры. В одном файле может быть настроено несколько интерфейсов. Описание каждого интерфейса начинается со слова auto после которого идет имя интерфейса.
Это означает, что указанный интерфейс должен быть запущен при выполнении ifup с опцией -a, именно она используется при инициализации системы. После строки auto идут другие строки настроек, которые касаются именно этого интерфейса. Вот так, например, выглядит строка для включения локального интерфейса:
auto lo;
Перед тем как рассматривать все более подробно, поговорим про опции, которые можно использовать:
- 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
Здесь указывается, что мы будем использовать метод получения 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
Имя интерфейса, для которого создается виртуальный интерфейс должно совпадать с реальным.
Сетевые мосты между виртуальными интерфейсами в системе позволяют настроить полноценный доступ к интернету из виртуальных машин. Они могут применяться для 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
Здесь мы указываем имя интерфейса 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/