Назад | Перейти на главную страницу

Как заставить контейнер Linux подключаться к Интернету через мост?

У моего хоста Linux есть мостовое устройство br0, и я создал контейнер Arch Linux, но он не может получить доступ к Интернету.

При запуске контейнера на хосте появляется veth-устройство:

[host]# ip addr
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: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
    link/ether 74:d4:35:70:0b:2f brd ff:ff:ff:ff:ff:ff
    inet6 fe80::76d4:35ff:fe70:b2f/64 scope link 
       valid_lft forever preferred_lft forever
3: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 1000
    link/ether be:b3:74:db:60:5f brd ff:ff:ff:ff:ff:ff
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 74:d4:35:70:0b:2f brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.44/24 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::76d4:35ff:fe70:b2f/64 scope link 
       valid_lft forever preferred_lft forever
37: veth2G6SCA@if36: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP group default qlen 1000
    link/ether fe:5d:8a:48:81:74 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 169.254.192.90/16 brd 169.254.255.255 scope global noprefixroute veth2G6SCA
       valid_lft forever preferred_lft forever
    inet6 fe80::fc5d:8aff:fe48:8174/64 scope link 
       valid_lft forever preferred_lft forever

и следующие маршруты (с *** рядом с ними) появляются:

[host]# ip route
default via 192.168.1.254 dev br0 proto static 
default dev veth2G6SCA scope link src 169.254.192.90 metric 237 ***
169.254.0.0/16 dev veth2G6SCA scope link src 169.254.192.90 metric 237 ***
192.168.1.0/24 dev br0 proto kernel scope link src 192.168.1.44 

Внутри контейнера

[container]# ip addr
38: eth0@if39: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:16:3e:86:c2:9f brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::216:3eff:fe86:c29f/64 scope link 
       valid_lft forever preferred_lft forever
[container]# ip route

Контейнер не может пинговать IP-адреса или домены.

systemctl показывает networkd и устранена ошибка:

[container]# systemctl
...
● systemd-networkd.service          loaded failed failed    Network Service                                                              
● systemd-resolved.service          loaded failed failed    Network Name Resolution                                                      

С помощью journalctl -r Я мог найти некоторые ошибки, но я их не понял.

Feb 03 20:04:53 archie systemd[1]: Stopped Network Service.
Feb 03 20:04:53 archie systemd[1]: systemd-networkd.service: Scheduled restart job, restart counter is at 5.
Feb 03 20:04:53 archie systemd[1]: systemd-networkd.service: Service has no hold-off time (RestartSec=0), scheduling restart.
Feb 03 20:04:53 archie systemd[1]: Failed to start Network Service.
Feb 03 20:04:53 archie systemd[1]: systemd-networkd.service: Failed with result 'exit-code'.
Feb 03 20:04:53 archie systemd[1]: systemd-networkd.service: Main process exited, code=exited, status=226/NAMESPACE
Feb 03 20:04:53 archie systemd[29]: systemd-networkd.service: Failed at step NAMESPACE spawning /usr/lib/systemd/systemd-networkd: Permission>
Feb 03 20:04:53 archie systemd[29]: systemd-networkd.service: Failed to set up mount namespacing: Permission denied
Feb 03 20:04:53 archie systemd[1]: Starting Network Service...

Я обнаружил, что 169,254 IP-адреса являются результатом сбоя DHCP.

Я попытался отредактировать файл конфигурации systemd-networkd в контейнере, чтобы использовать статический IP-адрес, как в примере отсюда: https://wiki.archlinux.org/index.php/systemd-networkd#Usage_with_containers

[container]# cat /etc/systemd/network/eth0.network
[Match]
Name=eth0

[Network]
Address=192.168.1.77/24
Gateway=192.168.1.254
DNS=8.8.8.8

но сеть по-прежнему не работает, и возникают те же ошибки.

Как я могу заставить сеть работать внутри контейнера?

Спасибо!

Я привык выполнять этот запуск с помощью агента opensvc, управляющего моими контейнерами lxc.

Ниже представлен образец конфигурации службы:

[DEFAULT]
nodes = {clusternodes}
encapnodes = {container#1.name}
nodes@encapnodes = {container#1.name}

[disk#1]
type = zpool
name = {env.zfspool}
scsireserv = true
shared = true

[fs#root]
dev = {env.zfspool}
mnt = /srv/{svcname}
type = zfs
shared = true

[fs#container]
dev = {env.zfspool}/rootfs
mnt = {fs#root.mnt}/rootfs
type = zfs
shared = true

[container#1]
name = {env.lxcname}
type = lxc
rootfs = {fs#container.mnt}
shared = true

[ip#1]
type = netns
ipdev = {env.ipdev}
ipname = {env.ipname}
netmask = {env.netmask}
gateway = {env.gateway}
netns = container#1
shared = true

[env]
zfspool = {svcname}
lxcname = {svcname}
ipdev = br0
ipname = lxc.acme.com
netmask = 24
gateway = 10.11.12.1

Как вы можете видеть в ip#1 раздел, есть ссылка на container#1 раздел; это означает, что при запуске службы opensvc агент opensvc внедрит конфигурацию IP в указанный контейнер.

{svcname} является ссылкой на фактическое имя службы opensvc.