Marcando Pacotes com DNAT [RESOLVIDO]

1. Marcando Pacotes com DNAT [RESOLVIDO]

Victor Gouveia de Andrade
serverti

(usa CentOS)

Enviado em 07/01/2014 - 19:53h

Pessoal tenho a seguinte realidade possuo 4 links consecutivamente 4 tabelas de roteamento todas configurada e funcionando perfeitamente

consigo marcar os pacotes e decedir em qual tabela eles vão sair

o problema é o DNAT, quando eu preciso redirecionar um pacote para outro computador da minha rede
quando eu logo os pacotes do prerouting e do postrouting eles estão marcados corretamente.... porem os pacotes que retornam do computador que possui o serviços ele não volta marcado....

eu ja utilizei todos os comandos de marcar conexões porem não consigo

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i eth0 -j CONNMARK --set-mark 1
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to--destination 192.168.7.10:8080

ele marca os pacotes corretamente que entra pelo etho mas não marcar os pacotes que retorna do ip 192.168.7.10...

analizando os logs eu percebi que o pacotes que retorna do ip 192.168.7.10 estão saindo pelo gw padrão do linux....

quando eu marco os pacotes que vem do 192.168.7.10 com 1 ai minha aplicação funciona corretamente o problema e que eu possuo 4 link e eu quero que funciona em todos.....

iptables -t mangle -A PREROUTING -s 192.168.7.10 -j MARK --set-mark 1



  


2. MELHOR RESPOSTA

leonardo Souza
lejoso

(usa Debian)

Enviado em 08/01/2014 - 13:54h

iptables -t mangle -I PREROUTING -p tcp --dport 8080 -i eth_oi -j CONNMARK --set-mark 0x2
iptables -t mangle -I PREROUTING -m connmark --mark 0x2 ! -i eth_oi -j MARK --set-mark 0x2

iptables -t mangle -I PREROUTING -p tcp --dport 8080 -i eth_oi2 -j CONNMARK --set-mark 0x4
iptables -t mangle -I PREROUTING -m connmark --mark 0x4 ! -i eth_oi2 -j MARK --set-mark 0x4

iptables -t mangle -I PREROUTING -p tcp --dport 8080 -i eth_oi1 -j CONNMARK --set-mark 0x3
iptables -t mangle -I PREROUTING -m connmark --mark 0x3 ! -i eth_oi1 -j MARK --set-mark 0x3

iptables -t mangle -I PREROUTING -p tcp --dport 8080 -i eth_embratel -j CONNMARK --set-mark 0x1
iptables -t mangle -I PREROUTING -m connmark --mark 0x1 ! -i eth_embratel -j MARK --set-mark 0x1


Obs:

- Corrigir apenas o nome das interfaces com as interfaces corretas do seu servidor (-i ethx);
- O link default não precisa de marcações, pois o retorno dos pacotes já sairia por eles. Como você tem 4 link, apenas 3 conjuntos (6 regras no total) seriam necessários. Mas isso é opcional, embora não acho que se colocar as marcações também pro link default dará problemas;
- Essas regras acima serviriam apenas para o DNAT da porta 8080. Dessa forma, o conjunto de 6 regras teria que ser criado para cada regra de DNAT, caso você tenha mais regras. Você pode tentar tirar a condição "-p tcp --dport 8080", ai as regras ficariam genéricas e com isso já valeria para todos os Dnat, porém tem que ficar atento se não acarretará problemas com outras conexões. A princípio acho que não dá problemas, mas é bom ficar atento. Eu particularmente evito regras bem genéricas, pois são mais sucetíveis a erros, mas é questão de colocar e testar.

Att,

Lejoso


3. Re: Marcando Pacotes com DNAT [RESOLVIDO]

leonardo Souza
lejoso

(usa Debian)

Enviado em 07/01/2014 - 20:54h

Você terá que trabalhar com a adição de tabelas de roteamento.
No arquivo /etc/iproute2/rt_tables, você já tem alguma tabela adicionada sem ser as padrões? Caso não, esse seria o primeiro passo. Como você tem 4 links, 3 tabelas adicionais teriam de ser adicionadas.
Depois você tem que criar regras de ip rule list "amarrando" as marcações que serão feitas no iptables (alvo MARK)com as tabelas criadas no arquivo rt_tables.
Além disso, nessas tabelas adicionais terão que ser adicionadas rotas default, uma para cada link.
É um pouco trabalhoso isso, mas não é difícil.
Eu tenho um material que estou escrevendo, mas ainda não concluí por falta de tempo. Mas essa parte de iproute acho que pode lhe ajudar mesmo aindo não estando completo. Me fala seu e-mail que lhe mando.



4. Re: Marcando Pacotes com DNAT [RESOLVIDO]

leonardo Souza
lejoso

(usa Debian)

Enviado em 07/01/2014 - 21:20h

Cola o seu ip rule list e as rotas das tabelas adicionais por favor.


5. ip rule list

Victor Gouveia de Andrade
serverti

(usa CentOS)

Enviado em 08/01/2014 - 11:21h



0: from all lookup local
32758: from all fwmark 0x3 lookup oi1
32759: from all fwmark 0x1 lookup embratel
32760: from all fwmark 0x2 lookup oi
32761: from all fwmark 0x4 lookup oi2
32762: from 10.1.1.43 lookup oi
32763: from 189.16.XXX.XXX lookup embratel
32764: from 192.168.10.100 lookup oi1
32765: from 192.168.0.101 lookup oi2
32766: from all lookup main
32767: from all lookup default



6. Re: Marcando Pacotes com DNAT [RESOLVIDO]

Victor Gouveia de Andrade
serverti

(usa CentOS)

Enviado em 08/01/2014 - 11:23h

lejoso escreveu:

Cola o seu ip rule list e as rotas das tabelas adicionais por favor.



os serviços hospedados no proprio servidor esta respondendo em todos os ip so o que é redierecionado que quando retorna.... tenta sair pelo gw default do servidor


7. Re: Marcando Pacotes com DNAT [RESOLVIDO]

Victor Gouveia de Andrade
serverti

(usa CentOS)

Enviado em 08/01/2014 - 11:44h

lejoso escreveu:

Você terá que trabalhar com a adição de tabelas de roteamento.
No arquivo /etc/iproute2/rt_tables, você já tem alguma tabela adicionada sem ser as padrões? Caso não, esse seria o primeiro passo. Como você tem 4 links, 3 tabelas adicionais teriam de ser adicionadas.
Depois você tem que criar regras de ip rule list "amarrando" as marcações que serão feitas no iptables (alvo MARK)com as tabelas criadas no arquivo rt_tables.
Além disso, nessas tabelas adicionais terão que ser adicionadas rotas default, uma para cada link.
É um pouco trabalhoso isso, mas não é difícil.
Eu tenho um material que estou escrevendo, mas ainda não concluí por falta de tempo. Mas essa parte de iproute acho que pode lhe ajudar mesmo aindo não estando completo. Me fala seu e-mail que lhe mando.


eu ja estou trabalhando... tenho 4 tabelas adcionais uma para cada link..... ja consegui marcar os pacotes... o problema é o retorno do DNAT.... que vai usar a rota default da tabela dele....
eu preciso achar um jeito de que o sistema lembre que aquela resposta tem que sair pela interface que a chamou.....

exemplo

o pacote chega na eth0 imediatamente ele é marcado como 1... o router redireciona esse pacote (DNAT) para um computador da rede... o computador da rede responde o pacote para o meu servidor a resposta vem com MARK 0.... meu servidor não consegue lembrar que esse pacote deve retornar a interface eth0 e ele discarta ou tenta responder pelo gw padrão....


8. Re: Marcando Pacotes com DNAT [RESOLVIDO]

Victor Gouveia de Andrade
serverti

(usa CentOS)

Enviado em 08/01/2014 - 14:27h

lejoso escreveu:

iptables -t mangle -I PREROUTING -p tcp --dport 8080 -i eth_oi -j CONNMARK --set-mark 0x2
iptables -t mangle -I PREROUTING -m connmark --mark 0x2 ! -i eth_oi -j MARK --set-mark 0x2

iptables -t mangle -I PREROUTING -p tcp --dport 8080 -i eth_oi2 -j CONNMARK --set-mark 0x4
iptables -t mangle -I PREROUTING -m connmark --mark 0x4 ! -i eth_oi2 -j MARK --set-mark 0x4

iptables -t mangle -I PREROUTING -p tcp --dport 8080 -i eth_oi1 -j CONNMARK --set-mark 0x3
iptables -t mangle -I PREROUTING -m connmark --mark 0x3 ! -i eth_oi1 -j MARK --set-mark 0x3

iptables -t mangle -I PREROUTING -p tcp --dport 8080 -i eth_embratel -j CONNMARK --set-mark 0x1
iptables -t mangle -I PREROUTING -m connmark --mark 0x1 ! -i eth_embratel -j MARK --set-mark 0x1


Obs:

- Corrigir apenas o nome das interfaces com as interfaces corretas do seu servidor (-i ethx);
- O link default não precisa de marcações, pois o retorno dos pacotes já sairia por eles. Como você tem 4 link, apenas 3 conjuntos (6 regras no total) seriam necessários. Mas isso é opcional, embora não acho que se colocar as marcações também pro link default dará problemas;
- Essas regras acima serviriam apenas para o DNAT da porta 8080. Dessa forma, o conjunto de 6 regras teria que ser criado para cada regra de DNAT, caso você tenha mais regras. Você pode tentar tirar a condição "-p tcp --dport 8080", ai as regras ficariam genéricas e com isso já valeria para todos os Dnat, porém tem que ficar atento se não acarretará problemas com outras conexões. A princípio acho que não dá problemas, mas é bom ficar atento. Eu particularmente evito regras bem genéricas, pois são mais sucetíveis a erros, mas é questão de colocar e testar.

Att,

Lejoso



OK vou testar....

so não entendi o que a segunda linha de cada marcação esta fazendo...






9. Re: Marcando Pacotes com DNAT [RESOLVIDO]

leonardo Souza
lejoso

(usa Debian)

Enviado em 08/01/2014 - 14:47h

A segunda regra faz a marcação do pacote para ser lido pelas regras do ip rule list (fwmark)

CONNMARK -> Marca a Conexão (o valor é adicionado no conntrack -> conntrack -L)
MARK -> Marca os pacotes individualmente. Quando os pacotes saem do firewall, essa marca é "perdida".

Aquelas marcações das regras do FWMARK são as que são efetuadas pelo alvo MARK no iptables.

Resumindo

Primeira regra: Marca a conexão (todos pacotes relacionados a conexão) assim que entrar no firewall através da interface especificada.
Segunda regra: Marca os pacotes individualmente com o alvo MARK para serem validados nas regras do fwmark do ip rule list. Perceba que a condição para essa regra ser verdadeira é que a conexão deverá estar com determinada marca (-m connmark --mark 0x1)




10. RESOLVIDO

Victor Gouveia de Andrade
serverti

(usa CentOS)

Enviado em 09/01/2014 - 10:38h

lejoso escreveu:

A segunda regra faz a marcação do pacote para ser lido pelas regras do ip rule list (fwmark)

CONNMARK -> Marca a Conexão (o valor é adicionado no conntrack -> conntrack -L)
MARK -> Marca os pacotes individualmente. Quando os pacotes saem do firewall, essa marca é "perdida".

Aquelas marcações das regras do FWMARK são as que são efetuadas pelo alvo MARK no iptables.

Resumindo

Primeira regra: Marca a conexão (todos pacotes relacionados a conexão) assim que entrar no firewall através da interface especificada.
Segunda regra: Marca os pacotes individualmente com o alvo MARK para serem validados nas regras do fwmark do ip rule list. Perceba que a condição para essa regra ser verdadeira é que a conexão deverá estar com determinada marca (-m connmark --mark 0x1)



Amigo a função funcionou corretamente... eu tive que adicionar mais algumas regras
192.168.5.1 -> ip do meu servidor

iptables -t mangle -A PREROUTING -s 192.168.5.1 -j ACCEPT
iptables -t mangle -A PREROUTING -d 192.168.5.1 -j ACCEPT


iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 8080 -j LOG --log-prefix "PACOTES ETH1"
iptables -t nat -A PREROUTING -s 192.168.5.32 -p tcp --sport 8080 -j LOG --log-prefix "RETORNO"

iptables -t mangle -I PREROUTING -p tcp --dport 8080 -i eth1 -j CONNMARK --set-mark 0x3
iptables -t mangle -I PREROUTING -m connmark --mark 0x3 ! -i eth1 -j MARK --set-mark 0x3

iptables -t mangle -I PREROUTING -p tcp --dport 8080 -i eth0 -j CONNMARK --set-mark 0x1
iptables -t mangle -I PREROUTING -m connmark --mark 0x1 ! -i eth0 -j MARK --set-mark 0x1



iptables -t mangle -A PREROUTING -i eth3 -s 192.168.5.0/24 -j MARK --set-mark 4


iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.5.32:8080
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 8080 -j DNAT --to-destination 192.168.5.32:8080



eth3 interface da minha rede
iptables -t nat -A POSTROUTING -o eth3 -j MASQUERADE



obrigado valeu






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts