Instalei o LXC em um debian / sid e criei um contêiner jessie / amd64
sudo apt-get install lxc debootstrap libvirt-clients \
libvirt-daemon-system ebtables dnsmasq
sudo lxc-create -t /usr/share/lxc/templates/lxc-debian -n debian
então eu começo a ponte
sudo virsh net-start default
Isso cria uma rede 2 se virbr0
e virbr0-nic
, veth94ECU1
forem criados depois que lxc-start
, estiver usando a rede 192.168.122.0/24
e o ip for atribuído por dhcp.
O container começa bem, ele pode chegar ao host e vice-versa, eu posso pingar e se houver um servidor web em execução, posso acessar com um navegador do host.
virsh net-start
também adiciona alguma regra a iptables
(não tenho um firewall em execução no host, portanto, por padrão, tudo está vazio e ACCEPT
)
iptables -L
após net-start
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp dpt:domain
ACCEPT tcp -- anywhere anywhere tcp dpt:domain
ACCEPT udp -- anywhere anywhere udp dpt:bootps
ACCEPT tcp -- anywhere anywhere tcp dpt:bootps
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere 192.168.122.0/24 ctstate RELATED,ESTABLISHED
ACCEPT all -- 192.168.122.0/24 anywhere
ACCEPT all -- anywhere anywhere
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
REJECT all -- anywhere anywhere reject-with icmp-port-unreachable
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere udp dpt:bootpc
iptables -L -t nat
após net-start
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
RETURN all -- 192.168.122.0/24 base-address.mcast.net/24
RETURN all -- 192.168.122.0/24 255.255.255.255
MASQUERADE tcp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE udp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24
/proc/sys/net/ipv4/ip_forward
é 1
Agora eu gostaria de NAT alguma porta do host para o recipiente, encontrando uma solução tudo on-line parece apontar na mesma direção, algo assim abaixo deve funcionar:
iptables -A PREROUTING -t nat -p tcp --dport $HPORT -j DNAT --to $VRIP:$VRPORT
iptables -A FORWARD -p tcp -d $VRIP --dport $VRPORT -j ACCEPT
mas não é, o que eu sinto falta?
atualização
Eu mudei de lxc-nat / virsh net-start (virbr0) para hospedeiro nat (br0) seguindo este post: Convertendo eth0 para br0 e obtendo todo o seu LXC ou LXD em sua LAN
Funciona, os containers obtêm o ip via dhcp do roteador LAN e estão na mesma rede, o que é conveniente porque meu roteador pode encaminhar apenas endereços LAN de porta NAT.
Resumidamente, crie uma interface br0
em /etc/network/interfaces
, assim:
auto br0
iface br0 inet static
address 192.168.2.210
netmask 255.255.255.0
network 192.168.2.0
broadcast 192.168.2.255
gateway 192.168.2.1
bridge-ifaces eth0
bridge-ports eth0
up ifconfig eth0 up
iface eth0 inet manual
use lxc.network.link = br0
na configuração do contêiner.
Ainda assim, se alguém souber uma forma de NAT, apenas alguma porta sem usar uma ponte de host sobre a qual gostaria de ouvir.
Tags networking debian iptables lxc nat