Какие сообщения netlink задает docker имя интерфейса контейнера и как его можно изменить?

#docker #networking #network-programming #netlink

Вопрос:

Я пытаюсь установить имя интерфейса внутри контейнера a с помощью netlink. Т. Е.: eth0 Я хочу установить mang0 .

Внутри контейнера пользователь root получает ошибки разрешений при попытке изменить свойства интерфейса:

 root@d1df4b33fffc:/tmp/contbuild# ip link set eth0 down RTNETLINK answers: Operation not permitted root@d1df4b33fffc:/tmp/contbuild# ip link set eth0 name man0 RTNETLINK answers: Operation not permitted root@d1df4b33fffc:/tmp/contbuild# ip link set eth0 alias man0 RTNETLINK answers: Operation not permitted  

За пределами контейнера я вижу команду set interface name, отправляемую в сообщениях ядра:

 [  11.115152] docker0: port 1(veth3a3f2f4) entered blocking state [  0.000007] docker0: port 1(veth3a3f2f4) entered disabled state [  0.000171] device veth3a3f2f4 entered promiscuous mode [  0.009358] IPv6: ADDRCONF(NETDEV_UP): veth3a3f2f4: link is not ready [  0.386448] eth0: renamed from vetheac9d07 [  0.000259] IPv6: ADDRCONF(NETDEV_CHANGE): veth3a3f2f4: link becomes ready [  0.000031] docker0: port 1(veth3a3f2f4) entered blocking state [  0.000002] docker0: port 1(veth3a3f2f4) entered forwarding state  

Я также вижу соответствующую пару veth на хосте veth3a3f2f4@if662 , но я не вижу veth контейнера ни в одной другой сети ( ip netns show пусто).

Поэтому я хотел бы знать:

  • как докер устанавливает имя eth0 и есть ли способ легко его изменить
  • почему я не могу видеть сетевые сети для контейнера и/или интерфейс контейнера с хоста?

Ответ №1:

Я нашел обходной путь, запустив контейнер --cap-add=NET_ADMIN и выполнив следующие внутренние действия

 ip link set dev eth0 down ip link set dev eth0 name eth1 ip link set dev eth0 up