|
|||||||
Исправление работы сети в Debian 9
Время создания: 17.12.2020 16:28
Автор: xintrea
Текстовые метки: linux, debian, ip, сеть, настройка, systemd, network, networking, ifup, ifdown, link, сетевой интерфейс
Раздел: Компьютер - Linux - Сеть в Linux
Запись: xintrea/mytetra_syncro/master/base/1608211716c08zm522r6/text.html на raw.github.com
|
|||||||
|
|||||||
В дистрибутиве Debian Linux 9 очень странно работает сеть. Такое впечатление, что в него воткнули несколько несовместимых между собой программ конфигурации сети, и предложили пользователю самим разбираться как всю эту дичь настраивать. Что нужно сделать, если перестала настраиваться сеть Первым делом надо сказать, что если сеть не удается настроить, или если сеть в какой-то момент начинает вести себя странно, а проверенные команды не дают желаемого результата, то значит пришло время, как мнимум, отказаться от Network Manager и от wicd. Почему это необходимо сделать? Вот пример. Работает демон wicd. Система рапортует, что интерфейс enp5s0 поднят (находится в состоянии UP): # ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 1c:6f:65:96:54:bc brd ff:ff:ff:ff:ff:ff inet 192.168.0.95/24 scope global enp5s0 valid_lft forever preferred_lft forever Если потушить интерфейс: # ip link set dev enp5s0 down ... и снова проверить статус интерфейса, то ничего не измениться: # ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 1c:6f:65:96:54:bc brd ff:ff:ff:ff:ff:ff inet 192.168.0.95/24 scope global enp5s0 valid_lft forever preferred_lft forever Если же отключить wicd, то вышеприведенные команды начнут работать правильно. Отключить работу wicd можно такими командами: # systemctl stop wicd - остановка сервиса wicd # systemctl disable wicd - отключение автостарта wicd при запуске В стандартной поставке, обычно, wicd идет по-умолчанию, и обычно он начинает тупить когда в сети, к которой подключен компьютер, отрубается сервер шлюза. После восстановления работы шлюза, сеть на Debian 9 не восстановится, и если не предпринять никаких ухищрений, поднять ее будет невозможно: спасет только перезагрузка. Далее в тексте предполагается, что Network Manager и wicd отключены. Проблемы совместимости утилит настройки сети Для конфигурирования сети ранее использовались такие системные утилиты как ifconfig, route, ifup, ifdown. Но с некоторых пор появилась утилита ip, которая может заменить все вышеперечисленные программы. И к сожалению, в Debian 9 эти утилиты не очень то дружат друг с другом и сетевой подсистемой ядра Linux. В чем это выражается? Например в том, что утилиты ifup и ifdown не могут управлять поднятием и отключением сетевых интерфейсов. Вот, к примеру, есть компьютер с одной сетевой картой. Интерфейс enp5s0 на ней не поднят: # ifconfig -a enp5s0: flags=4098<BROADCAST,MULTICAST> mtu 1500 inet 192.168.0.95 netmask 255.255.255.0 broadcast 0.0.0.0 ether 1c:6f:65:96:54:bc txqueuelen 1000 (Ethernet) RX packets 246102 bytes 226683039 (216.1 MiB) RX errors 0 dropped 528 overruns 0 frame 0 TX packets 126214 bytes 15161252 (14.4 MiB) TX errors 0 dropped 0 overruns 0 carrier 9 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1 (Local Loopback) RX packets 3320 bytes 1187321 (1.1 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 3320 bytes 1187321 (1.1 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 И поднять его не получится: # ifup enp5s0 RTNETLINK answers: File exists ifup: failed to bring up enp5s0 И, кстати, если интерфейс поднят, потушить его тоже невозможно: # ifdown enp5s0 ifdown: interface enp5s0 not configured А если попробовать сделать то же самое, но через утилиту ip? Тогда все будет работать: Проверка состояния интерфейса enp5s0 (видно, что интерфейс поднят): # ip link show enp5s0 2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000 link/ether 1c:6f:65:96:54:bc brd ff:ff:ff:ff:ff:ff Отключение интерфейса: # ip link set dev enp5s0 down И снова проверка состяния (видно, что интерфейс потушен): root@surfinux:/etc/network# ip link show enp5s0 2: enp5s0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000 link/ether 1c:6f:65:96:54:bc brd ff:ff:ff:ff:ff:ff Проблемы в сетевом модуле systemd Чтобы принять новые настройки сети, обычно необходимо перезапустить сетевой демон networking. В Debian 9 это можно сделать двумя путями: по-старинке через утилиту service, и в новом стиле через утилиту systemctl: # service networking restart или # systemctl restart networking Утилита service будет, на самом деле, вызывать методы управления сервисами systemd, как это делает утилита systemctl. Так что команды равноправны. Но все-таки лучше использовать более новый systemctl. Однако, если сеть предприятия "мигнула", и на машине с Debian 9 сеть отвалилась, то поднять ее через действие restart модуля networking не получится. Совершенно неясно, как поднимается сетевой интерфейс и конфигурируется сеть во время загрузки Debian Linux 9, но ручная попытка перезапустить сетевой сервис будет оканчиваться ошибкой: # systemctl restart networking Job for networking.service failed because the control process exited with error code. See "systemctl status networking.service" and "journalctl -xe" for details. # systemctl status networking ● networking.service - Raise network interfaces Loaded: loaded (/lib/systemd/system/networking.service; enabled; vendor preset: enabled) Active: failed (Result: exit-code) since Thu 2020-12-17 12:02:01 MSK; 9s ago Docs: man:interfaces(5) Process: 19390 ExecStart=/sbin/ifup -a --read-environment (code=exited, status=1/FAILURE) Process: 19385 ExecStartPre=/bin/sh -c [ "$CONFIGURE_INTERFACES" != "no" ] && [ -n "$(ifquery --read-environment -- Main PID: 19390 (code=exited, status=1/FAILURE) дек 17 12:02:01 surfinux systemd[1]: Starting Raise network interfaces... дек 17 12:02:01 surfinux ifup[19390]: RTNETLINK answers: File exists дек 17 12:02:01 surfinux ifup[19390]: ifup: failed to bring up enp5s0 дек 17 12:02:01 surfinux systemd[1]: networking.service: Main process exited, code=exited, status=1/FAILURE дек 17 12:02:01 surfinux systemd[1]: Failed to start Raise network interfaces. дек 17 12:02:01 surfinux systemd[1]: networking.service: Unit entered failed state. дек 17 12:02:01 surfinux systemd[1]: networking.service: Failed with result 'exit-code'. И здесь видно, что для поднятия интерфейса, внутри модуля networking используется утилита ifup, которая, как было выяснено ранее, в некоторых условиях не работает. И если заглянуть в файл с кодом модуля /lib/systemd/system/networking.service , то можно увидеть следующие команды: ExecStart=/sbin/ifup -a --read-environment ExecStop=/sbin/ifdown -a --read-environment --exclude=lo Тут и проблемный ifup, и ifdown. А если копнуть еще глубже, то и недокументированная опция --read-environment. Об этой опции известно немного, но предполагается, что это "хак", который делают майнтейнеры Debian, чтобы сделать поддержку сети. По сути, с этой опцией, утилиты ifup, и ifdown берут свои настройки из переменных окружения VERBOSE, CONFIGURE_INTERFACES и EXCLUDE_INTERFACES. Подробнее можно прочитать тут: https://unix.stackexchange.com/questions/339189/undocumented-read-environment-in-ifup-ifdown-ifquery В общем, по-хорошему, нужно заменить опции с командами ifup/ifdown на опции с командой ip. Команда старта ExecStart должна поднимать все сетевые интерфейсы в системе. Команда остановки ExecStop должна отключать все интерфейсы в системе, за исключением loopback. Однако, как выяснилось на практике, команды ifup/ifdown делают несколько больше, чем просто поднятие/отключение сетевого интерфейса. Они выполняют какую-то работу по конфигурированию интерфейса и делают настройку таблицы маршрутизации. В то же время, команды серии ip link делают только поднятие/отключение интерфейса. Следует учитывать, что формат опций настройки модуля systemd не допускает исполнение более одного бинарника. Поэтому, если необходимо для одного действия выполнить несколько команд, нужно либо вызывать шелл с опцией -c, после которой прописать несколько команд, либо разложить команды на разные этапы выполнения действия (Pre и Post). ExecStart=/bin/ip link set group default up ExecStop=/bin/ip link set group default down ExecStopPost=/bin/ip link set dev lo up Дописать... Дополнительные данные: # ifup enp5s0 # ip route 172.17.3.0/24 via 192.168.0.249 dev enp5s0 192.168.0.0/24 dev enp5s0 proto kernel scope link src 192.168.0.95 192.168.1.0/24 dev enp5s0 proto kernel scope link src 192.168.1.95 192.168.161.0/24 dev enp5s0 proto kernel scope link src 192.168.161.95 192.168.164.0/24 dev enp5s0 proto kernel scope link src 192.168.164.95 # ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 1c:6f:65:96:54:bc brd ff:ff:ff:ff:ff:ff inet 192.168.1.95/24 brd 192.168.1.255 scope global enp5s0 valid_lft forever preferred_lft forever inet 192.168.0.95/24 scope global enp5s0 valid_lft forever preferred_lft forever inet 192.168.161.95/24 scope global enp5s0 valid_lft forever preferred_lft forever inet 192.168.164.95/24 scope global enp5s0 valid_lft forever preferred_lft forever inet6 fe80::1e6f:65ff:fe96:54bc/64 scope link valid_lft forever preferred_lft forever # ip link set dev enp5s0 up # ip route 192.168.0.0/24 dev enp5s0 proto kernel scope link src 192.168.0.95 192.168.161.0/24 dev enp5s0 proto kernel scope link src 192.168.161.95 192.168.164.0/24 dev enp5s0 proto kernel scope link src 192.168.164.95 # ip addr 1: lo: <LOOPBACK> mtu 65536 qdisc noqueue state DOWN group default qlen 1 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: enp5s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 1c:6f:65:96:54:bc brd ff:ff:ff:ff:ff:ff inet 192.168.0.95/24 scope global enp5s0 valid_lft forever preferred_lft forever inet 192.168.161.95/24 scope global enp5s0 valid_lft forever preferred_lft forever inet 192.168.164.95/24 scope global enp5s0 valid_lft forever preferred_lft forever inet6 fe80::1e6f:65ff:fe96:54bc/64 scope link valid_lft forever preferred_lft forever |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|