Nenhuma conectividade de rede no contêiner LXC configurada no modo "roteado"

Nenhuma conectividade de rede no contêiner LXC configurada no modo "roteado"

Estou experimentando lxc/lxd no Vagrant, mas sou muito novo nisso. Consegui criar um contêiner em execução, mas não consigo executar ping em nada (incluindo 8.8.8.8) de dentro dele. Posso executar ping em seu IP do meu sistema não virtual de nível superior, mas ele recusa conexões SSH. Posso entrar no contêiner apenas diretamente do host do contêiner direto (Vagrant) usando lxc exec my-container /bin/bash.

Tentei configurar meu contêiner no routedmodo, e ainda o quero, para fins de aprendizado. A documentação do LXD/LXC parece estar faltando um pouco.

Tentei seguir esta instrução:https://blog.simos.info/how-to-get-lxd-containers-get-ip-from-the-lan-with-routed-network/mas não funcionou para mim no final. Posso perder alguma coisa, porque ainda não sou muito versado em redes Linux.

Meu host Vagrant está rodando em Ubuntu 20.04.

Meu contêiner LXC está sendo executado em Debian 10.

Configuração LXC no meu host 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 addrno meu host 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 addrno meu contêiner:

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 rno meu host 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 rno meu contêiner:

default via 169.254.0.1 dev eth0 
169.254.0.1 dev eth0 scope link

Há algo que perdi (provavelmente muito)?

Responder1

Existem várias coisas necessárias para fazer seu esquema funcionar:

  1. Verifique o encaminhamento nas interfaces do host: ip -4 netconf show dev vetha8400046e ip -4 netconf show dev eth0. Você deverá ver o encaminhamento habilitado na saída. Caso contrário, habilite-o com o sysctl -w net.ipv4.conf.<iface>.forwarding=1comando. Adicione as strings correspondentes ao /etc/sysctl.confarquivo para torná-lo persistente.

  2. Verifique o roteamento no host: ip -4 route get 8.8.8.8 from 192.168.33.11 iif vetha8400046. Você deverá ver a rota válida através do seu gateway padrão ( ... via 10.0.2.2 dev .... Verifique também a rota reversa com o ip -4 route get 192.168.33.11 from 8.8.8.8 iif eth0.

  3. Faça ping no contêiner do host e vice-versa.

  4. Configure o NAT no host: iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE. Faça ping em algum host externo do contêiner. Os contadores desta regra iptables-save -cdevem ser diferentes de zero.

  5. Faça a pergunta se você travou.

Responder2

Esta é a configuração correta para ter contêineres Debian 10 acessíveis em nossa rede local por seus próprios IPs estáticos e ter acesso à Internet.

Nosso 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

Observe que estamos configurando uma rede "pública", isso significa que ao iniciar o Vagrant, você será solicitado a escolher a interface a ser usada, escolha aquela que você está usando para se conectar à sua rede local.

Observe também que estamos configurando apenas um único IP por enquanto, este (192.168.1.200) será o IP do nosso host.Não estamos configurando o IP do contêiner aqui.

Após iniciar nosso host, habilite o encaminhamento de IP em sua configuração, descomentando: net.ipv4.ip_forward=1in /etc/sysctl.confe reiniciando o sysctl executando systemctl restart systemd-sysctl.

Agora, supondo que você instalou e configurou LXDcorretamente no host, você pode iniciar lxdcom a seguinte configuração:

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

Mudar[caminho para o diretório dos pools de armazenamento]no caminho real para o diretório onde você armazenará seus pools.

Observe que não estamos usando o cloud-init para configurar a rede, pois ele colidiria com o serviço de rede do Debian, fazendo com que ele não iniciasse.

Observe também que estamos usando o cloud-init para configurar o servidor de nomes a ser usado pelo nosso convidado.

192.168.1.201 será o IP do nosso convidado. Esta configuração assume que a rede local é 192.168.1.0, se a sua rede for diferente, altere os IPs de acordo. Certifique-se também de que os IPs usados ​​aqui não sejam usados ​​por mais nada na rede.

Estamos usando dois perfis aqui, mas depende de você como organizar sua configuração.

Agora vamos executar nosso contêiner:

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

Ele deveria estar rodando e disponível na rede local, mas não terá acesso à internet, e essa é a parte complicada. Isso é causado pelo roteamento configurado com lxdbase na suposição de que o gateway padrão é aquele para a rede vagrant/virtualbox. Precisamos consertar isso.

Ao executar ip rno host, você deverá ver a lista de rotas - algo assim:

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

O problema está no padrão, que roteia o tráfego para a rede vagrant/virtualbox em vez de nosso gateway real. Vamos removê-lo:

ip route del default via 10.0.2.2

E vamos adicionar a regra que encaminhará os pacotes para o gateway real da nossa rede local:

ip route add default via 192.168.1.1

(assumindo que 192.168.1.1 seja o IP do nosso gateway local)

Agora o tráfego do contêiner irá para o gateway correto e pronto!

informação relacionada