Нет сетевого подключения в контейнере LXC, установленном в режиме "routed"

Я экспериментирую с 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

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

3
задан 23 December 2020 в 23:10
2 ответа

Это довольно распространенное поведение RAID-контроллера без памяти. В основном основная проблема заключается в том, что без временного безопасного кэша DRAM записи не могут объединяться, что приводит к частым циклам чтения/изменения/записи. Это усугубляется тем, что RAID-карта отключает собственный кэш жесткого диска.

Я предлагаю вам либо использовать правильную карту RAID с защитой от powerloss, либо использовать простое зеркалирование.

Дополнительная информация приведена здесь.

-121--477655-

Это правильная настройка для обеспечения доступа к контейнерам 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 в его конфигурации, не комментируя: 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

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

Обратите внимание, что мы не используем 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 на основе предположения, что шлюз по умолчанию является шлюзом сети бродячей/виртуальной системы. Нам нужно это исправить.

При выполнении 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 нашего локального шлюза)

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

0
ответ дан 23 April 2021 в 23:59

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

  1. Проверьте пересылку на интерфейсах хоста: ip -4 netconf show dev vetha8400046 и ip -4 netconf show dev eth0. Вы должны увидеть включенную переадресацию в выводе. В противном случае включите его командой sysctl -w net.ipv4.conf..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. Задайте вопрос, если вы застряли.

0
ответ дан 23 April 2021 в 23:59

Теги

Похожие вопросы