Algo muito comum no gerenciamento de servidores é o redirecionamento de tráfego.
Suponha que temos um servidor com certos serviços em execução, mas por qualquer motivo, mudamos um desses serviços (Não sei, por exemplo pop3 que é a porta 110) para outro servidor. O normal e mais frequente seria simplesmente mudar o IP no registro DNS, porém se alguém estava usando o IP em vez do subdomínio ele será afetado.
O que fazer? ... simples, redirecione o tráfego que o servidor recebe por aquela porta para outro servidor com a mesma porta.
Como começamos a redirecionar o tráfego?
A primeira coisa é que devemos ter habilitado o encaminhando no servidor, para isso vamos colocar o seguinte:
echo "1" > /proc/sys/net/ipv4/ip_forward
Você também pode usar este outro comando, caso o anterior não funcione para você (aconteceu comigo assim em um CentOS):
sysctl net.ipv4.ip_forward=1
Em seguida, reiniciaremos a rede:
service networking restart
Em distros RPM como CentOS e outras, seria:
service nertwork restart
Agora vamos passar para o importante, diga ao servidor por meio iptables o que redirecionar:
iptables -t nat -A PREROUTING -p tcp --dport <puerto receptor> -j DNAT --to-destination <ip final>:<puerto de ip final>
Isto é, e seguindo o exemplo que mencionei, suponha que queiramos redirecionar todo o tráfego que nosso servidor recebe através da porta 110 para outro servidor (ex: 10.10.0.2), que ainda receberá esse tráfego por meio de 110 (é o mesmo serviço):
iptables -t nat -A PREROUTING -p tcp --dport 110 -j DNAT --to-destination 10.10.0.2:110
O servidor 10.10.0.2 verá que todos os pacotes ou requisições vêm do IP do cliente, caso ele queira nadar as requisições, ou seja, que o 2º servidor veja que as requisições chegam com o IP do 1º servidor (e no ao qual aplicamos o redirecionamento), seria também colocar esta segunda linha:
iptables -t nat -A POSTROUTING -j MASQUERADE
Algumas perguntas e respostas
No exemplo usei a mesma porta nas duas ocasiões (110), porém eles podem redirecionar o tráfego de uma porta para outra sem problemas. Por exemplo, suponha que eu queira redirecionar o tráfego da porta 80 para 443 em outro servidor, para isso seria:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.10.0.2:443
Isto é iptables, eles podem usar todos os outros parâmetros que sabemos, por exemplo, se quisermos apenas redirecionar o tráfego de um IP específico, seria adicionando -s … Por exemplo, redirecionarei apenas o tráfego proveniente de 10.10.0.51:
iptables -t nat -A PREROUTING -p tcp -s 10.10.0.51 --dport 80 -j DNAT --to-destination 10.10.0.2:443
Ou uma rede inteira (/ 24):
iptables -t nat -A PREROUTING -p tcp -s 10.10.0.0/24 --dport 80 -j DNAT --to-destination 10.10.0.2:443
Também podemos especificar a interface de rede com -i :
iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -j DNAT --to-destination 10.10.0.2:443
O fim!
Isso, como já falei, é iptables, você pode aplicar o que já é conhecido para que o servidor faça exatamente o que você deseja
Saudações!
Também podemos fazer isso a partir de um firewall que permite o encaminhamento de portas, certo? (aplicando as regras correspondentes).
Sim, claro, no final um firewall como o Pfsense ou outros, usa iptables por trás.
Para ser exato, o pfsense não usa iptables, mas pf, lembre-se de que é um bsd interno.
Oh certo, meu mal!
Muito obrigado pela dica 🙂
Tenho algumas dúvidas:
1 - A mudança é permanente? ou é perdido ao reiniciar o servidor?
2 - Tenho várias instâncias (digamos A, B e C) na mesma sub-rede. Na instância A eu aplico a regra de rotear o tráfego para um IP externo, e tentando com curls das instâncias B e C, tudo funciona bem. O problema é que a partir da instância A não funciona. Tentei usar o seu ip e a interface de loopback, mas nenhum funcionou:
$ iptables -t nat -A PREROUTING -p tcp –dport 8080 -j DNAT –to-destino xxxx: 8080
$ iptables -t nat -A PREROUTING -p tcp -i lo –dport 8080 -j DNAT –to-destination xxxx: 8080
$ curl ip-yyyy: 8080 / hello_world
curl: (7) Falha ao conectar à porta 8080 do ip-yyyy: Conexão recusada
$ curl localhost: 8080 / hello_world
curl: (7) Falha ao conectar à porta 8080 do host local: Conexão recusada
Alguma ideia de qual pode ser o problema?
Sim, a mudança é perdida na reinicialização, você terá que usar iptables-save & iptables-restore ou algo parecido para evitar isso.
Não entendi muito bem o que você quer fazer, exemplo A?
Tenho um servidor que só suporta conexões de um determinado ip (servidor A), não posso ou quero adicionar mais ips à lista de permissões (por questões de escalabilidade), então quero que todo o tráfego para o servidor externo passe dito servidor (A).
Por uma questão de praticidade, tenho configurações globais que definem qual IP usar para cada serviço, então neste caso é algo como "todo mundo que quiser usar o serviço externo, tem que usar IP A"
Isso foi conseguido com sucesso usando o método neste artigo, mas me deparo com o problema de que, ao aplicá-lo, o servidor A não pode acessar o serviço usando seu próprio ip (mas todos os outros servidores acessam).
Até agora o melhor que encontrei foi adicionar o mapeamento no arquivo / etc / hosts do servidor A, apontando para o ip externo, substituindo a configuração global.
Muito bom, se eu tiver outro servidor de e-mail eu poderia encaminhar o tráfego da porta 143 do servidor1 para o servidor2 e os e-mails chegarão no servidor2, certo?
lembranças
Em teoria, sim, funciona assim. Claro, você deve ter o servidor de e-mail instalado corretamente no servidor2 🙂
O tipo de postagem que gostamos de ler, obrigado!
Excelente artigo, tenho um projeto no qual estou trabalhando e queria fazer uma pergunta, existem switches industriais com função NAT (suponho que usem IPTables abaixo), para traduzir um endereço IP sem fazer alterações no equipamento, por exemplo, tenho um servidor 10.10.2.1 que se comunica com computadores 10.10.2.X e através do switch é programado de forma que um computador que tem um endereço 192.168.2.4 seja realmente visto do servidor como 10.10.2.5, ele traduziu esse endereço IP para ser visto Dos outros computadores com esse endereço, quero fazer de um servidor com Ubuntu ou outra distribuição, quais seriam as regras de iptables?
Informações muito boas, obrigado ^ _ ^
Boa tarde.
Eu tenho um problema ao tentar fazer um redirecionamento. Quero dizer:
Tenho um servidor proxy no Ubuntu, com 2 placas de rede:
eth0 = 192.168.1.1 está conectado ao resto da rede local.
eth1 = 192.168.2.2 está conectado ao roteador.
Preciso que tudo que vem através da eth0 passe pela eth1, e também pelo proxy (eu uso o Squid, cuja porta padrão é 3128), e não consigo encontrar a chave na configuração IPTABLES.
Não necessito de restrição de nenhum tipo, apenas que fique um registro no log dos endereços web que são visitados.
Espero que você possa me ajudar, pois é uma tarefa bastante incômoda que me preocupa há alguns dias.
Obrigado.
Amigo, sou muito novo em outros servidores, não tenho ideia mas entendo do assunto e aprendo rápido, minha dúvida é a seguinte tenho 2 servidores serv_1 e serv_2 que conectei na mesma intranet, nestes servidores tenho uma nuvem própria configurada Eu gostaria de fazer o seguinte:
que um certo intervalo de ips por exemplo rangeip_1 ao colocar um ip de acesso ao owncloud (ipowncloud) é direcionado para o serv_1 e se for outro rangeip_2 colocado o mesmo ipowncloud é direcionado para o serv_2, isto para que os 2 servidores sejam localizados em duas cidades diferentes e as faixas de ip são diferentes mas estão todos na mesma rede, essa seria a primeira parte, a segunda seria claro é sincronizar esses 2 servidores para que sejam mirrors ou que me avisem isso para otimizar a largura banda, por favor, se você vai me explicar como fazê-lo passo a passo modo não super programador = (
Olá, com licença, tenho um switch encarregado da comunicação de todos os dispositivos que fazem parte da minha rede, e depois disso um firewall e por último a saída da Internet, o que acontece é que gostaria que o redirecionamento fosse dado no switch e não precisa alcançar o firewall, a menos que o serviço solicitado seja a Internet.
Usando este método, você poderia redirecionar HTTPS para HTTP?
Olá, talvez seja um pouco tarde, mas queria te perguntar, como devo fazer o squid não modificar o IP do cliente quando quero me conectar a um servidor web da mesma rede?
Não me trate mal por perguntar. Isso pode ser feito no Windows?
Esta informação foi útil para mim. Como sempre, vocês são de confiança, quando não encontro algo em inglês acabo procurando em espanhol, nessas ocasiões quase sempre venho a este site. Obrigado.
Tenho um roteador 4G que é cliente de uma rede que não gerencio (obviamente, sou cliente)… esse roteador é um gateway para aquela rede remota através do OpenVPN. Além disso, o referido roteador cumpre a função de encaminhamento de porta para acessar a porta 80 do servidor de uma dessas sub-redes em campo.
Esta foi a declaração que eu tive que colocar no roteador como regra personalizada do firewall «-t nat -A POSTROUTING -j MASQUERADE»
Obrigado pela ajuda!