Manipulação sem rota estática utilizando CONNMARK / CONNTRACK

1. Manipulação sem rota estática utilizando CONNMARK / CONNTRACK

Douglas Junior
Cod3r

(usa Outra)

Enviado em 05/01/2015 - 14:35h

Boa tarde,

Andei pesquisando pelo pai google e pela busca no site, encontrei alguns tópicos onde nosso amigo lejoso falou e demonstrou regras do connmark ( http://www.vivaolinux.com.br/topico/netfilter-iptables/Redirecionamentos-usando-2-links ) para fazer um esquema de redirecionamento interessante...

Vamos la para o que eu preciso e qual é a dúvida para realizar o que preciso...

1° Dúvida que preciso tirar:
- Para utilizar o connmark em meu script de firewall, preciso ter a ferramenta conntrack-tools? É interessante ter? Necessário? Pelo que pesquisei parece ter uma sintaxe conntrack -L onde visualizo as marcações da conexão, as coisas que são feitas pelo connmark, etc...

2° Necessidade da aplicação:
- Utilizei o mark para marcar os pacotes que vem de um IPFORNECEDOR nas portas 1,2,3,4 para nosso LINK1 na TABELA1 (caso funcionasse, aplicaria a mesma regra com negação das portas 1,2,3,4 para aplicar todas as outras portas para navegar pelo LINK2 na TABELA2)

Resultado: No comando "ip rule show" mostra o fwmark e a prio adicionada e cada vez que executo meu firewall, adiciona ali novamente... Isso também é preocupante pois caso o link caia, eu preciso direcionar para o outro link e então desmarcar aqueles pacotes... Para cada vez que executo o fw, precisei desmarcar x vezes.

E... Pelo que andei lendo, o mark também não irá servir pois ele não marca a saída do pacote.

E a implantação do mark seria para que eu pudesse remover a rota estática e trafegar os pacotes sem ela. Não consegui tráfego dos pacotes e não tive nenhum erro de sintaxe, aparentemente. Foi onde comecei a pesquisar e segundo nosso amigo lejoso, o mark deixaria de desejar na hora do retorno, podendo ser necessário utilizar o CONNMARK.

Resumidamente... A dúvida n° 2...
Com o connmark eu consigo trafegar os pacotes que vem do meu IPFORNECEDOR nas portas 1,2,3,4 para o meu LINK1 sem utilizar uma rota estática? Pois preciso ter este controle sem a rota... É possível? Caso não seja possível, alguma idéia de como realizar este esquema?




  


2. Re: Manipulação sem rota estática utilizando CONNMARK / CONNTRACK

Douglas Junior
Cod3r

(usa Outra)

Enviado em 07/01/2015 - 07:30h

Bom dia,

Algum samurai por ai ?


3. Re: Manipulação sem rota estática utilizando CONNMARK / CONNTRACK

leonardo Souza
lejoso

(usa Debian)

Enviado em 09/01/2015 - 18:47h

Boa Tarde, seguem respostas:

1° Dúvida que preciso tirar:
- Para utilizar o connmark em meu script de firewall, preciso ter a ferramenta conntrack-tools? É interessante ter? Necessário? Pelo que pesquisei parece ter uma sintaxe conntrack -L onde visualizo as marcações da conexão, as coisas que são feitas pelo connmark, etc...

R: Para utilizar o connmark não é necessário a ferramenta conntrack-tools. Porém é interessante essa ferramenta, principamente listagem das conexões e limpeza da tabela do conntrack.
O conntrack é uma tabela alocada em memória que "guarda" todas as informações das conexões existentes. O connmark ou mark é uma marcação que é realizada através do iptables. A diferença é que o mark marca cada pacote individualmente, enquando o connmark marca uma conexão como um todo.
############################################################################################################
2° Necessidade da aplicação:
- Utilizei o mark para marcar os pacotes que vem de um IPFORNECEDOR nas portas 1,2,3,4 para nosso LINK1 na TABELA1 (caso funcionasse, aplicaria a mesma regra com negação das portas 1,2,3,4 para aplicar todas as outras portas para navegar pelo LINK2 na TABELA2)

Resultado: No comando "ip rule show" mostra o fwmark e a prio adicionada e cada vez que executo meu firewall, adiciona ali novamente... Isso também é preocupante pois caso o link caia, eu preciso direcionar para o outro link e então desmarcar aqueles pacotes... Para cada vez que executo o fw, precisei desmarcar x vezes.

R: No seu script de firewall primeiro tem que limpar as tabelas tanto do iptables como no ip rule para que não haja as duplicações das regras.
Sempre comece o script limpando as tabelas:

iptables -F
iptables -t nat -F
iptables -t raw -F
iptables -t mangle -F

Também limpe as regras que você coloca no ip rule. Toda regra que cadatsrar, você deve fazer a mesma regra acima para remover antes.

exemplo:

ip rule del fwmark 'marcação' lookup 'table_x'
ip rule add fwmark 'marcação' lookup 'table_x'

Porém quando o link que está marcado para tal conexão sair por ele, caso o mesmo esteja fora, a conexão não funcionará e ficará morta, já que o iptables e a tabela de roteamento não checam se os link de saída está no ar.
Trazendo pro mundo real, seria como você dizer que pra chegar a tal lugar, a pessoa deve ir pela estrada X. Porém caso essa estrada X esteja bloqueada, você não terá como seguir. A pessoa que te passou a informação apenas sabe o caminho pra onde você deve ir, mas ele não sabe que a estrada está bloqueada.
Nesse caso você deve usar um script para fazer estes testes de link, e os mesmos devem remover ou adicionar as regras de acordo com a funcionalidae do link.

###############################################################################################################

E... Pelo que andei lendo, o mark também não irá servir pois ele não marca a saída do pacote.

E a implantação do mark seria para que eu pudesse remover a rota estática e trafegar os pacotes sem ela. Não consegui tráfego dos pacotes e não tive nenhum erro de sintaxe, aparentemente. Foi onde comecei a pesquisar e segundo nosso amigo lejoso, o mark deixaria de desejar na hora do retorno, podendo ser necessário utilizar o CONNMARK.

Resumidamente... A dúvida n° 2...
Com o connmark eu consigo trafegar os pacotes que vem do meu IPFORNECEDOR nas portas 1,2,3,4 para o meu LINK1 sem utilizar uma rota estática? Pois preciso ter este controle sem a rota... É possível? Caso não seja possível, alguma idéia de como realizar este esquema?

R: Tanto o mark como connmark não trabalham com rota. Eles apenas fazem marcações que em conjunto com o ip route podem dar alternativas de rotas. Mas na essencia, quem determina por onde o pacote sai não é o iptables, e sim a tabela de roteamento.
Pra fazer do jeito dinâmico, pode usar um script que checa e adiciona/remove marcações quando um link está fora ou volta pro ar, ou você pode dar uma pesquisada sobre routing daemons, que são serviços que trabalham com protocolos de roteamento dinâmicos, e que trabalahm com checagens, custo de links, etc.

Att,

Lejoso


4. rever alguns testes

Douglas Junior
cod3r

(usa Outra)

Enviado em 12/01/2015 - 06:52h

Bom dia grande samurai lejoso!

Muito boa explicação, então minha principal dúvida foi respondida que era ter a certeza de que apenas utilizando as devidas regras do connmark, excluindo a minha rota estática, vou conseguir sim trafegar os pacotes, certo? Porque eu estive pensando apesar de toda pesquisa... Que deveria haver algo para manipular a tabela de roteamento para conseguir essa comunicação e... Dai surgiu a dúvida de que o connmark não faria isso e talvez eu estaria tentando fazer algo que nunca daria certo sem ter uma rota... :D

Ainda é muito abstrato essa parte para mim, faço as regras e de acordo com a sintaxe e a "lógica", apresenta-se funcionar perfeitamente, não acusa nenhum erro, nas verificações as marcações estão tudo certo(preciso da conntrack para ver mais) e mesmo assim não consigo a comunicação.

Estarei revendo as regras e realizando alguns testes, postarei o resultado aqui o mais breve possível do que estou utilizando para que fique mais claro.

Muito obrigado pela explicação lejoso.
Abraço.


5. Re: Manipulação sem rota estática utilizando CONNMARK / CONNTRACK

Douglas Junior
cod3r

(usa Outra)

Enviado em 12/01/2015 - 09:30h

Bom dia a todos,

Bem, estou utilizando basicamente as seguintes regras (mudo toda hora, havia outras removi, troquei, tirei, adicionei). Entendendo melhor da necessidade a ser aplicada, seria o seguinte...

Mais abaixo em CONNMARK, utilizo o --restore-mark que vai adicionar marca de conexão no pacote quando ele chega, aplico a marcação e por último adiciono o --save-mark para colocar marca de conexão no pacote quando ele sai.

Antes disso, tenho aqui um prerouting com a função de jogar (DNAT) para meu servidor interno os pacotes nas portas e link/interface que preciso.
Sinto que está faltando algo... Creio estar com a marcação de entrada, mas parece que estou preso na saída, mas o caminho seria mais ou menos por aqui?

Uma observação... Teria uma certa ordem ou relevância adicionar algum tipo de regra antes ou depois no meu script?

# MARK - do link EMB no 192.168.1.4
iptables -t nat -A PREROUTING -i int1 -p tcp -m multiport --dport 101,102,103,104 -j DNAT --to-destination 192.168.1.4 (ex. meu ip servidor interno)
iptables -t mangle -A PREROUTING -p tcp -s 192.168.1.4 -m multiport --dport 101,102,103,104 -j MARK --set-mark 1

####################
#### CONNMARK #####
ip rule del prio 3 fwmark 1 table 2
ip rule add prio 3 fwmark 1 table 2

iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A POSTROUTING -m mark ! --mark 0 -j ACCEPT
iptables -t mangle -A POSTROUTING -p tcp -m multiport --dport 101,102,103,104 -j MARK --set-mark 1
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark



6. Re: Manipulação sem rota estática utilizando CONNMARK / CONNTRACK

Ricardo Vasconcellos
qxada07

(usa Slackware)

Enviado em 07/10/2016 - 12:36h

Cod3r,

Sugiro você fazer o seguinte.

Você deverá criar 02 arquivos de firewall. O primeiro (rc.firewall_lnk1) faz com que a internet saia pelo link 1, depois você cria outro arquivo (rc.firewall_lnk2) para sair pelo segundo link de internet.

É necessário que você realize o teste nos scripts manualmente, tipo... ./rc.firewall.lnk1 e a internet irá funcionar pelo link 1 e depois ./rc.firewall_lnk2 a internet deverá sair pelo link 2... Os scripts deverão limpar todas as tabelas no inicio do arquivo e depois criar todas as regras, para que tenha regras duplicadas.

Até aí blz... Depois que este teste estiver ok daí você executa o script abaixo que criei para você... Este script é apenas uma validação se o link de internet esta funcionando direitinho.

Cria o arquivo rc.valida_lnk com o conteúdo abaixo:

############## Arquivo rc.valida_lnk ############
#/bin/bash

while true
do
TST=`ping 8.8.8.8 -I eth1 -c 5 | grep received | awk '{print $4}'`
if [ "$TST" -eq 0];then
echo "Link 1 Down"
### Aqui fica o script para ativar o link 2 ###
exit
fi
sleep 5
echo "Link 1 OK"
done
exit
################# Fim do arquivo #############

Explicação sobre o conteúdo do arquivo

_ Ele cria um loop até o link 1 cair;
_ Variável $TST - Realiza um ping para o DNS do Google que geralmente sempre irá responde ping, onde o pacote ICMP irá sair pela interface do link 1 (-I SUA_INTERFACE_LINK1) realizando um filtro pela palavra received que é quantos pacotes recebeu (irá trazer a linha toda), realiza outro filtro somente pela quantidade recebida (irá trazer somente o valor);
_ Depois eu realizo uma validação onde se o valor de pacotes recebidos for igual a 0 (ou seja se o link estiver fora) daí eu executo o script para ativar o link 2 e depois eu paro de realizar a validação;

Este script é bem simples (Você pode melhorar ele)... Depois que você abrir um chamado junto a operadora local e o problema for solucionado daí vc executa manualmente o arquivo para ativar o link 1 novamente....

Uma sugestão:

Como o arquivo de validação irá parar de funcionar quando o link 1 cair, sugiro você colocar no final do script que ativa o link 1 a linha para iniciar o script de validação, mas você deverá parar ele antes de startar ele novamente...

Ex:
killall -9 rc.valida_lnk
./rc.valida_lnk

Tem que ser assim para que ele não fique sendo executado em duplicidade.

Espero ter ajudado


Att.

Ricardo Vasconcellos
Analista TI Sênior






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts