Вопрос или проблема
У меня есть виртуальная машина, работающая под 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-пакеты) на маршрутизатор, однако не получает ответы. Это может указывать на разрывы в маршрутизации или на проблемы с сетевыми правилами.
-
Проблемы с iptables: Поскольку контейнер не получает ответные пакеты, скорей всего, причина заключается в том, что iptables на хосте или маршрутизаторе блокируют эти пакеты. Возможно, пакеты ICMP, возвращающиеся к контейнеру, не обрабатываются должным образом.
Попробуйте добавить следующие правила iptables на хост-ОС:
iptables -A FORWARD -i br0 -o vethStvXMU -j ACCEPT iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
Эти правила позволят пакетам, исходящим из контейнера, проходить через хост и получать ответ от маршрутизатора.
-
Проверка централизованной маршрутизации и NAT: Убедитесь, что хост позволяет маршрутизацию пакетов между интерфейсами. Для этого проверьте и измените (если необходимо) файл
/etc/sysctl.conf
, добавив или изменив строку:net.ipv4.ip_forward = 1
После внесения изменений выполните:
sysctl -p
Это позволит хосту маршрутизировать пакеты между контейнером и маршрутизатором.
-
Проблема с настройкой сети: Ваша сетевое окружение настроено на использование подсети 10.1.0.0/16. Убедитесь, что маршрутизатор правильно настроен для обработки трафика от этой подсети. Проверьте маршруты на маршрутизаторе, чтобы убедиться, что он знает, как возвращать пакеты.
Дополнительные проверки
-
tcpdump: Убедитесь, что вы отслеживаете пакетный трафик на правильных интерфейсах. Например, запустите
tcpdump
на интерфейсеbr0
(хост) иvethStvXMU
(интерфейс контейнера), чтобы отследить путь пакетов.tcpdump -i br0 icmp tcpdump -i vethStvXMU icmp
-
Проверка конфигурации сети в контейнере: Если проблема сохраняется, убедитесь, что в контейнере настроены правильные маршруты и DNS. Контейнер должен иметь маршрут по умолчанию, указывающий на шлюз, который соответствует IP-адресу хоста.
Заключение
Эти шаги помогут вам произвести диагностику и устранение проблемы с отсутствием связи контейнера LXC с маршрутизатором. Наиболее вероятная причина заключается в сетевых правилах или настройках маршрутизации. Если после выполнения всех упомянутых выше шагов проблема не решится, дополнительная проверка логов может выявить специфические сообщения об ошибках, связанных с сетевым трафиком.