Redireccionar tràfic d'una IP i port cap a una altra IP i port

Una cosa molt comú quan administrem servidors és redireccionar trànsit.

Suposem que tenim un servidor amb determinats serveis funcionant, però per qualsevol raó canviem un d'aquests serveis (no sé, per exemple pop3 que és el port 110) Cap a un altre servidor. El normal i més freqüent seria simplement canviar la IP en el registre DNS, no obstant si algú estava fent servir la IP en comptes del subdomini es veurà afectat.

Què fer? ... simple, redireccionar el trànsit que rebi aquest servidor per aquest port cap a un altre servidor amb el mateix port.

server-node-lan-ethernet

Com vam començar a redireccionar trànsit?

El primer serà que hem de tenir habilitat el reenviament al servidor, per a això posarem el següent:

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

Totes les comandes que es mostren en aquest tutorial han de ser executats amb privilegis d'administració, recomano que siguin executats directament amb l'usuari root.

També poden emprar això comando, en cas que l'anterior no els funcioni (em va passar així en un CentOS):
sysctl net.ipv4.ip_forward=1
Després reiniciarem la xarxa:

service networking restart

En distros RPM com CentOS i altres, seria:

service nertwork restart

Ara passarem a l'important, indicar-li a l'servidor mitjançant iptables què redireccionar:

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

O sigui i seguint l'exemple que he esmentat, suposem que volem redireccionar tot el trànsit que rep el nostre servidor pel port 110 cap a un altre servidor (ex: 10.10.0.2), Que potser rebrà aquest trànsit pel 110 (ja que es tracta del mateix servei):

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

El servidor 10.10.0.2 veurà que tots els paquets o peticions vénen des de la IP de el client, en cas que vulguin natear les peticions, o sigui, que el 2n servidor vegi que les peticions arriben amb la IP de l'1er servidor (i en el qual apliquem la redirecció), seria posar més aquesta segona línia:

iptables -t nat -A POSTROUTING -j MASQUERADE

Algunes preguntes i respostes

En l'exemple vaig fer servir el mateix port en ambdues ocasions (el 110), tot i això poden redireccionar tràfic d'un port a un altre sense problemes. Per exemple, suposem que desitjo redireccionar el tràfic de el port 80 a l'443 en un altre servidor, per a això seria:

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

això és iptables, Poden usar tots els altres paràmetres que coneixem, per exemple, si només volem redireccionar tràfic d'una IP a específica, seria afegint -s ... per exemple redireccionaré només el trànsit que vingui des 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

O bé una xarxa sencera (/ 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é podem especificar la interfície de xarxa amb -i :

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

Fi!

Això com vaig dir ja, és iptables, poden aplicar el ja conegut perquè el servidor faci exactament el que vulguin que faci 😉

Salutacions!

DedicatedServer_SubImage


20 comentaris, deixa el teu

Deixa el teu comentari

La seva adreça de correu electrònic no es publicarà. Els camps obligatoris estan marcats amb *

*

*

  1. Responsable de les dades: Miguel Ángel Gatón
  2. Finalitat de les dades: Controlar l'SPAM, gestió de comentaris.
  3. Legitimació: El teu consentiment
  4. Comunicació de les dades: No es comunicaran les dades a tercers excepte per obligació legal.
  5. Emmagatzematge de les dades: Base de dades allotjada en Occentus Networks (UE)
  6. Drets: En qualsevol moment pots limitar, recuperar i esborrar la teva informació.

  1.   Fer va dir

    Això també ho podem fer des d'un tallafocs que permeti la redirecció de ports, no? (Aplicant les regles corresponents).

    1.    KZKG ^ Gaara va dir

      Sí clar, a la fin un tallafocs com pfSense o altres, usen iptables per darrere.

      1.    caçador va dir

        Per ser exactes pfSense no fa servir iptables sinó pf, recorda que és un bsd per dins.

        1.    KZKG ^ Gaara va dir

          Oh right, my bad!

  2.   Nicolas va dir

    Moltes gràcies pel tip 🙂

    tinc un parell de dubtes:
    1 - El canvi és permanent? o es perd a l'reiniciar el servidor?
    2 - Tinc diverses instàncies (diguem A, B i C) a la subxarxa. En la instància A va aplicar la regla per rutear el trànsit a una IP externa, i provant amb curls des de les instàncies B i C, tot funciona de meravelles. El problema és que des de la instància A no funciona. Probe usant tant la seva ip com la interfície de loopback, i cap funciona:
    $ Iptables -t nat -A PREROUTING -p tcp -dport 8080 -j DNAT -to-destination xxxx: 8080
    $ Iptables -t nat -A PREROUTING -p tcp -i ho -dport 8080 -j DNAT -to-destination xxxx: 8080

    $ Curl ip-yyyy: 8080 / hello_world
    curl: (7) Failed to connect to ip-yyyy port 8080: Connection Refused
    $ Curl localhost: 8080 / hello_world
    curl: (7) Failed to connect to localhost port 8080: Connection Refused

    Alguna idea de quin pot ser el problema?

    1.    KZKG ^ Gaara va dir

      Sí, el canvi es perd a l'reiniciar, hauràs de fer servir iptables-save & iptables-restore o alguna cosa així per evitar això.
      No vaig entendre de el tot el que vols fer, ¿instància A?

      1.    Nicolas va dir

        Tinc un servidor que només admet connexions des d'una ip en particular (la de servidor A), no puc ni vull afegir més ips a la whitelist (per temes d'escalabilitat), de manera que vull que tot el trànsit cap al servidor extern passi per aquest servidor (A).
        Per una qüestió de practicitat, he configuracions globals que defineixen que IP utilitzar per a cada servei, de manera que en aquest cas és una cosa així com que «tots els que vulguin utilitzar el servei extern, han de fer servir la ip A»
        Això ho aconsegueixi satisfactòriament utilitzant el mètode d'aquest article, però em trobo amb el problema que a l'aplicar-lo, el servidor A no pot accedir a l'servei usant la seva pròpia ip (però si ho fan tots els altres servidors).
        Fins ara, el millor que vaig trobar va ser afegir el mapeig a l'arxiu / etc / hosts de servidor A, apuntant a la ip externa, sobreescrivint la configuració global.

  3.   braybaut va dir

    Molt bo, si tinc un altre servidor de correu podria tornar a enviar el trànsit del port 143 de l'server1 a l'server2 i els correus em arribessin a l'servidor2 cert?

    Salutacions

    1.    KZKG ^ Gaara va dir

      En teoria sí, funciona així. És clar, has de tenir instal·lat apropiadament el servidor de correu en server2 🙂

  4.   MSX va dir

    El tipus de posts que ens agrada llegir, gràcies!

  5.   abraham ibarra va dir

    Excel·lent article, tinc un projecte en el qual estic treballant i volia fer-te una consulta, hi ha switches industrials amb funció de NAT (Suposo utilitzen IPTables per sota), per traudcir una adreça IP sense fer canvis en l'equip, un exemple, tinc un Servidor 10.10.2.1 que es comunica amb equips 10.10.2.X i mitjançant el switch es programa perquè un equip que té una adreça 192.168.2.4 en realitat sigui vist des del servidor com 10.10.2.5, va traduir aquesta direcció IP perquè fos vist des els altres equips amb aquesta direcció, vull fer-ho des d'un server amb Ubuntu o una altra distribució, Quines serien les regles de iptables?

  6.   Maluc va dir

    Molt bona info gràcies ^ _ ^

  7.   yisus va dir

    Bona tarda.
    Tinc un problema intentant fer una redirecció. m'explico:
    tinc un servidor intermediari en Ubuntu, amb 2 targetes de xarxa:
    eth0 = 192.168.1.1 està contectado a la resta de la xarxa local.
    eth1 = 192.168.2.2 està connectat a el router.
    Necessito que tot el que arribi per eth0, surti per eth1, ia més passant pel proxy (ús Squid, el port per defecte és 3128), i no aconsegueixo trobar la tecla en la configuració de IPTABLES.
    No necessito restricció de cap tipus, només que quedi un registre en el registre de les adreces web que es visiten.

    Espero que puguin ajudar-me, ja que és una tasca força molesta que em porta preocupant un parell de dies.

    Gràcies.

  8.   Gabriel va dir

    amic sóc molt novell en això dels servidors demas no tinc ni idea però entenc del tema i aprenc ràpid, la meva pregunta és la següent tinc 2 servidors serv_1 i serv_2 els quals tinc connectats a la mateixa intranet, en aquests servidors tinc muntat una owncloud, m'agradaria fer el següent:

    que cert rang de ips per exemple rangoip_1 a l'col·locar una ip d'accés a la owncloud (ipowncloud) s'encamini cap al serv_1 i si és un altre rangoip_2 col·locat la mateixa ipowncloud s'encamini a l'serv_2, això amb la finalitat que els 2 servidors estan ubicats en dues ciutats diferents i els rangs de ip són diferents però tots són en la mateixa xarxa, això seria la primera part, la segona seria clar aquesta sincronitzar aquests 2 servidors perquè siguin miralls o que em aconcejan això amb la finalitat d'optimitzar l'ample de banda, si us plau, si em van a explicar com facin-ho pas a pas no a la manera super programador = (

  9.   Antonio Carrizosa va dir

    Hola, disculpa, tinc un switch encarregat de la comunicació de tots els dispositius que conformen la meva xarxa, i després d'aquest un firewall i per últim la sortida a internet, el que passa és que m'agradaria que el re-adreçament es donés al switch i no hagi d'arribar fins al tallafocs llevat que el servei que se sol·liciti sigui internet.

  10.   juan va dir

    Usant aquest mètode podria redireccionar HTTPS a HTTP?

  11.   mati va dir

    hola potser és una mica tard, però volia consultar-te, com he de fer perquè squid no modifiqui la ip de client a l'estimar-me connectar a un servidor web de la mateixa xarxa?

  12.   Lafat32 va dir

    No em tractin malament per preguntar. Es pot fer això a Windows?

  13.   Martin va dir

    M'ha estat útil aquesta informació. Com sempre amb es pot confiar en vosaltres nois, quan no trobo alguna cosa en anglès sòl acabar buscant en espanyol, d'aquestes ocasions gairebé sempre arribo a aquest sitio.Gracias.

  14.   Seba va dir

    Tinc un router 4G que és client d'una xarxa que jo no administro (obvi, sóc client)… aquest router és una porta a aquesta xarxa remota mitjançant OpenVPN. A més, aquest router compleix la funció de portforwarding per accedir al port 80 de servidor d'una d'aquestes subxarxes en terreny.

    Aquesta va ser la declaració que vaig haver de ficar-lo al router com una custom rule del tallafoc «-t nat -A POSTROUTING -j MASQUERADE»

    Gràcies per l'ajuda!