Пытаюсь настроить сеть для systemd-nspawn
контейнеров с IPv4/IPv6 адресами, но работает оно не так, как хотелось бы.
В юните systemd-nspawn@.service
используется флаг --network-veth
.
Для него используется конфиг /usr/lib/systemd/network/80-container-ve.network
со следующим содержимым:
[Match]
Name=ve-*
Driver=veth
[Network]
# Default to using a /28 prefix, giving up to 13 addresses per container.
Address=0.0.0.0/28
LinkLocalAddressing=yes
DHCPServer=yes
IPMasquerade=both
LLDP=yes
EmitLLDP=customer-bridge
IPv6SendRA=yes
Если создать контейнер и запустить его с такими настройками, то сеть на хосте будет выглядеть следующим образом:
# ip -4 address
8: ve-d0a47fadj0Iy@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link-netnsid 1
altname ve-d0a47fad-260b-468d-a931-37e73de87a34
inet 192.168.111.209/28 brd 192.168.111.223 scope global ve-d0a47fadj0Iy
valid_lft forever preferred_lft forever
# ip -4 route
192.168.111.208/28 dev ve-d0a47fadj0Iy proto kernel scope link src 192.168.111.209
И в целом всё работает. Но если я вместо Address=0.0.0.0/28
укажу к примеру Address=10.0.5.1/28
, то результат будет таким:
# ip -4 address
9: ve-d0a47fadj0Iy@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link-netnsid 1
altname ve-d0a47fad-260b-468d-a931-37e73de87a34
inet 10.0.5.1/28 brd 10.0.5.15 scope global ve-d0a47fadj0Iy
valid_lft forever preferred_lft forever
# ip -4 route
default dev wg scope link
10.0.5.0/28 dev ve-d0a47fadj0Iy proto kernel scope link src 10.0.5.1
В таком случае тоже работает, пока я не создам второй контейнер.
Вот результат после создания второго контейнера:
# ip -4 address
10: ve-d0a47fadj0Iy@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link-netnsid 1
altname ve-d0a47fad-260b-468d-a931-37e73de87a34
inet 10.0.5.0/28 brd 10.0.5.15 scope global ve-d0a47fadj0Iy
valid_lft forever preferred_lft forever
11: ve-c9c8aa34cqwn@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link-netnsid 2
altname ve-c9c8aa34-13da-45d0-adf1-44d900439ee1
inet 10.0.5.0/28 brd 10.0.5.15 scope global ve-c9c8aa34cqwn
valid_lft forever preferred_lft forever
# ip -4 route
10.0.5.0/28 dev ve-d0a47fadj0Iy proto kernel scope link src 10.0.5.0
10.0.5.0/28 dev ve-c9c8aa34cqwn proto kernel scope link src 10.0.5.0
И сеть работает только в одном контейнере.
Примерно тоже самое с IPv6. Если я в секцию [IPv6Prefix]
добавлю Assign = true
, то адрес из /64
префикса назначается нормально, но маршруты прописываются таким образом:
2a01:aaaa:bbbb:cccc::/64 dev ve-c9c8aa34cqwn proto kernel metric 256 pref medium
2a01:aaaa:bbbb:cccc::/64 dev ve-d0a47fadj0Iy proto kernel metric 256 pref medium
fe80::/64 dev ve-d0a47fadj0Iy proto kernel metric 256 pref medium
fe80::/64 dev ve-c9c8aa34cqwn proto kernel metric 256 pref medium
Т.е. опять дублирование маршрутов.
В общем можно ли как-то настроить Virtual Ethernet
интерфейсы для systemd-nspawn
таким образом, чтобы адреса и маршруты на хост машине не пересекались у контейнеров?
Спасибо.