+ Responder ao Tópico



  1. #1

    Lightbulb Conexões com 2 links diferentes no mesmo servidor.

    Galera, boa tarde!

    Vendo os fóruns sobre firewall, sempre vi as dúvidas da galera a respeito de como fazer e receber conexões em um servidor com 2 links. Depois de muito tempo de pesquisa sobre roteamento, iproute2 e iptables finalmente cheguei a uma solução certa e eficaz.

    Eu uso um servidor com 2 links sendo que o link 1 é para a internet de uso geral e o link 2 é para receber conexões no PostgreSQL, então, para ficar mais claro, usarei as portas do PostgreSQL para este exemplo.

    Endereços:

    Link 1: PPPoA modo router, endereço 10.1.1.1
    Link 2: PPPoE modo router, endereço 10.1.1.2

    Mãos a obra!

    Edite o arquivo /etc/iproute2/rt_tables, com a estrutura inicial mais ou menos assim:

    # reserved values
    #
    255 local
    254 main
    253 default
    0 unspec
    #
    #
    # local
    #
    #1 inr.ruhep

    Adicione uma tabela com valor, por exemplo, 200, ao final do arquivo. No meu caso:

    # reserved values
    #
    255 local
    254 main
    253 default
    0 unspec
    #
    #
    # local
    #
    #1 inr.ruhep
    200 postgres

    Pronto, confira se a tabela foi aceita com o comando:

    ip route show table postgres

    Se voltar ao prompt, deu certo hehehe

    Como queremos o link 1 como principal e o link 2 como secundário, executaremos os seguintes comandos: (minha faixa de rede interna é 192.168.1.0/24)

    ip route add 192.168.1.0/24 dev eth0 table postgres
    ip route add 10.1.1.0/24 dev eth1 table postgres

    Adicionada a faixa de ips para a tabela. O 192... é da rede interna, o 10... é da placa de rede em que os modems estão ligados.

    Agora precisamos indicar o gateway para essa tabela:

    ip route add default dev eth1 via 10.1.1.2 table postgres

    Ok, feito isso precisamos efetivar as regras:

    ip route flush cached

    Pronto. Não se esqueça que essas regras são voláteis. Crie um script para que quando reiniciar você não perca as configurações.

    Agora a famosa marcação com a tabela mangle do iptables. É aqui que mora o problema. Se não marcarmos o tráfego de entrada e saída não adianta de nada marcar os pacotes.

    iptables -t mangle -A POSTROUTING -p tcp --sport 5432 -s 192.168.1.102/32 -j MARK --set-mark 1
    iptables -t mangle -A PREROUTING -p tcp --sport 5432 -s 192.168.1.102/32 -j MARK --set-mark 1
    iptables -t mangle -A PREROUTING -p tcp --dport 5432 -j MARK --set-mark 1
    iptables -t mangle -A INPUT -p tcp --dport 5432 -j MARK --set-mark 1
    iptables -t mangle -A OUTPUT -p tcp --sport 5432 -s 192.168.1.102/32 -j MARK --set-mark 1
    iptables -t mangle -A FORWARD -p tcp --sport 5432 -s 192.168.1.102/32 -j MARK --set-mark 1
    iptables -t mangle -A FORWARD -p tcp --dport 5432 -j MARK --set-mark 1

    Se reparar, o POSTROUTING e o PREROUTING estão marcando os pacotes de saída da porta de origem 5432. Se marcar de destino, muito provavelmente não vai marcar nada pois dificilmente o cliente vai conectar com a mesma porta do servidor, bom, não exige muitas explicações.

    A terceira e a quarta linhas informam a marcação em pacotes de entrada com destino à porta 5432. Não indiquei IP de destino pois não precisei.

    A quinta e a sexta linha informam o transporte de pacotes da porta de origem 5432 com IP originário com destino a qualquer porta e endereço. A sétima informa o transporte para a porta de destino, ou seja, conexões vindas da internet para o nosso servidor na porta 5432. Não coloquei também IP de destino pois minhas conexões PostgreSQL na estrutura onde se encontra o servidor são feitas somente no servidor local e algumas filiais conectam da internet nele. Não temos nenhum outro programa que conecte em servidores PostgreSQL fora da nossa rede, dispensando qualquer mudança nas regras para que as conexões de saída do restante dos IPs locais se façam pelo link 1.

    Após marcar todos os pacotes que você queira executar entrada e saída, informe ao iproute2 que essa marcação vai entrar e sair pela tabela em que o link 2 está respondendo:

    ip rule add fwmark 1 lookup postgres

    Isso faz com que todos os pacotes que o iptables marca como 1 procurem a tabela de roteamento postgres.

    Depois disso efetive as regras novamente:

    ip route flush cached

    É teta hehehe, funciona 100% pois estou com esse servidor PostgreSQL aceitando conexões pelo link 2 e o restante dos serviços dele rodando no link 1.

    Espero ter ajudado, fucei muito atrás disso e não encontrei nada além de má vontade da maioria dos usuários e respostas bem óbvias e nada funcionais de vários usuários! Vamos nos ajudar galera!!!!

    Abraços!!!
    Última edição por glaucioklipel; 27-11-2007 às 14:58.

  2. #2

    Padrão

    Olá Glaucio,

    Achei bem interessante da forma que você fez o seu balanceamento, te confesso que penei por muito tempo a procura da forma correta de fazer o balanceamento com agregação dos mesmos, mas acabei desistindo, as unicas vezes que consegui, tinha momentos que os links ficavam com um lentidão terrível, ai deixei de lado e resolvi deixar apenas como você fez, mas no meu caso tenho 4 links conectados em uma placa que possui os respectivos alias. E utilizando o marcação de pacotes eu distribuo os links pelas diversas redes abaixo do servidor. Meus parabéns pela iniciativa e pelo contribuição.

  3. #3

    Padrão

    Citação Postado originalmente por standart Ver Post
    Olá Glaucio,

    ...as unicas vezes que consegui, tinha momentos que os links ficavam com um lentidão terrível...
    Pois é cara, na primeira vez que eu testei deu lentidão mesmo! Depois adicionei a INPUT e também fiz um TOS de entrada e saída para os serviços e foi que é uma bala! Tá funcionando 100% hehehehe

    iptables -t mangle -A PREROUTING -j TOS --set-tos Minimize-Delay -p tcp --dport 5432
    iptables -t mangle -A OUTPUT -j TOS --set-tos Minimize-Delay -p tcp --sport 5432
    iptables -t mangle -A POSTROUTING -j TOS --set-tos Minimize-Delay -p tcp --sport 5432
    iptables -t mangle -A INPUT -j TOS --set-tos Minimize-Delay -p tcp --dport 5432

    Assim funcionou sem oscilações e sem complicações pro servidor se achar hehehe

    Obrigado e um abraço!
    Última edição por glaucioklipel; 27-11-2007 às 16:24.