MyTetra Share
Делитесь знаниями!
Исправление работы сети в 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





Так же в этом разделе:
 
MyTetra Share v.0.65
Яндекс индекс цитирования