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