Ubuntu 12.04 LXC nat pré-formatação não funciona

0

Eu tenho uma configuração do Debian Wheezy rodando exatamente para um Ubuntu 12.04

Enquanto a configuração do Debian é executada sem problemas, a versão do Ubuntu morre no redirecionamento para containers (ou assim parece)

Resumindo:

  • lxc funciona
  • contêineres funcionam e são executados
  • conectando-se ao contêiner do host OK (incluindo portas e serviços mistos)
  • conectar-se ao mundo externo do contêiner é bom

O que não funciona é a conexão de outra caixa ao host em uma porta que deve ser NAT para um contêiner.

As configurações: /etc/rc.local

CMD_BRCTL=/sbin/brctl
CMD_IFCONFIG=/sbin/ifconfig
CMD_IPTABLES=/sbin/iptables
CMD_ROUTE=/sbin/route
NETWORK_BRIDGE_DEVICE_NAT=lxc-bridge
HOST_NETDEVICE=eth0
PRIVATE_GW_NAT=192.168.42.1
PRIVATE_NETMASK=255.255.255.0
PUBLIC_IP=192.168.13.100
${CMD_BRCTL} addbr ${NETWORK_BRIDGE_DEVICE_NAT}
${CMD_BRCTL} setfd ${NETWORK_BRIDGE_DEVICE_NAT} 0
${CMD_IFCONFIG} ${NETWORK_BRIDGE_DEVICE_NAT} ${PRIVATE_GW_NAT} netmask ${PRIVATE_NETMASK} promisc up

Portanto, a rede lxc é 192.168.42.0/24 e o host eth0 ip é 192.168.13.100; configuração via gerenciador de rede como endereço estático.

iptables:

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*filter
:FORWARD ACCEPT [0:0]
:INPUT DROP [0:0]
:OUTPUT ACCEPT [0:0]

# Accept traffic from internal interfaces
-A INPUT -i lo -j ACCEPT
# accept traffic from lxc network
-A INPUT -d 192.168.42.1 -s 192.168.42.0/24 -j ACCEPT
# Accept internal traffic Make sure NEW incoming tcp connections are SYN 
# packets; otherwise we need to drop them:
-A INPUT -p tcp ! --syn -m state --state NEW -j DROP
# Packets with incoming fragments drop them. This attack result into Linux server panic such data loss.
-A INPUT -f -j DROP
# Incoming malformed XMAS packets drop them:
-A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# Incoming malformed NULL packets:
-A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# Accept traffic with the ACK flag set
-A INPUT -p tcp -m tcp --tcp-flags ACK ACK -j ACCEPT
# Allow incoming data that is part of a connection we established
-A INPUT -m state --state ESTABLISHED -j ACCEPT
# Allow data that is related to existing connections
-A INPUT -m state --state RELATED -j ACCEPT
# Accept responses to DNS queries
-A INPUT -p udp -m udp --dport 1024:65535 --sport 53 -j ACCEPT
# Accept responses to our pings
-A INPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT
# Accept notifications of unreachable hosts
-A INPUT -p icmp -m icmp --icmp-type destination-unreachable -j ACCEPT
# Accept notifications to reduce sending speed
-A INPUT -p icmp -m icmp --icmp-type source-quench -j ACCEPT
# Accept notifications of lost packets
-A INPUT -p icmp -m icmp --icmp-type time-exceeded -j ACCEPT
# Accept notifications of protocol problems
-A INPUT -p icmp -m icmp --icmp-type parameter-problem -j ACCEPT

# Respond to pings, but limit
-A INPUT -m icmp -p icmp --icmp-type echo-request -m state --state NEW -m limit --limit 6/s -j ACCEPT

# Allow connections to SSH server
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m limit --limit 12/s -j ACCEPT

COMMIT

*nat
:OUTPUT ACCEPT [0:0]
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

-A PREROUTING -d 192.168.13.100 -p tcp -m tcp --dport 2221 -m state --state NEW -m limit --limit 12/s -j DNAT --to-destination 192.168.42.11:22
-A PREROUTING -d 192.168.13.100 -p tcp -m tcp --dport 80 -m state --state NEW -m limit --limit 512/s -j DNAT --to-destination 192.168.42.11:80
-A PREROUTING -d 192.168.13.100 -p tcp -m tcp --dport 443 -m state --state NEW -m limit --limit 512/s -j DNAT --to-destination 192.168.42.11:443

-A POSTROUTING -d 192.168.42.0/24 -o eth0 -j SNAT --to-source 192.168.13.100
-A POSTROUTING -o eth0 -j MASQUERADE

COMMIT

sysctl:

net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.all.mc_forwarding = 0
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.default.mc_forwarding = 0
net.ipv4.ip_forward = 1

Eu configurei o log completo do iptables no container; nenhum dos pacotes endereçados para 192.168.13.100, a porta 80 está chegando ao container.

Eu até tentei kernels diferentes (kernel do servidor, raring lts kernel, etc), modprobe tudo iptables & amp; nat relacionado, nada. Alguma idéia?

    
por petermolnar 24.10.2013 / 12:45

2 respostas

1

OK, esse foi um "bug" desagradável Por padrão, o lxc configura a rede interna com base na máscara de rede 255.0.0.0. Portanto, a rede lxc interna também estava tentando encontrar um host dentro da rede lxc para 192.168.13.0, nunca retornando ao host.

A correção: no arquivo de configuração do container, o endereço IP deve ser como 192.168.42.10/24 em vez de 192.168.42.10.

O tcpdump é uma ferramenta útil.

    
por petermolnar 24.10.2013 / 17:40
0

Você tem "-m limit --limit x / s" na sua tabela * nat. Infelizmente, recursos como limite & amp; drop não funciona em * nat. Você precisaria definir um limite no INPUT do iptables do 192.168.42.11 lxc.

Um método que funciona se você tiver para bloqueá-lo antes de atingir o DNAT.

-A PREROUTING -d 192.168.13.100 -p tcp -m tcp --dport 2221 -m state --state NEW -m connlimit --connlimit-above 10 --connlimit-mask 32 -j DNAT --to-destination 127.0.0.1
-A PREROUTING -d 192.168.13.100 -p tcp -m tcp --dport 2221 -m state --state NEW -j DNAT --to-destination 192.168.42.11:22
    
por Shlepto 04.10.2016 / 17:25