Вопрос или проблема
У меня есть Ubuntu сервер “k3”, подключенный к физической сети 192.168.86.0/24 и маршрутизатору tplink deco с адресом 192.168.86.1. IP-адрес к3 — 192.168.86.53.
На сервере Ubuntu я создал сеть ipvlan l3:
podman network create -d ipvlan --subnet 192.168.3.0/24 --opt mode=l3 ipvlan
Контейнер развернут с адресом 192.168.3.3. Успешная коммуникация:
- подключение от podman хоста к контейнеру
- подключение от другого хоста к контейнеру (после добавления статического маршрута для 192.168.3.0/24)
- подключение от контейнера к хостовой сети
Но контейнер не может соединиться с Интернетом. Пробовал пинговать 1.1.1.1 и 8.8.8.8, но ответа не было. Статический маршрут для 192.168.3.0/24 уже добавлен в моем маршрутизаторе deco. Захват пакетов в хостовой сети показывает отсутствие ответа.
root@k3:~# tcpdump -nn -v icmp -i enp1s0 -c3
tcpdump: listening on enp1s0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
14:42:16.851045 IP (tos 0x0, ttl 64, id 36288, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.3.3 > 1.1.1.1: ICMP echo request, id 10, seq 130, length 64
14:42:17.851604 IP (tos 0x0, ttl 64, id 36463, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.3.3 > 1.1.1.1: ICMP echo request, id 10, seq 131, length 64
14:42:18.852261 IP (tos 0x0, ttl 64, id 36506, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.3.3 > 1.1.1.1: ICMP echo request, id 10, seq 132, length 64
3 packets captured
3 packets received by filter
0 packets dropped by kernel
Я также попытался настроить NAT на podman хосте. net.ipv4.ip_forward включен, и цепочка FORWARD разрешает весь трафик.
iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j MASQUERADE
Захват пакетов теперь показывает ответ, но он не попадает в контейнер.
root@k3:~# tcpdump -nn -v icmp -i enp1s0 -c3
tcpdump: listening on enp1s0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
14:46:27.439541 IP (tos 0x0, ttl 64, id 2763, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.86.53 > 1.1.1.1: ICMP echo request, id 16, seq 0, length 64
14:46:27.442535 IP (tos 0x2c, ttl 55, id 17039, offset 0, flags [none], proto ICMP (1), length 84)
1.1.1.1 > 192.168.86.53: ICMP echo reply, id 16, seq 0, length 64
14:46:27.442642 IP (tos 0x2c, ttl 54, id 17039, offset 0, flags [none], proto ICMP (1), length 84)
1.1.1.1 > 192.168.3.3: ICMP echo reply, id 16, seq 0, length 64
3 packets captured
3 packets received by filter
0 packets dropped by kernel
Вывод пинга из моего alpine контейнера:
/ # ping 1.1.1.1 -c1
PING 1.1.1.1 (1.1.1.1): 56 data bytes
--- 1.1.1.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
Я думаю, что мой маршрутизатор deco не хочет маршрутизировать адреса за пределами диапазона LAN. Но установка NAT на podman хосте должна работать? Чего мне не хватает? Я хочу, чтобы мои контейнеры могли подключаться к Интернету.
Ответ или решение
Чтобы ваш контейнер Podman с сетью IPvlan L3 имел возможность доступа в интернет, необходимо правильно настроить маршрутизацию и маскарадинг (NAT). Рассмотрим шаги, которые вы уже предприняли и предоставим рекомендации по решениям:
Анализ текущей ситуации:
-
Создание сети IPvlan L3:
Вы создали сеть под названиемipvlan
с подсетью192.168.3.0/24
. Контейнер имеет IP 192.168.3.3, который не может обратиться в интернет. -
Основной сетевой маршрут:
На маршрутизаторе TP-Link Deco уже добавлен статический маршрут для подсети192.168.3.0/24
. Это позволяет другим устройствам внутри вашей локальной сети взаимодействовать с контейнерами. -
Настройка NAT:
Вы настроили маскарадинг на хосте командой:iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -j MASQUERADE
Это действие необходимо для того, чтобы пакеты из контейнера выглядели как исходящие от IP-адреса хоста (192.168.86.53), что позволит им выйти в интернет.
Проблемы и решения:
-
Проблема с маршрутизацией:
- В пакете tcpdump видно, что хотя ICMP-запросы уходят и ответы приходят, они не возвращаются в контейнер. С большой вероятностью это связано с тем, что полученные ответные пакеты не перенаправляются корректно контейнеру.
-
Настройка iptables:
- Убедитесь, что у вас разрешен трафик через цепочку FORWARD:
iptables -P FORWARD ACCEPT
- Проверьте и добавьте правила для разрешения трафика между контейнером и интернетом:
iptables -A FORWARD -o enp1s0 -j ACCEPT iptables -A FORWARD -i enp1s0 -j ACCEPT
- Убедитесь, что у вас разрешен трафик через цепочку FORWARD:
-
Конфигурация сети контейнера:
- Проверьте настройки маршрутизации внутри контейнера. Убедитесь, что шлюз по умолчанию настроен на IP-адрес хоста Docker Podman. Возможно, потребуется вручную указать Default Gateway при старте контейнера или отредактировать конфигурацию внутри контейнера.
-
Конфликты с маршрутизатором:
- Если маршрутизатор TP-Link действительно блокирует маршрутизацию через неизвестные подсети, возможно, стоит проверить его настройки или обновить прошивку. В некоторых случаях может потребоваться заменить маршрутизатор на более гибкое устройство.
Заключение:
Добейтесь последовательности в настройках и уверенной совместимости методов маршрутизации и NAT между хостом с Podman и вашим роутером. Правильная настройка iptables, маршрутизационных таблиц и согласование с внутрисетевыми параметрами роутера обеспечат успешное подключение контейнеров к интернету.
Это руководство призвано улучшить вашу конфигурацию сети с использованием Podman и сети ipvlan, предоставив детализированные инструкции по устранению текущих проблем.