Используя мост, контейнер LXC не может пинговать маршрутизатор, но операционная система хоста может.

Вопрос или проблема

У меня есть виртуальная машина, работающая под virtualbox, и в этой виртуальной машине у меня есть контейнер LXC, который я пытаюсь связать с интерфейсом NAT virtualbox:

-------------      -----------      -----------      ----------      ----------
| LXC       | ---> | Хост ОС | ---> | Virtual | ---> | Ноутбук | ---> | Роутер |
| Контейнер |      | Linux   |      | Box     |      |        |      |        |
-------------      -----------      -----------      ----------      ----------
eth0 10.1.0.35     br0 <-> eth0     NAT GW:          192.168.1.33    GW:
gw 10.1.0.2        br0 10.1.0.5      10.1.0.2/16                      192.168.1.1
                   gw 10.1.0.2

Ping 10.1.0.2      ping 10.1.0.2
 FAIL               OK

Я не могу пинговать с контейнера LXC до шлюза virtualbox, но могу с хостовой ОС.

Примечание: запуская tcpdump на хостовой ОС, я вижу пинги, отправляемые из контейнера к роутеру, и ответ от роутера к контейнеру, но tcpdump на контейнере не показывает трафика.

LXC eth0

eth0      Link encap:Ethernet  HWaddr 00:16:3e:ed:82:b8
          inet addr:10.1.0.35  Bcast:10.1.255.255  Mask:255.255.0.0
          inet6 addr: fe80::216:3eff:feed:82b8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:585 errors:0 dropped:0 overruns:0 frame:0
          TX packets:588 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:58003 (58.0 KB)  TX bytes:56447 (56.4 KB)

Хост ОС:

root@ubuntuserver:/# ifconfig
br0       Link encap:Ethernet  HWaddr 08:00:27:ca:5f:7a
          inet addr:10.1.0.5  Bcast:10.1.255.255  Mask:255.255.0.0
          inet6 addr: fe80::a00:27ff:feca:5f7a/64 Scope:Link
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:2012 errors:0 dropped:0 overruns:0 frame:0
          TX packets:882 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:158794 (158.7 KB)  TX bytes:139083 (139.0 KB)

eth0      Link encap:Ethernet  HWaddr 08:00:27:ca:5f:7a
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:2968 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2404 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:281188 (281.1 KB)  TX bytes:312109 (312.1 KB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:180 errors:0 dropped:0 overruns:0 frame:0
          TX packets:180 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:14376 (14.3 KB)  TX bytes:14376 (14.3 KB)

vethStvXMU Link encap:Ethernet  HWaddr fe:9a:36:3a:84:1c
          inet6 addr: fe80::fc9a:36ff:fe3a:841c/64 Scope:Link
          UP BROADCAST RUNNING PROMISC MULTICAST  MTU:1500  Metric:1
          RX packets:557 errors:0 dropped:0 overruns:0 frame:0
          TX packets:554 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:53465 (53.4 KB)  TX bytes:55003 (55.0 KB)


root@ubuntuserver:/# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.080027ca5f7a       no              eth0
                                                        vethStvXMU

Попробуйте добавить следующие правила iptables:

iptables -A POSTROUTING -s 10.1.0/24 -o vmbr0 -j SNAT --to-source 148.251.79.108
iptables -A POSTROUTING -s 192.168.10.0/24 -o vmbr0 -j MASQUERADE

Ответ или решение

Когда вы настраиваете виртуальную машину в VirtualBox, а внутри неё контейнер LXC, может возникнуть ситуация, когда контейнер не может пинговать маршрутизатор, но это удается хост-операционной системе. Чтобы разобраться в данной проблеме, нужно учесть несколько аспектов сетевой конфигурации.

Основные компоненты сетевой инфраструктуры

В вашем сценарии присутствуют следующие основные элементы:

  • Контейнер LXC (10.1.0.35): Использует интерфейс eth0 для связи с хостом.
  • Хост-ОС: Имеет интерфейс br0 с IP-адресом 10.1.0.5 и подключается к виртуальному свитчу (NAT).
  • Маршрутизатор: Имеет IP-адрес 192.168.1.1 и служит основным шлюзом для доступа в интернет.

Проблема маршрутизации

Вы упомянули, что контейнер LXC может отправлять запросы (ICMP-пакеты) на маршрутизатор, однако не получает ответы. Это может указывать на разрывы в маршрутизации или на проблемы с сетевыми правилами.

  1. Проблемы с iptables: Поскольку контейнер не получает ответные пакеты, скорей всего, причина заключается в том, что iptables на хосте или маршрутизаторе блокируют эти пакеты. Возможно, пакеты ICMP, возвращающиеся к контейнеру, не обрабатываются должным образом.

    Попробуйте добавить следующие правила iptables на хост-ОС:

    iptables -A FORWARD -i br0 -o vethStvXMU -j ACCEPT
    iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

    Эти правила позволят пакетам, исходящим из контейнера, проходить через хост и получать ответ от маршрутизатора.

  2. Проверка централизованной маршрутизации и NAT: Убедитесь, что хост позволяет маршрутизацию пакетов между интерфейсами. Для этого проверьте и измените (если необходимо) файл /etc/sysctl.conf, добавив или изменив строку:

    net.ipv4.ip_forward = 1

    После внесения изменений выполните:

    sysctl -p

    Это позволит хосту маршрутизировать пакеты между контейнером и маршрутизатором.

  3. Проблема с настройкой сети: Ваша сетевое окружение настроено на использование подсети 10.1.0.0/16. Убедитесь, что маршрутизатор правильно настроен для обработки трафика от этой подсети. Проверьте маршруты на маршрутизаторе, чтобы убедиться, что он знает, как возвращать пакеты.

Дополнительные проверки

  • tcpdump: Убедитесь, что вы отслеживаете пакетный трафик на правильных интерфейсах. Например, запустите tcpdump на интерфейсе br0 (хост) и vethStvXMU (интерфейс контейнера), чтобы отследить путь пакетов.

    tcpdump -i br0 icmp
    tcpdump -i vethStvXMU icmp
  • Проверка конфигурации сети в контейнере: Если проблема сохраняется, убедитесь, что в контейнере настроены правильные маршруты и DNS. Контейнер должен иметь маршрут по умолчанию, указывающий на шлюз, который соответствует IP-адресу хоста.

Заключение

Эти шаги помогут вам произвести диагностику и устранение проблемы с отсутствием связи контейнера LXC с маршрутизатором. Наиболее вероятная причина заключается в сетевых правилах или настройках маршрутизации. Если после выполнения всех упомянутых выше шагов проблема не решится, дополнительная проверка логов может выявить специфические сообщения об ошибках, связанных с сетевым трафиком.

Оцените материал
Добавить комментарий

Капча загружается...