
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 routed
modo, 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 addr
no 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 addr
no 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 r
no 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 r
no 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:
Verifique o encaminhamento nas interfaces do host:
ip -4 netconf show dev vetha8400046
eip -4 netconf show dev eth0
. Você deverá ver o encaminhamento habilitado na saída. Caso contrário, habilite-o com osysctl -w net.ipv4.conf.<iface>.forwarding=1
comando. Adicione as strings correspondentes ao/etc/sysctl.conf
arquivo para torná-lo persistente.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 oip -4 route get 192.168.33.11 from 8.8.8.8 iif eth0
.Faça ping no contêiner do host e vice-versa.
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 regraiptables-save -c
devem ser diferentes de zero.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=1
in /etc/sysctl.conf
e reiniciando o sysctl executando systemctl restart systemd-sysctl
.
Agora, supondo que você instalou e configurou LXD
corretamente no host, você pode iniciar lxd
com 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 lxd
base na suposição de que o gateway padrão é aquele para a rede vagrant/virtualbox. Precisamos consertar isso.
Ao executar ip r
no 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!