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!!!