Eu tenho um servidor Debian 12 (IP público 85.xxx.xxx.xxx
em enp6s0
) executando vários contêineres LXC em uma ponte de rede cbr0
.
Como o IP público é dinâmico, tive que configurar forward
+ prerouting
regras dnat
para que as solicitações recebidas chegassem aos contêineres. Por exemplo. a porta 80/443 é atribuída ao contêiner 10.10.0.1
. Aqui estão minhas nftables
regras:
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
ct state {established, related} accept
iifname lo accept
iifname cbr0 accept
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
}
chain forward {
type filter hook forward priority 0; policy accept;
}
chain output {
type filter hook output priority 0;
}
}
table ip filter {
chain forward {
type filter hook forward priority 0; policy drop;
oifname enp6s0 iifname cbr0 accept
iifname enp6s0 oifname cbr0 ct state related, established accept
# Webproxy
iifname enp6s0 oifname cbr0 tcp dport 80 accept
iifname enp6s0 oifname cbr0 udp dport 80 accept
iifname enp6s0 oifname cbr0 tcp dport 443 accept
iifname enp6s0 oifname cbr0 udp dport 443 accept
}
}
table ip nat {
chain postrouting {
type nat hook postrouting priority 100; policy accept;
}
chain prerouting {
type nat hook prerouting priority -100; policy accept;
# Webproxy
iifname enp6s0 tcp dport 80 dnat to 10.10.0.1:80
iifname enp6s0 udp dport 80 dnat to 10.10.0.1:80
iifname enp6s0 tcp dport 443 dnat to 10.10.0.1:443
iifname enp6s0 udp dport 443 dnat to 10.10.0.1:443
}
}
Agora o problema é: NAT hairpin. Tenho vários contêineres hospedando sites e às vezes acontece que alguns deles precisam se comunicar com outros contêineres usando nomes de domínio. Quando eles executam uma consulta DNS para esses domínios, eles obtêm o IP do host e a comunicação falha:
Como posso corrigir esta situação sem recorrer a hacks de DNS ? Existe uma maneira de configurar nftables
o encaminhamento de solicitação internamente enquanto se tem um IP dinâmico? Como o iifname
acima brinca com isso?
Obrigado.