gateways, routers e redirecionamento de portas

Smig

Power Member
Ok, vou explicar o background para perceberem a ideia, isto vai demorar um bocado :P

Tenho um conjunto de aplicações em java que se ligam a um serviço num servidor remoto. O servidor está num ponto em que pode sair para a net por três routers diferentes. Então o que é que eu pensei, se na aplicação eu verificar a comunicação atravéz de cada router e a latência (redirecionando o tráfego dessa porta em cada router), posso fazer uma escolha inteligente do router mais "disponível" no momento, ou até dar essa possibilidade de escolha ao utilizador.

Fiz isso mas só obtia resultados com um dos routers. Depois de perder horas de volta dos outros 2 percebi que o prob não era dos routers que não respondiam, era o servidor que só respondia por um, a default gateway.

Deduzo que o problema seja o seguinte, realmente a aplicação comunica com todos os routers mas quando a ligação chega ao servidor, o servidor responde atravez da default gateway e apesar da resposta voltar ao pc de origem, ela é recusada por esta vir de um ip diferente. Basicamente o pc cliente tenta iniciar uma ligação a um ip e recebe uma resposta de outro ip que ele descarta.

Primeiro, acham que o problema é mesmo este?

Segundo, se acham que o problema é este, sabem de alguma maneira de contornar esta questão? O que precisava mesmo era de uma forma do servidor escolher a rota de saída dependendo da rota de entrada, ou qualquer coisa desse género. Não sei se tal coisa é possível...
 
Tudo depende de como a rede esta configurada.

Os routers estao todos na mesma rede ip? e em que rede ip esta o servidor?
Qual o ip da default gateway?
Da tua aplicacao java, para que ip estas a fazer a ligacao?
Que portas estas a usar?


Tens de te lembrar que o pessoal aqui nao e vidente.
Tenta la fornecer mais informacoes no proximo post.


Ok, vou explicar o background para perceberem a ideia, isto vai demorar um bocado :P

Tenho um conjunto de aplicações em java que se ligam a um serviço num servidor remoto. O servidor está num ponto em que pode sair para a net por três routers diferentes. Então o que é que eu pensei, se na aplicação eu verificar a comunicação atravéz de cada router e a latência (redirecionando o tráfego dessa porta em cada router), posso fazer uma escolha inteligente do router mais "disponível" no momento, ou até dar essa possibilidade de escolha ao utilizador.

Fiz isso mas só obtia resultados com um dos routers. Depois de perder horas de volta dos outros 2 percebi que o prob não era dos routers que não respondiam, era o servidor que só respondia por um, a default gateway.

Deduzo que o problema seja o seguinte, realmente a aplicação comunica com todos os routers mas quando a ligação chega ao servidor, o servidor responde atravez da default gateway e apesar da resposta voltar ao pc de origem, ela é recusada por esta vir de um ip diferente. Basicamente o pc cliente tenta iniciar uma ligação a um ip e recebe uma resposta de outro ip que ele descarta.

Primeiro, acham que o problema é mesmo este?

Segundo, se acham que o problema é este, sabem de alguma maneira de contornar esta questão? O que precisava mesmo era de uma forma do servidor escolher a rota de saída dependendo da rota de entrada, ou qualquer coisa desse género. Não sei se tal coisa é possível...
 
2 dos routers estão na mesma rede, o terceiro está noutra. O servidor tem ips nas 2 redes. As duas redes não estão separadas fisicamente, só foram criadas para limitar os broadcasts. Entre o servidor e os routers há um switch. A aplicação java usa os nomes de cada router como estão no nosso dns. A porta é a 1279 e o serviço é um MS SQL Server.

Não achei isto importante porque como referi em cima, o servidor comunica com os routers, os clientes comunicam com os routers, o nome é resolvido correctamente, o redirecionamento da porta no router é feito correctamente e a conecção é estabelecida correctamente... mas apenas se usar o router que está defenido como gateway no servidor.

Tou sem ideias... :(
 
Se o primeiro router com que te deparas fizer NAT de toda a rede atras dele entao nao deveras ter problemas, se fizeres a conexao directamente ao mesmo router.
Desta forma o ip para onde fazes ligacao e de onde recebes resposta e sempre o mesmo.
 
Ou não percebi ou isso não resolve o meu problema. A ideia era estudar a possibilidade de servir o serviço por 3 routers diferentes, cada um com a sua ligação à net e cada um com o seu ip. Todos fazem nat e não há nenhum que esteja 1º, estão todos ligados a um switch, tal como o servidor.
 
Eu estava a imaginar que tinhas 3 routers em "serie". Mas afinal estao em "paralelo".

Sendo assim, podes definir rotas estaticas para cada rede. Alias, teoricamente ja deveriam estar criadas por defeito.
A default gateway so e usada para comunicacoes a ip's de redes diferentes da nossa.

Se isto nao te ajudar, era bom colocares ai um diagrama da tua rede (com respectivos ip's - senao quiseres dar os reais inventa, mas mantem a mesma estrutura).
Lembra-te de colocar todos os routers (que tenhas conhecimento) por onde a ligacao possa passar.
 
Só para clarificar, os pcs cliente não estão em nenhuma rede e não estão ligados por vpn, estão "à solta" na net com ips denâmicos e por isso não posso criar rotas. O servidor tem então que escolher um caminho para lá chegar, que é a default gateway. Será mesmo impossível o que estou a tentar fazer?

Vou fazer um diagrama então, é capaz de ser mais fácil.
 
Boas,

Basicamente o que queres é ter uma aplicação cliente a ser servida pelo router com melhor desempenho no momento certo?

Deixa so fazer umas perguntinhas:

1º Se o objectivo é os clientes chegarem a aplicação eles comunicam so para um dos routers? ou podem estabelecer a ligação a qq um deles?

2º Os tres routers são uma necessidade? ou é so para ter varias ligações a net?

3º As aplicações foram criadas por vcs? podem alterar a vontade?

Caso a aplicação seja vossa o que achas do seguinte:

O cliente envia uma msg ao servidor, este reponde pela default gateway qual é o melhor router a usar.
O cliente recebe e liga-se ao servidor por esse router especifico indicando que este router é o que deve usar para devolver a resposta.

Pode ser uma sugestão parva pq não sei como funciona a aplicação nem o que podem fazer com ela
 
Última edição:
Basicamente o que queres é ter uma aplicação cliente a ser servida pelo router com melhor desempenho no momento certo?

Certíssimo!


1º Se o objectivo é os clientes chegarem a aplicação eles comunicam so para um dos routers? ou podem estabelecer a ligação a qq um deles?

A aplicação pode escolher qualquer um mas o servidor so responde pela default gateway.


2º Os tres routers são uma necessidade? ou é so para ter varias ligações a net?

Uma necessidade. Estamos sediados numa zona industrial remota onde nenhum ISP consegue ligações mais rápidas que 1-2 Mbs. Temos muita gente cá dentro a precisar de recursos da net, incluindo voip e temos muita gente lá fora a precisar de vários serviços de dentro. Era impossível fazer isto sem várias ligações. Na verdade temos mais de 3, só lancei este número porque foi com 3 que eu comecei a testar esta possibilidade.


3º As aplicações foram criadas por vcs? podem alterar a vontade?

Sim, são desenvolvidas por nós e podemos altera-las a vontade.


Caso a aplicação seja vossa o que achas do seguinte:

O cliente envia uma msg ao servidor, este reponde pela default gateway qual é o melhor router a usar.

É possível mas o que pensamos foi ao contrario que acho que seria mais simples, seria a aplicação cliente a verificar a latencia de todos os routers e a escolher o router que rsp mais rápido. Até podiamos deixar o utilizador escolher o router manualmente a partir de uma lista com as velocidades.


O cliente recebe e liga-se ao servidor por esse router especifico indicando que este router é o que deve usar para devolver a resposta.

Se eu soubesse fazer isso tinha o meu problema resolvido :)

Há alguma maneira de indicar ao servidor por onde deve responder?
 
E usar um router multi wan?

Pois, essa hipotese está em em cima da mesa há muito tempo mas não conheço muitas soluções dessas e isso já implica custos. Também, pelo que sei, nem todos os routers multi-wan resolvem este problema em particular mas realmente é mesmo dificil encontrar informação e distribuidores em Portugal.

Gosto deste por exemplo (http://www.peplink.com/products/balance-380/), é caro mas as funcionalidades são impressionantes.

Por software já estou a perder as esperanças. O meu problema é que o roteamento é feito com base no destino. Mesmo com várias gateways defenidas, ele vai escolher o caminho mais rápido para chegar ao destino. Eu precisava de uma solução que fizesse com que o roteamento no meu servidor passasse a ser baseado na origem e que registasse os hops pelo caminho fora para o servidor saber por onde enviar a resposta. A minha única esperança agora seria encontrar alguma aplicação 3rd party que fizesse qualquer coisa do género.

Se alguem tiver informação/experiencia nalguma solução por software/hardware que me ajude, agradeço :)
 
Se fizeres SNAT nos 3 routers consegues o que queres.
Ao fazeres SNAT, o servidor recebe a ligacao como se esta tivesse originado pelo router em si ao inves do cliente.
Claror que o router quando recebe a resposta, rescreve o header e envia ao cliente.


Fica aqui apenas um exemplo:

r1 - 10.0.0.1/24
r2 - 10.0.0.2/24
r3 - 10.100.100.1/24
servidor - 10.0.0.150/24 e 10.100.100.150/24
cliente - 192.168.1.60

Do cliente estableces ligacao a um dos routers. No router tens SNAT definido para a porta MySQL com forward para o ip no servidor da rede correspondente, ou seja, se te ligares ao r1 este ao receber ligacao na porta MySQL envia para o servidor no ip 10.0.0.150/24 mas com o seu proprio ip como o iriginario da ligacao (10.0.0.1/24).
Desta forma, para o servidor e o router que esta a estabelecer ligacao com ele e como tal responde-lhe directamente.
O router ao receber a resposta do servidor envia para o cliente. Este por sua vez responde ao router e por ai fora...
 
É isso mesmo! O problema é que os routers que temos aqui não fazem SNAT nas ligações vindas da WAN, só DNAT. Sei que no ISA há uma opção para isso, no linux também deve ser possível só com o iptables mas não queria ter um pc por ligação.

Vou experimentar com outros routers mas tudo o que temos são aqueles baratinhos das prateleiras dos supermercados...

Sabem de algum em particular que faça isso e que faça vpns tmb?
 
Talvez os Draytek facam SNAT. Mas nao tenho a certeza.
Experimenta enviar-lhes um email a perguntar.

Mas home que home substitui esses bichos (chamados routers) e monta ai 3 linux boxes como routers.
Ou ainda melhor, uma linux box com varias NIC's a servir as 3 ligacoes de internet (multi-isp). ;)
 
Olha que até sou home pra isso! ;)

Vou fazer umas experiencias então. Quanto aos drayteks, por acaso até temos 2 modelos diferentes e nenhum faz SNAT.
 
Olha que até sou home pra isso! ;)

Vou fazer umas experiencias então. Quanto aos drayteks, por acaso até temos 2 modelos diferentes e nenhum faz SNAT.

eu amanha vejo o Draytek Vigor 3300( é o multi wan deles) e alguns da serie 2800 para ver se tem SNAT dps digo qq coisa
 
Olá,

Permite-me dar outra sugestão: se tens na localização um switch que suporte VLANs (na realidade não precisas, mas simplifica o setup), consegues implementar o que pretendes, com apenas um Linux e sem reconfigurar nenhum dos routers Internet. A solução, consiste em utilizar marcas do Netfilter + Iproute, de modo a teres encaminhamento baseado no router de origem.

Se percebi correctamente, tens aí uma rede com N routers; na minha opinião, teres que reconfigurar todos os routers Internet para fazerem SNAT, não escala muito bem. Além disso, não sabes quais foram os IPs originais que acederam à aplicação - isto pode, ou não, ser relevante (para fins de auditoria, controlo de acesso, etc.).

Uma solução, que escala relativamente bem, é a utilização de uma, ou mais - se for necessário, Linux boxes, como One-armed router.

Se tiveres um switch que suporte VLANs, cria uma VLAN para cada router Internet e coloca-o dentro dessa rede.

A teu "router Linux" será responsável pelo encaminhamento entre todas as ligações Internet disponíveis e a rede interna.

A ideia é basicamente esta:

Assumindo o seguinte setup de rede:
Router 1 - vlan101 - 10.0.1.0/24 - Marca 1
Router 2 - vlan102 - 10.0.2.0/24 - Marca 2
Router 3 - vlan103 - 10.0.3.0/24 - Marca 3


  • O router Linux é a default gw do(s) servidor(es).
  • No router Linux, marcas todas as ligações vindas da vlan101 com a marca 1, da vlan102 com a marca 2, e por aí adiante. Em seguida, fazes DNAT para o teu servidor interno.
  • Utilizando o mecanismo de conntrack do Linux, podes associar ligações a marcas de ligação; depois, podes associar as marcas de ligação a tabelas de routing; com isto, consegues garantir que uma ligação que, originalmente, entrou pelo Router 1 sairá pelo Router 1.

Se as VLANs não forem opção, podes utilizar outros atributos para baseares as marcas de ligação, por exemplo o MAC address de cada router; o resultado é o mesmo.

Espero que a explicação não esteja demasiado confusa mas, a solução, de um ponto de vista financeiro e de manutenção, tem um custo relativamente baixo.

Se tiveres alguma questão, não hesites em perguntar.

Cumps,
JP
 
Boas. Esqueci-me de actualizar o tópico na altura mas efectivamente acabei por adicionar os 3 linux's auxiliares para fazer SNAT. A solução funciona e o custo é relativamente baixo, tem ligeiras desvantagens em relação à solução do countzero mas é mais simples de implementar e configurar até porque não domino alguns desses conceitos :p

De qualquer maneira, agora com mais tempo já que assim tmb funciona, vou-me informar e fazer umas experiencias, depois volto cá com as minhas dúvidas ;)

Kain: Os da série 2800 já experimentei e não têm SNAT. Ainda não tive oportunidade de ter aqui um multi-wan nas mãos, se entretanto experimentaste diz qq coisa.
 
Última edição:
Back
Topo