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.