Нет сетевого подключения в контейнере LXC, настроенном в режиме «маршрутизации»

Нет сетевого подключения в контейнере LXC, настроенном в режиме «маршрутизации»

Я экспериментирую с lxc/lxd в Vagrant, но я совсем новичок в этом деле. Мне удалось создать работающий контейнер, но я не могу ничего пинговать (включая 8.8.8.8) изнутри него. Я могу пинговать его IP из моей невиртуальной системы верхнего уровня, но он отклоняет SSH-подключения. Я могу войти в контейнер только напрямую с хоста прямого контейнера (Vagrant) с помощью lxc exec my-container /bin/bash.

Я попытался настроить свой контейнер в этом routedрежиме, и он мне все еще нужен, в учебных целях. Хотя документация LXD/LXC, похоже, несколько недостаточна.

Я попробовал следовать этой инструкции:https://blog.simos.info/how-to-get-lxd-containers-get-ip-from-the-lan-with-routed-network/но в итоге у меня это не сработало. Я мог что-то упустить, так как я еще не очень хорошо разбираюсь в сетях Linux.

Мой хост Vagrant работает на Ubuntu 20.04.

Мой контейнер LXC работает на Debian 10.

Конфигурация LXC на моем хосте Vagrant:

config:
  core.https_address: '[::]:8443'
  core.trust_password: true
networks: []
storage_pools:
- config:
    source: /home/luken/lxd-storage-pools
  description: ""
  name: default
  driver: dir
profiles:
- name: default
  config: {}
  description: ""
  devices:
    root:
      path: /
      pool: default
      type: disk
- name: mail-server
  config:
    user.network-config: |
      version: 2
      ethernets:
        eth0:
          addresses:
          - 192.168.33.11/32
          nameservers:
            addresses:
            - 8.8.8.8
            search: []
          routes:
          -   to: 0.0.0.0/0
            via: 169.254.0.1
  description: Mail Server LXD profile
  devices:
    eth0:
      ipv4.address: 192.168.33.11
      nictype: routed
      parent: eth1
      type: nic
cluster: null

ip addrв моем хосте Vagrant:

luken@luken-tech-test:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:be:4a:e8 brd ff:ff:ff:ff:ff:ff
    inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic eth0
       valid_lft 76347sec preferred_lft 76347sec
    inet6 fe80::a00:27ff:febe:4ae8/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 08:00:27:65:e6:28 brd ff:ff:ff:ff:ff:ff
    inet 192.168.33.2/24 brd 192.168.33.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::a00:27ff:fe65:e628/64 scope link 
       valid_lft forever preferred_lft forever
6: vetha8400046@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fe:48:28:3e:e4:fa brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 169.254.0.1/32 scope global vetha8400046
       valid_lft forever preferred_lft forever
    inet6 fe80::fc48:28ff:fe3e:e4fa/64 scope link 
       valid_lft forever preferred_lft forever

ip addrв моем контейнере:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 9a:14:96:30:67:43 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.33.11/32 brd 255.255.255.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::9814:96ff:fe30:6743/64 scope link 
       valid_lft forever preferred_lft forever

ip rв моем хосте Vagrant:

default via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 100 
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 
10.0.2.2 dev eth0 proto dhcp scope link src 10.0.2.15 metric 100 
192.168.33.0/24 dev eth1 proto kernel scope link src 192.168.33.2 
192.168.33.11 dev vetha8400046 scope link

ip rв моем контейнере:

default via 169.254.0.1 dev eth0 
169.254.0.1 dev eth0 scope link

Есть ли что-то, что я пропустил (вероятно, многое)?

решение1

Для того чтобы ваша схема заработала, необходимо несколько вещей:

  1. Проверьте переадресацию на интерфейсах хоста: ip -4 netconf show dev vetha8400046и ip -4 netconf show dev eth0. Вы должны увидеть включенную переадресацию в выводе. В противном случае включите ее с помощью команды sysctl -w net.ipv4.conf.<iface>.forwarding=1. Добавьте соответствующие строки в /etc/sysctl.confфайл, чтобы сделать его постоянным.

  2. Проверьте маршрутизацию на хосте: ip -4 route get 8.8.8.8 from 192.168.33.11 iif vetha8400046. Вы должны увидеть действительный маршрут через шлюз по умолчанию ( ... via 10.0.2.2 dev .... Проверьте также обратный маршрут с помощью ip -4 route get 192.168.33.11 from 8.8.8.8 iif eth0.

  3. Отправьте пинг контейнеру с хоста и наоборот.

  4. Настройте NAT на хосте: iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE. Пингуем какой-нибудь внешний хост из контейнера. Счетчики этого правила в iptables-save -cдолжны быть ненулевыми.

  5. Задайте вопрос, если вы застряли.

решение2

Это правильная настройка для того, чтобы контейнеры Debian 10 были доступны в нашей локальной сети по их собственным статическим IP-адресам и имели доступ к Интернету.

Наш Vagrantfile:

Vagrant.configure("2") do |config|

  config.vm.define "main" do |main|
    main.vm.box = "bento/ubuntu-20.04"
    main.vm.box_version = "202010.24.0"
    main.vm.hostname = "lxc-host"

    main.vm.network "public_network", auto_config: false

    main.vm.provision "shell",
      run: "always",
      inline: "ip address add **192.168.1.200**/24 dev eth1"
    main.vm.provision "shell",
      run: "always",
      inline: "ip link set eth1 up"

    main.vm.provider :virtualbox do |vb|
        vb.memory = 1024
    end
  end

end

Обратите внимание, что мы настраиваем «публичную» сеть. Это означает, что при запуске Vagrant вам будет предложено выбрать используемый интерфейс. Выберите тот, который вы используете для подключения к локальной сети.

Обратите внимание, что на данный момент мы настраиваем только один IP-адрес: это (192.168.1.200) будет IP-адрес нашего хоста.Здесь мы не настраиваем IP-адрес контейнера.

После запуска нашего хоста включите переадресацию IP в его конфигурации, раскомментировав: net.ipv4.ip_forward=1и /etc/sysctl.confперезапустив sysctl, выполнив systemctl restart systemd-sysctl.

Теперь, если вы правильно установили и настроили LXDхост, вы можете выполнить инициализацию lxdсо следующей конфигурацией:

config:
  core.https_address: '[::]:8443'
  core.trust_password: true
networks: []
storage_pools:
- config:
    source: [path-to-storage-pools-directory]
  description: ""
  name: default
  driver: dir
profiles:
- name: default
  config:
  description: ""
  devices:
    root:
      path: /
      pool: default
      type: disk
- name: test-container
  config:
    user.user-data: |
      #cloud-config
      bootcmd:
        - echo 'nameserver 8.8.8.8' > /etc/resolvconf/resolv.conf.d/tail
        - systemctl restart resolvconf
  description: Mail Server LXD profile
  devices:
    eth0:
      ipv4.address: 192.168.1.201
      nictype: routed
      parent: eth1
      type: nic
cluster: null

Изменять[путь-к-каталогу-пулов-хранения]в фактический путь к каталогу, где вы собираетесь хранить свои пулы.

Обратите внимание, что мы не используем cloud-init для настройки сети, так как это приведет к конфликту с сетевой службой Debian, что приведет к ее сбою в запуске.

Обратите внимание, что мы используем cloud-init для настройки сервера имен, который будет использоваться нашим гостем.

192.168.1.201 будет IP-адресом нашего гостя. Эта настройка предполагает, что локальная сеть — 192.168.1.0, если ваша сеть отличается, измените IP-адреса соответствующим образом. Также убедитесь, что используемые здесь IP-адреса не используются ничем другим в сети.

Здесь мы используем два профиля, но вам решать, как организовать свою конфигурацию.

Теперь запустим наш контейнер:

lxc launch images:debian/10/cloud our-actual-test-container --profile default --profile test-container

Он должен работать и быть доступен в локальной сети, но у него не будет доступа к интернету, и это сложная часть. Это вызвано маршрутизацией, настроенной на основе lxdпредположения, что шлюз по умолчанию — это шлюз в сеть vagrant/virtualbox. Нам нужно это исправить.

При запуске ip rна хосте вы должны увидеть список маршрутов — что-то вроде этого:

default via 10.0.2.2 dev eth0 proto dhcp src 10.0.2.15 metric 100 
10.0.2.0/24 dev eth0 proto kernel scope link src 10.0.2.15 
10.0.2.2 dev eth0 proto dhcp scope link src 10.0.2.15 metric 100 
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.200 
192.168.1.201 dev vethc5cebe03 scope link

Проблема в дефолтном, который направляет трафик в сеть vagrant/virtualbox вместо нашего фактического шлюза. Давайте удалим его:

ip route del default via 10.0.2.2

И давайте добавим правило, которое будет пересылать пакеты на реальный шлюз нашей локальной сети:

ip route add default via 192.168.1.1

(предполагается, что 192.168.1.1 — это IP нашего локального шлюза)

Теперь трафик из контейнера будет поступать на нужный шлюз, и все готово!

Связанный контент