переименование сетевого интерфейса

Настройка, программирование, распределённые вычисления

Модераторы: Olej, bellic, vikos

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

переименование сетевого интерфейса

Непрочитанное сообщение Olej » 12 фев 2013, 17:43

Вообще то, я как-то считал, что переименование сетевого интерфейса (ppp0 например) дело невозможное ... потому как имя сетевому интерфейсу присваивает модуль ядра поддерживающий при своей загрузке.

Оказывается (подсказали) это не так:

Код: Выделить всё

bash-4.2$ ip link show wlan0
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN mode DEFAULT qlen 1000
    link/ether 00:13:02:69:70:9b brd ff:ff:ff:ff:ff:ff

bash-4.2$ sudo ip link set dev wlan0 name wln2

bash-4.2$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN mode DEFAULT 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT qlen 1000
    link/ether 00:15:60:c4:ee:02 brd ff:ff:ff:ff:ff:ff
3: wln2: <BROADCAST,MULTICAST> mtu 1500 qdisc mq state DOWN mode DEFAULT qlen 1000
    link/ether 00:13:02:69:70:9b brd ff:ff:ff:ff:ff:ff

Код: Выделить всё

bash-4.2$ sudo ifconfig wln2 192.168.1.222
SIOCSIFFLAGS: Операция не позволяется из-за RF-kill
bash-4.2$ 
bash-4.2$ sudo ifconfig wln2
wln2: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.1.222  netmask 255.255.255.0  broadcast 192.168.1.255
        ether 00:13:02:69:70:9b  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: переименование сетевого интерфейса

Непрочитанное сообщение Olej » 27 июн 2015, 21:11

Olej писал(а):переименование сетевого интерфейса (ppp0 например)
Такие возможности оказываются чрезвычайно мощным инструментом (или, по крайней мере гибким ;-) ) при тестировании модулей, при экспериментах, или при конфигурировании программных пакетов, включающих модули ядра сетевых устройств, которые создают свои новые сетевые интерфейсы.

Но для использования этого инструмента нужно учесть несколько факторов. Там не всё так просто как кажется...

- пусть мы имеем первоначально систему с двумя интерфейсами (p2p1 и p7p1, это показано в VirtualBox, но и с нативными интерфейсами в точности то же самое):

Код: Выделить всё

$ route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface 
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 p2p1 
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 p2p1 
192.168.56.1    0.0.0.0         255.255.255.255 UH    0      0        0 p7p1 
- изменить имя можно только для остановленного интерфейса, в противном случае интерфейс будет «занят» для операции (в первоначальном примере wlan0 и был как-раз в остановленном состоянии):

Код: Выделить всё

$ sudo ip link set dev p7p1 name crypt0 
RTNETLINK answers: Device or resource busy 
- интерфейс нужно остановить для выполнения переименования, после чего снова поднять:

Код: Выделить всё

$ sudo ifconfig p7p1 down
$ sudo ip link set dev p7p1 name crypt0
$ sudo ifconfig crypt0 192.168.56.4 
$ ip address show dev crypt0 
3: crypt0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 
    link/ether 08:00:27:08:9a:bd brd ff:ff:ff:ff:ff:ff 
    inet 192.168.56.3/32 brd 192.168.56.3 scope global crypt0 
    inet6 fe80::a00:27ff:fe08:9abd/64 scope link 
       valid_lft forever preferred_lft forever 
- но после остановки и перезапуска интерфейса разрушается соответствующая ему запись в таблице роутинга (такое произошло бы даже если бы мы и не переименовывали интерфейс, для исходного имени):

Код: Выделить всё

$ route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface 
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 p2p1 
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 p2p1 
- при полностью работающем интерфейсе crypt0 с присвоенным ему IP создаётся впечатление его неработоспособности; для восстановления работы нужно добавить запись об интерфейсе в таблицу роутинга ... как-то так:

Код: Выделить всё

$ sudo route add -net 192.168.56.0 netmask 255.255.255.0 dev crypt0 
$ route -n 
Kernel IP routing table 
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface 
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 p2p1 
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 p2p1 
192.168.56.0    0.0.0.0         255.255.255.0   U     0      0        0 crypt0 
- после чего можно убедиться в полной работоспособности интерфейса с новым именем:

Код: Выделить всё

$ ping 192.168.56.1 
PING 192.168.56.1 (192.168.56.1) 56(84) bytes of data. 
64 bytes from 192.168.56.1: icmp_req=1 ttl=64 time=0.422 ms 
64 bytes from 192.168.56.1: icmp_req=2 ttl=64 time=0.239 ms 
^C 
--- 192.168.56.1 ping statistics --- 
2 packets transmitted, 2 received, 0% packet loss, time 1000ms 
rtt min/avg/max/mdev = 0.239/0.330/0.422/0.093 ms 

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

переименование сетевого интерфейса

Непрочитанное сообщение Olej » 23 апр 2023, 08:37

Olej писал(а):
27 июн 2015, 21:11
Такие возможности оказываются чрезвычайно мощным инструментом (или, по крайней мере гибким ;-) ) при тестировании модулей, при экспериментах, или при конфигурировании программных пакетов, включающих модули ядра сетевых устройств, которые создают свои новые сетевые интерфейсы.
Подробнее: при переименовании интерфейсов часто возникают проблемы с восстановлением роутинга.

Код: Выделить всё

olej@nvidia:~/2023/own.BOOKs/NET$ ip -4 a s dev eno1
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    altname enp0s25
    inet 192.168.1.11/24 brd 192.168.1.255 scope global noprefixroute eno1
       valid_lft forever preferred_lft forever

Код: Выделить всё

olej@nvidia:~/2023/own.BOOKs/NET$ route -n
Таблица маршутизации ядра протокола IP
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0         192.168.1.3     0.0.0.0         UG    100    0        0 eno1
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eno1
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 eno1
Как было сказано ранее, интерфейс можно переименовать только остановив его:

Код: Выделить всё

olej@nvidia:~/2023/own.BOOKs/NET$ sudo ip link set dev eno1 name eth0
RTNETLINK answers: Device or resource busy

Код: Выделить всё

olej@nvidia:~/2023/own.BOOKs/NET$ sudo ip link set dev eno1 name eth0

Код: Выделить всё

olej@nvidia:~/2023/own.BOOKs/NET$ sudo ifconfig eth0 192.168.1.11 up

Код: Выделить всё

olej@nvidia:~/2023/own.BOOKs/NET$ ip -4 a s dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    altname enp0s25
    altname eno1
    inet 192.168.1.11/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
Вот к этому времени инерфейс переименован и снова поднят... Но вот таблица роутенга к этому времени нарушена (дефаултный маршрут) - из-за остановки:

Код: Выделить всё

olej@nvidia:~/2023/own.BOOKs/NET$ route -n
Таблица маршутизации ядра протокола IP
Destination Gateway Genmask Flags Metric Ref Use Iface
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
И её нужно восстановить:

Код: Выделить всё

olej@nvidia:~/2023/own.BOOKs/NET$ sudo ip route add default via 192.168.1.3
    
olej@nvidia:~/2023/own.BOOKs/NET$ route -n
Таблица маршутизации ядра протокола IP
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0         192.168.1.3     0.0.0.0         UG    0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
И вот теперь всё опять играет:

Код: Выделить всё

olej@nvidia:~/2023/own.BOOKs/NET$ ping 1.1.1.1 -c3 -Ieth0
PING 1.1.1.1 (1.1.1.1) from 192.168.1.11 eth0: 56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=1 ttl=57 time=9.50 ms
64 bytes from 1.1.1.1: icmp_seq=2 ttl=57 time=8.79 ms
64 bytes from 1.1.1.1: icmp_seq=3 ttl=57 time=9.07 ms

--- 1.1.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 8.785/9.116/9.499/0.293 ms

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

переименование сетевого интерфейса

Непрочитанное сообщение Olej » 23 апр 2023, 08:44

Есть ещё одна возможность из подобной области, появившаяся в пакете iproute2 относительно недавно, утверждается что с версии v5.4.0 (это примерно год 2019) — это альтернативные имена интерфейсов:

Код: Выделить всё

olej@nvidia:~$ ip -V
ip utility, iproute2-5.15.0, libbpf 0.5.0

Код: Выделить всё

olej@nvidia:~$ ip -4 a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    altname enp0s25
    altname eno1
    inet 192.168.1.11/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
Вот так добавляется новое имя:

Код: Выделить всё

olej@nvidia:~$ sudo ip link property add dev eth0 altname eno2
[sudo] пароль для olej:

Код: Выделить всё

olej@nvidia:~$ ip l show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 70:71:bc:a3:c5:c0 brd ff:ff:ff:ff:ff:ff
    altname enp0s25
    altname eno1
    altname eno2

Код: Выделить всё

olej@nvidia:~$ ip -4 a s dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    altname enp0s25
    altname eno1
    altname eno2
    inet 192.168.1.11/24 brd 192.168.1.255 scope global eth0
       valid_lft forever preferred_lft forever
И ifconfig видит такое имя, хотя и не показывает его в своём полном списке интерфуйсов:

Код: Выделить всё

    
olej@nvidia:~$ ifconfig eno2
eno2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 70:71:bc:a3:c5:c0  txqueuelen 1000  (Ethernet)
        device interrupt 20  memory 0xfe400000-fe420000
Добавление нового альтернативного имени интерфейсу производися не останавливая (down) его, делается «на ходу»!
А значит это никак не затрагивает таблицу маршрутизации, и не нарушает работы (точнее просто никак не влияет).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

переименование сетевого интерфейса

Непрочитанное сообщение Olej » 23 апр 2023, 08:47

Olej писал(а):
23 апр 2023, 08:44
Добавление нового альтернативного имени интерфейсу производися не останавливая (down) его, делается «на ходу»!
Точно так же, симметрично, альтернативное имя может быть удалено (ликвидировано), даже если это первичное имя интерфейса, данное ему при загрузке системы:

Код: Выделить всё

olej@nvidia:~$ sudo ip link property del dev eno2 altname eno1
[sudo] пароль для olej:

Код: Выделить всё

olej@nvidia:~$ ip l sh dev eno2
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
    link/ether 70:71:bc:a3:c5:c0 brd ff:ff:ff:ff:ff:ff
    altname enp0s25
    altname eno2
Важно чтобы удаляемое имя интерфейса не фигурировало как целевой интерфейс в записях таблицы маршрутизации:

Код: Выделить всё

olej@nvidia:~$ route -n
Таблица маршутизации ядра протокола IP
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0         192.168.1.3     0.0.0.0         UG    0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
Эта относительно новая возможность решает многие проблемы с именованием интерфейсов.

Ответить

Вернуться в «Сети»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 5 гостей