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-адрес, поэтому у нее не было подключения к Интернету.