web-dev-qa-db-fra.com

Aucune connectivité réseau dans le conteneur LXC configuré dans le mode "routé"

J'essaie d'expérimenter LXC/LXD à Vagrant, mais j'en suis assez nouveau. J'ai réussi à créer un conteneur en cours d'exécution, mais je ne peux rien ping (y compris 8.8.8.8) de l'intérieur. Je peux ping ip ip de mon système non virtuel de haut niveau, mais il refuse des connexions SSH. Je ne peux entrer dans le conteneur uniquement directement à partir de l'hôte du conteneur direct (Vagrant) à l'aide de lxc exec my-container /bin/bash.

J'ai essayé de configurer mon conteneur dans le mode routed, et je le veux toujours, à des fins d'apprentissage. La documentation LXD/LXC semble être quelque peu manquante.

J'ai essayé de suivre cette instruction: https://blog.simos.info/how-to-get-lxd-containerers-get-ip-de-the-lan-with-route-network/ Mais cela n'a pas fonctionné pour moi à la fin. Je me manquerais quelque chose, car je ne suis pas encore versé dans le réseau de Linux.

Mon hôte Vagrant est en cours d'exécution sur Ubuntu 20.04.

Mon conteneur LXC fonctionne sur Debian 10.

Configuration LXC sur mon hôte 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 Dans mon hôte vagabond:

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 Dans mon conteneur:

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 Dans mon hôte vagabond:

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 Dans mon conteneur:

default via 169.254.0.1 dev eth0 
169.254.0.1 dev eth0 scope link

Y a-t-il quelque chose que j'ai manqué (probablement beaucoup)?

3
Łukasz Zaroda

Ceci est la configuration correcte pour avoir les conteneurs de Debian 10 accessibles dans notre réseau local par leurs propres IPS statiques et qu'ils ont accès à Internet.

Notre 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

Notez que nous mettons en place un réseau "public", cela signifie que lorsque vous démarrez Vagrant, il vous sera demandé de choisir l'interface à utiliser, choisissez celle que vous utilisez pour vous connecter à votre réseau local.

Notez également que nous fixons une seule adresse IP pour l'instant, ceci (192.168.1.200) sera notre adresse IP de notre hôte. Nous ne configurons pas IP de conteneur ici.

Après avoir démarré notre hôte, activez la transmission IP dans sa configuration, notamment: net.ipv4.ip_forward=1 dans /etc/sysctl.conf et redémarrer SYSCTL en exécutant systemctl restart systemd-sysctl.

Maintenant, en supposant que vous avez installé et configuré LXD _ correctement sur l'hôte, vous pouvez l'init lxd avec la configuration suivante:

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

Changer [[Path-to-Storage-Pools-Répertoire] dans le chemin d'accès réel au répertoire où vous allez stocker vos piscines.

Notez que nous n'utilisons pas Cloud-Init pour configurer la mise en réseau, car elle serait en collision avec le service de réseau de Debian, ce qui ne le démarre pas.

Notez également que nous utilisons Cloud-Init pour configurer le serveur de noms à utiliser par notre invité.

192.168.1.201 sera la propriété intellectuelle de notre client. Cette configuration suppose que le réseau local est de 192.168.1.0, si votre réseau est différent, changez IPS en conséquence. Assurez-vous également que les IP utilisées ici ne sont pas utilisés par rien d'autre dans le réseau déjà.

Nous utilisons deux profils ici, mais c'est à vous de décider comment vous organisez votre configuration.

Maintenant, courons notre conteneur:

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

Il devrait être opérationnel et être disponible sur le réseau local, mais cela n'aura pas accès à Internet, et c'est la partie délicate. Ceci est causé par le routage mis en place par le lxd basé sur l'hypothèse selon laquelle la passerelle par défaut est celle sur le réseau Vagrant/VirtualBox. Nous devons régler cela.

Lors de l'exécution ip r Sur l'hôte, vous devriez voir la liste des itinéraires - quelque chose comme ça:

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

Le problème est avec la valeur par défaut, qui achemine le trafic sur le réseau Vagrant/VirtualBox au lieu de notre passerelle réelle. Enlevons-le:

ip route del default via 10.0.2.2

Et ajoutons la règle qui transmettra des paquets à la passerelle réelle de notre réseau local:

ip route add default via 192.168.1.1

(En supposant que 192.168.1.1 est IP de notre passerelle locale)

Maintenant, le trafic du conteneur sera à la bonne passerelle et nous sommes terminés!

0
Łukasz Zaroda

Il y a plusieurs choses nécessaires pour faire fonctionner votre programme:

  1. Vérifiez le transfert sur les interfaces hôtes: ip -4 netconf show dev vetha8400046 et ip -4 netconf show dev eth0. Vous devriez voir le transfert activé dans la sortie. Sinon, activez-la avec le sysctl -w net.ipv4.conf.<iface>.forwarding=1 commande. Ajoutez les chaînes correspondantes dans le /etc/sysctl.conf Fichier pour le rendre persistant.

  2. Vérifiez le routage sur l'hôte: ip -4 route get 8.8.8.8 from 192.168.33.11 iif vetha8400046. Vous devriez voir l'itinéraire valide via votre passerelle par défaut (... via 10.0.2.2 dev .... Vérifiez également la route inverse avec le ip -4 route get 192.168.33.11 from 8.8.8.8 iif eth0.

  3. Ping le conteneur d'hôte et inversement.

  4. Configurer le NAT sur l'hôte: iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE. Ping un hôte externe du conteneur. Les compteurs de cette règle dans le iptables-save -c devrait être non nulle.

  5. Demandez à la question si vous êtes coincé.

0
Anton Danilov