Redirixir o tráfico dunha IP e porto a outra IP e porto

Algo moi común ao xestionar servidores é redirixir o tráfico.

Supoñamos que temos un servidor con certos servizos en execución, pero por calquera motivo cambiamos un deses servizos (Non sei, por exemplo pop3 que é o porto 110) a outro servidor. O normal e o máis frecuente sería simplemente cambiar a IP no rexistro DNS, pero se alguén está a usar a IP no canto do subdominio, afectarase.

Que facer? ... sinxelo, redirixa o tráfico que recibe o servidor a través dese porto a outro servidor co mesmo porto.

servidor-nodo-lan-ethernet

Como comezamos a redirixir o tráfico?

O primeiro é que debemos ter habilitado o encamiñando no servidor, para iso poñeremos o seguinte:

echo "1" > /proc/sys/net/ipv4/ip_forward

Todos os comandos que se amosan neste tutorial deben executarse con privilexios administrativos, recomendo que se executen directamente co usuario root.

Tamén pode usar este outro comando, no caso de que o anterior non funcione para vostede (pasoume así nun CentOS):
sysctl net.ipv4.ip_forward=1
Despois reiniciaremos a rede:

service networking restart

En distros de RPM como CentOS e outros, sería:

service nertwork restart

Agora pasaremos ao importante, dillo ao servidor iptables que redirixir:

iptables -t nat -A PREROUTING -p tcp --dport <puerto receptor> -j DNAT --to-destination <ip final>:<puerto de ip final>

É dicir, e seguindo o exemplo que mencionei, supoñamos que queremos redirixir todo o tráfico que o noso servidor recibe a través do porto 110 a outro servidor (ex: 10.10.0.2), que aínda recibirá ese tráfico a través de 110 (é o mesmo servizo):

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 paquetes ou peticións proveñen da IP do cliente, no caso de que queiran nadar as peticións, é dicir, que o segundo servidor vexa que as peticións chegan coa IP do primeiro servidor (e no que aplicamos a redirección), tamén sería poñer esta segunda liña:

iptables -t nat -A POSTROUTING -j MASQUERADE

Algunhas preguntas e respostas

No exemplo usei o mesmo porto en ambas as ocasións (110), pero poden redirixir o tráfico dun porto a outro sen problemas. Por exemplo, supoña que quero redirixir o tráfico do porto 80 ao 443 noutro servidor, para iso sería:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.10.0.2:443

nomeadamente iptables, poden usar todos os demais parámetros que coñecemos, por exemplo, se só queremos redirixir o tráfico desde unha IP específica, sería engadindo -s ... Por exemplo, redirixirei só o tráfico que vén do 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 toda unha rede (/ 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

Tamén podemos especificar a interface de rede con -i :

iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 -j DNAT --to-destination 10.10.0.2:443

O final!

Isto como dixen xa, é iptables, podes aplicar o que xa se sabe para que o servidor faga exactamente o que queres que faga 😉

Saúdos!

DedicatedServer_SubImage


O contido do artigo adhírese aos nosos principios de ética editorial. Para informar dun erro faga clic en aquí.

19 comentarios, deixa os teus

Deixa o teu comentario

Enderezo de correo electrónico non será publicado. Os campos obrigatorios están marcados con *

*

*

  1. Responsable dos datos: Miguel Ángel Gatón
  2. Finalidade dos datos: controlar SPAM, xestión de comentarios.
  3. Lexitimación: o seu consentimento
  4. Comunicación dos datos: os datos non serán comunicados a terceiros salvo obrigación legal.
  5. Almacenamento de datos: base de datos aloxada por Occentus Networks (UE)
  6. Dereitos: en calquera momento pode limitar, recuperar e eliminar a súa información.

  1.   Fer dixo

    Tamén podemos facelo dende un firewall que permite o reenvío de portos, non? (aplicando as normas correspondentes).

    1.    KZKG ^ Gaara dixo

      Si, por suposto, ao final un cortalumes como Pfsense ou outros, usa iptables por detrás.

      1.    cazador dixo

        Para ser exactos, pfsense non usa iptables senón pf, lembre que é un bsd dentro.

        1.    KZKG ^ Gaara dixo

          Ai ben, meu malo!

  2.   Nicolas dixo

    Moitas grazas polo consello 🙂

    Teño un par de dúbidas:
    1 - ¿O cambio é permanente? ou pérdese ao reiniciar o servidor?
    2 - Teño varias instancias (digamos A, B e C) na mesma subred. Na instancia A aplico a regra para encamiñar o tráfico a unha IP externa e, probando con rizos das instancias B e C, todo fai marabilla. O problema é que a partir da instancia A non funciona. Intentei usar a súa IP e a interface de loopback, e ningunha das dúas funciona:
    $ iptables -t nat -A PREROUTING -p tcp –dport 8080 -j DNAT –to-destination xxxx: 8080
    $ iptables -t nat -A PREROUTING -p tcp -i lo –dport 8080 -j DNAT –to-destination xxxx: 8080

    $ curl ip-aaaa: 8080 / hello_world
    curl: (7) Produciuse un erro ao conectar ao porto ip-yyyy 8080: a conexión rexeitouse
    $ curl localhost: 8080 / hello_world
    curl: (7) Produciuse un fallo ao conectarse ao porto localhost 8080: a conexión rexeitouse

    Algunha idea de cal pode ser o problema?

    1.    KZKG ^ Gaara dixo

      Si, o cambio pérdese ao reiniciar, para evitar iso terás que usar iptables-save & iptables-restore ou algo así.
      Non entendín moi ben o que queres facer, exemplo A?

      1.    Nicolas dixo

        Teño un servidor que só admite conexións desde unha determinada ip (servidor A), non podo nin quero engadir máis IPs á lista branca (por problemas de escalabilidade), polo que quero que pase todo o tráfico ao servidor externo dito servidor (A).
        Por cuestión de práctica, teño configuracións globais que definen que IP usar para cada servizo, polo que neste caso é algo así como "todos os que queiran usar o servizo externo teñen que usar IP A"
        Isto logrouse con éxito usando o método deste artigo, pero atopo o problema de que ao aplicalo, o servidor A non pode acceder ao servizo usando a súa propia IP (pero o fan todos os outros servidores).
        Ata o de agora o mellor que atopei foi engadir o mapeado no ficheiro / etc / hosts do servidor A, apuntando á ip externa, sobrescribindo a configuración global.

  3.   braybaut dixo

    Moi ben, se teño outro servidor de correo, podería reenviar o tráfico do porto 143 do servidor1 ao servidor2 e os correos electrónicos chegaranme ao servidor2, non?

    lembranzas

    1.    KZKG ^ Gaara dixo

      En teoría si, funciona así. Por suposto, ten que ter o servidor de correo instalado correctamente no servidor2 🙂

  4.   msx dixo

    O tipo de publicacións que nos gusta ler, grazas!

  5.   abraham ibarra dixo

    Excelente artigo, teño un proxecto no que estou a traballar e quería facerche unha pregunta, hai interruptores industriais con función NAT (supoño que usan as táboas IPT abaixo), para traducir unha dirección IP sen facer cambios no equipo, un exemplo, teño un servidor 10.10.2.1 que se comunica con ordenadores 10.10.2.X e a través do conmutador está programado para que un ordenador que teña unha dirección 192.168.2.4 sexa realmente visto desde o servidor como 10.10.2.5, traduciu esa dirección IP Dende os outros ordenadores con esa dirección, quero facelo desde un servidor con Ubuntu ou outra distribución, cales serían as regras de iptables?

  6.   Kuk dixo

    Moi boa información grazas ^ _ ^

  7.   Isus dixo

    Boa tarde.
    Teño un problema ao intentar facer unha redirección. Explico:
    Teño un servidor proxy en Ubuntu, con 2 tarxetas de rede:
    eth0 = 192.168.1.1 está conectado ao resto da rede local.
    eth1 = 192.168.2.2 está conectado ao enrutador.
    Necesito todo o que vén a través de eth0 para pasar por eth1 e tamén a través do proxy (uso Squid, cuxo porto predeterminado é 3128), e non atopo a clave na configuración de IPTABLES.
    Non necesito restricións de ningún tipo, só que quede un rexistro no rexistro dos enderezos web que se visitan.

    Espero que me poidades axudar xa que é unha tarefa bastante pesada que me preocupa desde hai un par de días.

    Grazas.

  8.   Gabriel dixo

    Amigo, son moi novo noutros servidores, non teño nin idea, pero entendo o tema e aprendo axiña, a miña pregunta é a seguinte. Teño 2 servidores serv_1 e serv_2 que teño conectados á mesma intranet, nestes servidores teño configurado un cloud propio, Gustaríame facer o seguinte:

    que un certo rango de IPs, por exemplo, rangeip_1 ao colocar unha ip de acceso á owncloud (ipowncloud) está dirixido cara ao serv_1 e se é outro rangeip_2 colocado o mesmo ipowncloud diríxese ao serv_2, para que os 2 servidores estean situados en dúas cidades diferentes e os rangos de ip son diferentes pero todos están na mesma rede, esa sería a primeira parte, a segunda estaría claro é sincronizar estes 2 servidores para que sexan espellos ou que me aconsellen isto para optimizar o ancho banda, por favor, se me vas a explicar como facelo paso a paso non modo super programador = (

  9.   Antonio Carrizosa dixo

    Ola, desculpe, teño un interruptor encargado da comunicación de todos os dispositivos que compoñen a miña rede e, despois disto, un firewall e finalmente a saída de Internet, o que pasa é que me gustaría que a redirección se dese no cambiar e non ten que chegar ao cortalumes a menos que o servizo solicitado sexa internet.

  10.   John dixo

    Usando este método, podería redirixir HTTPS a HTTP?

  11.   mati dixo

    Ola, quizais sexa un pouco tarde, pero quería preguntarche, como debería facer que squid non modifique a IP do cliente cando quero conectarme a un servidor web da mesma rede?

  12.   Lafat32 dixo

    Non me trates mal por preguntar. Pódese facer isto en Windows?

  13.   Martin dixo

    Esta información foime útil. Como sempre, pode confiar en vós, cando non atopo algo en inglés normalmente acabo buscando en español, nesas ocasións case sempre veño a este sitio. Grazas.