LINUX.ORG.RU
ФорумAdmin

Вопрос по systemd-networkd

 ,


0

1

Я хочу, чтобы при загрузке системы добавлялись два виртуальных сетевых моста.

Если командами, то это делается примерно так:

ip link add name br0 type bridge
ip link set up dev br0
ip addr add dev br0 10.0.0.0/24
ip link add name br1 type bridge
ip link set up dev br1
ip addr add dev br1 172.16.0.0/24

Вопрос: как сделать то же самое при помощи systemd-networkd? Я пока так сделал:

# ls /etc/systemd/network
20-dhcp.network  30-br0.netdev  40-br1.netdev  50-br0.network  60-br1.network

# cat /etc/systemd/network/20-dhcp.network
[Match]
Name=enp7s0

[Network]
DHCP=ipv4
IPForward=yes

# cat /etc/systemd/network/30-br0.netdev
[NetDev]
Name=br0
Kind=bridge

# cat /etc/systemd/network/40-br1.netdev
[NetDev]
Name=br1
Kind=bridge

# cat /etc/systemd/network/50-br0.network 
[Match]
Name=br0

[Network]
Address=10.0.0.0/24
IPForward=yes

# cat /etc/systemd/network/60-br1.network 
[Match]
Name=br1

[Network]
Address=172.16.0.0/24
IPForward=yes

Но получается не то, что нужно: br0 и br1 мало того, что DOWN, так ещё и IP диапазон не назначился.

Зачем это нужно? Хочу для виртуалок настроить две виртуальные подсетки, а хост будет шлюзом. Рулить всем будет iptables + dnsmasq. net.ipv4.ip_forward=1 включен, само собой.

Если сказал какую-нибудь глупость, говорите смело.

Попробуй добавить в один из своих мостов какой-нибудь настоящий интерфейс (ну или ненастоящий, главное, чтобы link был). Если я правильно понимаю, как всё должно работать, мост поймает link, поднимется и всё произойдёт.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Сделал, получилось это:

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    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: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 70:5a:0f:98:50:ee brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.151/24 brd 192.168.1.255 scope global dynamic enp7s0
       valid_lft 86383sec preferred_lft 86383sec
    inet6 fe80::725a:fff:fe98:50ee/64 scope link 
       valid_lft forever preferred_lft forever
3: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue master br1 state UNKNOWN group default qlen 1000
    link/ether 7e:24:89:74:47:62 brd ff:ff:ff:ff:ff:ff
4: dummy0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UNKNOWN group default qlen 1000
    link/ether 3a:48:01:83:77:44 brd ff:ff:ff:ff:ff:ff
5: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 56:0a:19:a8:ed:b7 brd ff:ff:ff:ff:ff:ff
    inet 172.16.0.0/24 brd 172.16.0.255 scope global br1
       valid_lft forever preferred_lft forever
    inet6 fe80::540a:19ff:fea8:edb7/64 scope link 
       valid_lft forever preferred_lft forever
6: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether de:5a:eb:dc:e4:82 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.0/24 brd 10.0.0.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::dc5a:ebff:fedc:e482/64 scope link 
       valid_lft forever preferred_lft forever
7: wlp13s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 44:1c:a8:7c:e1:29 brd ff:ff:ff:ff:ff:ff

Вроде подходит, продолжу эксперименты с этим.

Vsevolod-linuxoid ★★★★★ ()
Ответ на: комментарий от bass

Да нигде. Я вообще не совсем уверен, что все сделал правильно, но вот мой текущий конфиг:

vsevolod@hp15ubuntu1804:/etc/systemd/network$ ls
10-dhcp.network  20-br0.netdev  30-br1.netdev  40-br0.network  50-br1.network  60-dummy0.netdev  70-dummy1.netdev  80-dummy0.network  90-dummy1.network
vsevolod@hp15ubuntu1804:/etc/systemd/network$ cat 10-dhcp.network 
[Match]
Name=enp7s0

[Network]
DHCP=ipv4
IPForward=yes
vsevolod@hp15ubuntu1804:/etc/systemd/network$ cat 20-br0.netdev
[NetDev]
Name=br0
Kind=bridge
vsevolod@hp15ubuntu1804:/etc/systemd/network$ cat 30-br1.netdev
[NetDev]
Name=br1
Kind=bridge
vsevolod@hp15ubuntu1804:/etc/systemd/network$ cat 40-br0.network
[Match]
Name=br0

[Network]
Address=10.0.0.0/24
IPForward=yes
vsevolod@hp15ubuntu1804:/etc/systemd/network$ cat 50-br1.network
[Match]
Name=br1

[Network]
Address=172.16.0.0/24
IPForward=yes
vsevolod@hp15ubuntu1804:/etc/systemd/network$ cat 60-dummy0.netdev
[NetDev]
Name=dummy0
Kind=dummy
vsevolod@hp15ubuntu1804:/etc/systemd/network$ cat 70-dummy1.netdev
[NetDev]
Name=dummy1
Kind=dummy
vsevolod@hp15ubuntu1804:/etc/systemd/network$ cat 80-dummy0.network
[Match]
Name=dummy0

[Network]
Bridge=br0
vsevolod@hp15ubuntu1804:/etc/systemd/network$ cat 90-dummy1.network
[Match]
Name=dummy1

[Network]
Bridge=br1

Vsevolod-linuxoid ★★★★★ ()
Ответ на: комментарий от bass

Например, добавить пару veth. Какая разница, средствами чего это делать? Мост без устройств с точки зрения сетевой подсистемы ядра в состоянии «link down». Если добавить в него какое-то устройство, у которого «link up», то мост тоже становится «link up». systemd-networkd реагирует на этот сигнал и настраивает интерфейс.

intelfx ★★★★★ ()
Ответ на: комментарий от Vsevolod-linuxoid

У тебя на самом деле всё работает правильно. Тебе просто не нравится, что твой мост не настраивается сразу. Так и должно быть, он настроится и получит IP-адрес, как только ты подключишь к этому мосту первую свою виртуалку.

intelfx ★★★★★ ()
Ответ на: комментарий от Vsevolod-linuxoid

Просто если интерфейс DOWN, то dnsmasq в логах ругается, что его нет. Или это не страшно?

Во-первых, не знаю. Возьми и проверь.

Во-вторых, а зачем тебе задавать конкретный интерфейс для dnsmasq? Задавай адрес. Хотя это сломается, если у тебя на машине будет несколько копий dnsmasq, но там могут помочь какие-нибудь другие опции (см. ман, я не знаю точно твой сетап).

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от itn

Мне тоже интересно как правильно запускать сервис, если мне ненужен br0 в состоянии UP всё время:
systemd-networkd[520]: br0: Gained carrier
systemd-networkd[520]: br0: Configured
вот тут я хочу запустить нужный сервис(он требует и интерфейс и ip на нём), что прописывать в зависимости?
systemd-networkd[520]: br0: Lost carrier

bass ★★★★★ ()
Последнее исправление: bass (всего исправлений: 1)
Ответ на: комментарий от itn

Я так и делаю: в мосты воткнуты заглушки, и они все время работают. Но это костыль, да.

Vsevolod-linuxoid ★★★★★ ()
Ответ на: комментарий от bass

он требует и интерфейс и ip на нём

Тут нужно сервис не «правильно запускать», а «правильно написать». Сделать так, чтобы он не требовал наличия интерфейса. IP_FREEBIND на сокете, например.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Один из таких сервисов isc-dhcp-server, используется для сети виртуалок где нечасто (может раз в неделю/месяц) обновляют/тестируют зоопарк образов бездисковых клиентов. Используется из-за одного - возможности забиндить mac-ip. Было бы прекрасно если бы такая возможность была systemd.dhcpd, но вот что есть, то есть.

bass ★★★★★ ()
Ответ на: комментарий от Deleted

В смысле? Это мои виртуальные LAN, диапазоны я взял стандартные. Я никому мешать не буду, хост будет маршрутизатором для виртуалок.

Vsevolod-linuxoid ★★★★★ ()
Ответ на: комментарий от Deleted

Не может. Но я и не намерен эти IP во внешний мир выпускать, они за NAT будут. Но это уже настройки iptables, придется маскарадинг включать.

Vsevolod-linuxoid ★★★★★ ()
Ответ на: комментарий от Vsevolod-linuxoid

У тебя ip-адрес совпадает с адресом сети, насколько я знаю, это некорректная конфигурация.

Deleted ()
Ответ на: комментарий от Deleted

Я, если честно, сам не вполне понимаю, как именно это работает. Чисто интуитивно было бы проще, чтобы bridge был просто коммутатором 2 уровня, в который втыкался бы виртуальный сетевой интерфейс с самым обычным IP.

Но вроде бы есть возможность выделять bridge диапазон IP, и в статье есть примеры подобного синтаксиса. https://wiki.archlinux.org/index.php/Systemd-networkd

А dummy0 и dummy1 ведут в /dev/null, как я понял.

Или ты хочешь сказать, что мне следует писать

Address=10.0.0.1/24
Address=172.16.0.1/24
? Просто я тот ещё нуб в сетях.

Vsevolod-linuxoid ★★★★★ ()
Ответ на: комментарий от Deleted

Спасибо за подсказку, исправил. Заодно IPForward=kernel везде выставил вместо yes.

Vsevolod-linuxoid ★★★★★ ()
Последнее исправление: Vsevolod-linuxoid (всего исправлений: 1)
Ответ на: комментарий от Deleted

А, ты про это.

Я думал, ты про несколько адресов.

intelfx ★★★★★ ()

скрипт в localrc (или как он там у вас rclocal) засунуть никак?

piwww ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.