Вопрос или проблема
У меня есть сеть 10.0.0.0/24
. В этой сети у меня есть следующие машины, которые важны для вопроса:
10.0.0.207
– мой Ubuntu Server LXD хост10.0.0.215
– мой межсетевой экран и шлюз по умолчанию для10.0.0.0/24
10.0.0.104
– мой ноутбук
Теперь я хочу создать подсеть для моих LXD контейнеров, 10.100.0.0/24
, я хочу сделать это, чтобы у меня не было пересекающихся подсетей для обычной локальной сети и LXD контейнеров.
- Эти LXD контейнеры должны быть доступны из
10.0.0.0/24
и также должны иметь возможность достигать всего в10.0.0.0/24
Таким образом, на моем межсетевом экране (шлюз по умолчанию) я добавил статический маршрут, назначение: 10.100.0.0/24
через 10.0.0.207
. Я также добавил правила на моем межсетевом экране, что все разрешено с 10.0.0.0
на 10.100.0.0
и наоборот.
Если я пингую 10.100.0.45
(работающий Ubuntu LXD контейнер) с моего ноутбука 10.0.0.104
, мои пакеты теряются. Я также не могу использовать tracert
.
Однако, если я запускаю tcpdump, все, похоже, достигает назначения правильно. Я также вижу на моем межсетевом экране, что запрос прошел:
tcpdump на моем LXD хосте для контейнера:
sudo tcpdump -i lxdbr0 host 10.100.0.45
tcpdump: вывод в подробном режиме подавлен, используйте -v[v]... для полного декодирования протокола
прослушивание на lxdbr0, тип ссылки EN10MB (Ethernet), длина снимка 262144 байта
11:56:04.012029 IP _gateway > 10.100.0.45: ICMP echo request, id 10005, seq 100, длина 40
11:56:04.012066 IP 10.100.0.45 > _gateway: ICMP echo reply, id 10005, seq 100, длина 40
11:56:08.863895 IP _gateway > 10.100.0.45: ICMP echo request, id 10005, seq 101, длина 40
11:56:08.863930 IP 10.100.0.45 > _gateway: ICMP echo reply, id 10005, seq 101, длина 40
11:56:09.217011 ARP, Запрос кто-есть 10.100.0.45 сообщить service-ubu-01, длина 28
11:56:09.217001 ARP, Запрос кто-есть service-ubu-01 сообщить 10.100.0.45, длина 28
11:56:09.217065 ARP, Ответ service-ubu-01 - 00:16:3e:08:e6:59 (oui Unknown), длина 28
11:56:09.217071 ARP, Ответ 10.100.0.45 - 00:16:3e:34:16:e0 (oui Unknown), длина 28
11:56:13.855060 IP _gateway > 10.100.0.45: ICMP echo request, id 10005, seq 102, длина 40
11:56:13.855097 IP 10.100.0.45 > _gateway: ICMP echo reply, id 10005, seq 102, длина 40
11:56:18.867026 IP _gateway > 10.100.0.45: ICMP echo request, id 10005, seq 103, длина 40
11:56:18.867059 IP 10.100.0.45 > _gateway: ICMP echo reply, id 10005, seq 103, длина 40
tcpdump внутри моего LXD контейнера:
tcpdump -i eth0 icmp
tcpdump: вывод в подробном режиме подавлен, используйте -v[v]... для полного декодирования протокола
прослушивание на eth0, тип ссылки EN10MB (Ethernet), длина снимка 262144 байта
11:56:59.301478 IP _gateway > netbird-lxc-01.lxd: ICMP echo request, id 43339, seq 104, длина 40
11:56:59.301504 IP netbird-lxc-01.lxd > _gateway: ICMP echo reply, id 43339, seq 104, длина 40
11:57:03.858442 IP _gateway > netbird-lxc-01.lxd: ICMP echo request, id 43339, seq 105, длина 40
11:57:03.858467 IP netbird-lxc-01.lxd > _gateway: ICMP echo reply, id 43339, seq 105, длина 40
11:57:08.859181 IP _gateway > netbird-lxc-01.lxd: ICMP echo request, id 43339, seq 106, длина 40
11:57:08.859205 IP netbird-lxc-01.lxd > _gateway: ICMP echo reply, id 43339, seq 106, длина 40
^C
6 пакетов захвачено
6 пакетов получено по фильтру
0 пакетов отброшено ядром
Кажется, что нет проблем с доступом к контейнеру, однако данные не отправляются обратно на мой компьютер. Я также не вижу ничего на своем межсетевом экране от подсети LXD 10.100.0.0/24
к локальной сети 10.0.0.0/24
– однако пинг мого ноутбука изнутри LXD контейнера работает:
root@netbird-lxc-01:~# ping 10.0.0.104
PING 10.0.0.104 (10.0.0.104) 56(84) байт данных.
64 байта от 10.0.0.104: icmp_seq=1 ttl=127 время=0.658 мс
64 байта от 10.0.0.104: icmp_seq=2 ttl=127 время=1.52 мс
Если я вручную добавляю маршрут на своем ноутбуке с Windows, я получаю ответ. Если я не добавляю этот маршрут, я не получаю ответа.
route add 10.100.0.0 MASK 255.255.255.0 10.0.0.207 METRIC 1
ping 10.100.0.45
Пинг 10.100.0.45 с 32 байтами данных:
Ответ от 10.100.0.45: байты=32 время<1мс TTL=63
Ответ от 10.100.0.45: байты=32 время<1мс TTL=63
Ответ от 10.100.0.45: байты=32 время=1мс TTL=63
Ответ от 10.100.0.45: байты=32 время<1мс TTL=63
Тем не менее, я не хочу добавлять это вручную на всех компьютерах, я хотел бы, чтобы мой шлюз по умолчанию обрабатывал это.
Есть ли у меня ошибка где-то? Вы бы предложили совершенно другой подход?
Ответ или решение
Вопрос о сетевом взаимодействии между контейнерами LXD и локальной сетью может показаться сложным, но давайте разберем вашу ситуацию шаг за шагом. Задача состоит в том, чтобы обеспечить доступность контейнеров на под сети 10.100.0.0/24
как для хоста, так и для других машин в сети 10.0.0.0/24
, без необходимости вручную добавлять маршруты на клиентских устройствах.
Подробный анализ вашей конфигурации
-
Сетевое окружение:
- У вас есть сеть
10.0.0.0/24
, к которой подключены следующие устройства:- 10.0.0.207 – хост Ubuntu с LXD.
- 10.0.0.215 – ваш фаервол, который является шлюзом.
- 10.0.0.104 – ваш ноутбук.
- Создана отдельная подсеть
10.100.0.0/24
для контейнеров, чтобы избежать пересечений.
- У вас есть сеть
-
Настройка фаервола:
- Вы добавили статический маршрут на фаервол: маршрут на
10.100.0.0/24
через10.0.0.207
. - Правила фаервола позволяют трафику проходить в обоих направлениях между подсетями.
- Вы добавили статический маршрут на фаервол: маршрут на
-
Результаты анализа с помощью tcpdump:
- По наблюдениям, пакеты до контейнера доходят, и контейнер отправляет ответы обратно, но при этом пакеты не доходят до вашего ноутбука.
- Вы смогли выполнить
ping
с контейнера на ваш ноутбук, что указывает на то, что обратный путь работает, пока у вас настроен маршрут.
Возможные источники проблемы и их решения
-
Маршруты на устройстве пользователя:
- Ваш ноутбук не знает, как добраться до подсети
10.100.0.0/24
, так как маршрут, указывающий на10.0.0.207
, не создан по умолчанию. - Поскольку вы указали, что ручное добавление маршрута решает проблему, это означает, что фаервол и LXD-хост не могут корректно направить пакеты к вашему ноутбуку без явного указания маршрута на клиентском устройстве.
- Ваш ноутбук не знает, как добраться до подсети
-
Настройка динамической маршрутизации:
- Для автоматизации процесса вы можете рассмотреть использование DHCP для назначения маршрутов на клиентских устройствах. Настройка DHCP-сервера для включения опции маршрутизации будет полезна для всех устройств в сети.
- Для этого, вам необходимо установить в DHCP-сервере опцию 121 (Classless Static Route Option) для объявления маршрута к
10.100.0.0/24
через ваш фаервол.
-
Проверка настроек фаервола и NAT:
- Убедитесь, что фаервол корректно обрабатывает NAT-процессы. Если фаервол использует NAT, возможно, потребуется настроить правила NAT для разрешения возвращающихся пакетов от контейнеров к клиентским устройствам.
- Проверьте, нет ли ограничений по типам трафика (например, ICMP) в правилах фаервола.
Заключение
Ваша существующая сеть LXD уже настроена правильно, и с точки зрения сетевой конфигурации вы на правильном пути. Важнейшим шагом для решения вашей проблемы станет настройка DHCP сервера для добавления маршрута автоматически, или, если это невозможно, пересмотр маршрутизации через фаервол, чтобы ваши клиенты знали об отсутствии этой подсети.
Если у вас возникнут дополнительные вопросы или потребуется помощь с реализацией данных настроек, не стесняйтесь задавать их.