IP-адрес удален из моста docker0 на виртуальной машине QEMU/KVM.

Я арендую виртуальный сервер под управлением Ubuntu 22.04 и пытаюсь запустить на нем контейнеры Docker. Сервер виртуализирован с помощью qemu-kvm.

К сожалению, контейнеры не имеют доступа к сети.

      host:~# docker run -it ubuntu /bin/bash
container:/# apt-get update

Обновление APT завершается неудачно, поскольку к репозиториям невозможно получить доступ. Проверяем репозитории с хоста (виртуальной машины QEMU), с репозиториями все в порядке:

      host:~# ping archive.ubuntu.com

Я уже пробовал отключить подключение к Интернету внутри контейнеров Docker , и это не сработало, простой перезапуск службы Docker также не является решением.

Аппаратный брандмауэр деактивирован и ufw отключен.

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


Редактировать 2

Размещаю это выше, потому что мне это кажется более актуальным.

Что касается ответа здесь, я настроил systemd-networkd соответствующим образом. Интерфейс сохраняет свой адрес 172.17.0.1, пока я не запущу контейнер. Тогда IP теряется. Покаdocker0имеет свой IP-адрес, существует следующий маршрут:172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown


Редактировать 1

Насколько я понимаю QEMU, сетевой интерфейс должен быть явно подключен к сетевому интерфейсу физического хоста. Поскольку Docker создает собственные сетевые интерфейсы для каждой сети или, по крайней мере, docker0, он не подключен к Интернету.

Предположим, у меня есть интерфейс eth0 в качестве сетевого интерфейса по умолчанию в моей виртуальной машине. Могу ли я настроить iptables для маршрутизации трафика docker0 через интерфейс eth0?


Системная информация:

IP-маршрут

      default via 87.106.234.1 dev ens6 proto dhcp src [LOCAL_IP] metric 100 
87.106.234.1 dev ens6 proto dhcp scope link src [LOCAL_IP] metric 100 
212.227.123.16 via 87.106.234.1 dev ens6 proto dhcp src [LOCAL_IP] metric 100 
212.227.123.17 via 87.106.234.1 dev ens6 proto dhcp src [LOCAL_IP] metric 100

есликонфигурация

      docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 02:42:74:19:f6:1a  txqueuelen 0  (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

ens6: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet [LOCAL_IP]  netmask 255.255.255.255  broadcast 0.0.0.0
        inet6 [LOCAL_IP_V6]  prefixlen 64  scopeid 0x20<link>
        ether 02:01:72:39:35:f9  txqueuelen 1000  (Ethernet)
        RX packets 14885  bytes 164716593 (164.7 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 11369  bytes 1415635 (1.4 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 184  bytes 19073 (19.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 184  bytes 19073 (19.0 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

набор правил списка nft

      table ip nat {
    chain DOCKER {
        iifname "docker0" counter packets 0 bytes 0 return
    }

    chain POSTROUTING {
        type nat hook postrouting priority srcnat; policy accept;
        oifname != "docker0" ip saddr 172.17.0.0/16 counter packets 0 bytes 0 masquerade 
    }

    chain PREROUTING {
        type nat hook prerouting priority dstnat; policy accept;
        fib daddr type local counter packets 3317 bytes 150836 jump DOCKER
    }

    chain OUTPUT {
        type nat hook output priority -100; policy accept;
        ip daddr != 127.0.0.0/8 fib daddr type local counter packets 0 bytes 0 jump DOCKER
    }
}
table ip filter {
    chain DOCKER {
    }

    chain DOCKER-ISOLATION-STAGE-1 {
        iifname "docker0" oifname != "docker0" counter packets 0 bytes 0 jump DOCKER-ISOLATION-STAGE-2
        counter packets 0 bytes 0 return
    }

    chain DOCKER-ISOLATION-STAGE-2 {
        oifname "docker0" counter packets 0 bytes 0 drop
        counter packets 0 bytes 0 return
    }

    chain FORWARD {
        type filter hook forward priority filter; policy drop;
        counter packets 0 bytes 0 jump DOCKER-USER
        counter packets 0 bytes 0 jump DOCKER-ISOLATION-STAGE-1
        oifname "docker0" ct state related,established counter packets 0 bytes 0 accept
        oifname "docker0" counter packets 0 bytes 0 jump DOCKER
        iifname "docker0" oifname != "docker0" counter packets 0 bytes 0 accept
        iifname "docker0" oifname "docker0" counter packets 0 bytes 0 accept
    }

    chain DOCKER-USER {
        counter packets 0 bytes 0 return
    }
}

1 ответ

Хост решил эту проблему путем изменения конфигурации:

В/etc/netplan/50-cloud-init.yaml, заменять

      match:
  name: '*'

с

      match:
  name: 'en*'

Корень проблемы заключался в том, чтоdocker0сеть потеряла свой IP-адрес, поэтому у нее не было подключения к Интернету.

Другие вопросы по тегам