Encaminhamento de porta Iptables com restrições em alguns

Encaminhamento de porta Iptables com restrições em alguns

Eu tenho um conjunto de serviços nos quais gostaria de definir ACLs (lista de permissões) baseadas em IP para um, mas não para o outro. Os problemas parecem aparecer porque os serviços são executados internamente na mesma porta (porta 80), mas eu uso portas diferentes no gateway para acessá-los.

Porta 8088 no Gateway -> Porta 80 em 10.0.0.A (com lista de permissões de IP)
Porta 80 no Gateway -> Porta 80 em 10.0.0.B

E posso fazer isso funcionar com tudo aberto com as seguintes regras:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 10.0.0.B
iptables -A FORWARD -p tcp -i eth0 --dport 80 -j ACEITAR

A questão é que a regra FORWARD ACCEPT cobre ambas as regras nat, pois parecem ser baseadas na porta de destino (--dport 80), em vez da porta de entrada no gateway (80 vs 8088).

Não consigo descobrir como reescrever a regra FORWARD em duas regras separadas para que eu possa ter um comportamento diferente para conexões que chegam ao gateway em 80 vs 8088.

Informação adicional:

lsb_release -d
Descrição: Debian GNU/Linux 7.5 (chiado)
iptables --versão
iptables v1.4.14

1ª tentativa de solução Consegui desmembrar uma cadeia e executar o roteamento lá, mas não consigo adicionar a linha ACL (rejeitar) devido à seguinte mensagem de erro:

x_tables: ip_tables: REJECT target: válido apenas na tabela de filtros, não nat

Aqui está o que eu coloquei:

iptables -t nat -N Lista de permissões
iptables -t nat -A Lista de permissões -p tcp -j DNAT --to 10.0.0.A:80
iptables -t nat -A Lista de permissões -s <whatsmyip.org> -j RETURN
iptables -t nat -A Lista de permissões -j REJEITAR
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j Lista de permissões

Tudo funciona bem até a linha 4, onde o REJECT dentro do nat falha. Se eu comentar a linha REJECT, posso confirmar que o restante da lógica funciona e a porta fica aberta porque nada é rejeitado.

Próxima tentativa de solução Parece que estou tropeçando no problema original ao trabalhar com uma cadeia separada configurada corretamente. A regra PREROUTING que altera a porta logo no início ainda parece causar um problema com a tentativa de ACL não-nat. As regras da ACL não têm efeito e a porta está aberta à liberdade.

iptables -N Lista de permissões
iptables -A Lista de permissões -s <whatsmyip.org> -j RETURN
iptables -A Lista de permissões -j REJEITAR
iptables -A INPUT -i eth0 -p tcp --dport 8088 -j Lista de permissões
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A:80

Tentativa de solução nº 3 Tentei configurar a lista de permissões primeiro e, em seguida, tentei o redirecionamento de porta após a resolução da lista de permissões. Embora as regras sejam carregadas, elas não têm o efeito pretendido, pois o tráfego não atinge o destino pretendido a partir do IP na lista de permissões. Embora eu não tenha 100% de certeza de qual é realmente o comportamento. Não sei dizer se o tráfego está sendo rejeitado no iptables ou talvez a conexão esteja sendo aceita e enviada para o destino na porta 8088 sem a alteração da porta? Não sei como verificar se o redirecionamento da porta está realmente sendo feito. Aqui estão as regras para esta tentativa:

iptables -N Lista de permissões
iptables -A Lista de permissões -s <whatsmyip.org> -j RETURN
iptables -A Lista de permissões -j REJEITAR
iptables -A INPUT -i eth0 -p tcp --dport 8088 -j Lista de permissões
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A
iptables -t nat -A SAÍDA -p tcp --dport 8088 -j REDIRECIONAR --to-ports 80

Status atual Não resolvido. Não tenho certeza se devo descobrir outra maneira de redirecionar a porta após a lista de permissões ou se há uma maneira fácil de determinar onde a solução atual está falhando (ela está encaminhando através de 8088 sem o redirecionamento 80 ou está simplesmente sendo bloqueado?)

Responder1

Mudar

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j DNAT --to 10.0.0.A:80

para pular para uma cadeia definida pelo usuário que implementa suas acls. Por exemplo,

iptables -t nat -N foo
iptables -t nat -A foo --source 192.168.0.0/24 -j RETURN
iptables -t nat -A foo -j REJECT

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8088 -j foo

Editar:

iptables -N foo
iptables -A foo --source 192.168.0.0/24 -j RETURN
iptables -A foo -j REJECT
iptables -A INPUT -i eth0 -p tcp --dport 8088 -j foo

Você projeta sua filtragem de pacotes ignorando completamente qualquer NAT que estiver fazendo.

informação relacionada