IPtables

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda

Filter

Amb iptables es poden fer moltes coses diferents. Comencem amb tres cadenes d'ús intern: INPUT, OUTPUT i FORWARD, que no es poden esborrar. Vegem les operacioes que es poden fer en totes les cadenes:

  • Crear una nova cadena (-N).
  • Esborrar una cadena buida (-X).
  • Canviar la política d'una cadena d'ús intern (-P).
  • Llistar les regles d'una cadena (-L).
  • Buidar de regles una cadena (-F).
  • Posar a zero els comptadors de paquets i bytes de totes les regles d'una cadena (-Z).

Les regles d'una cadena es poden manipular de diverses maneres:

  • Afegir una nova regla a una cadena (-A).
  • Inserir una nova regla en alguna posició de la cadena (-I).
  • Moure una regla a una altra posició dins d'una cadena (-R).
  • Esborrar una regla d'un lloc en particular d'una cadena (-D).
  • Esborrar la primera regla que coincideixi amb els paràmetres donats en una cadena (-D).

Exemple:

Anem a suposar un exemple tan simple com evitar que ens puguen fer PING. El PING és un missatge ICMP.

iptables -A INPUT -p icmp -j DROP

El que ha fer és afegir (-A) una regla a la cadena INPUT que fa que els paquets del protocol (-p) ICMP boten (-j) a DROP, és a dir, s'eliminen sense donar més informació.

Si volem eliminar la regla podem fer -F o repetir el comandament amb -D en compte de -A

Podem modificar un poc el comandament per a que rebuje contestar però informant:

iptables -A INPUT -p icmp -j REJECT

També podem afegir algunes coses més:

iptables -A INPUT -s 192.168.0.100/24 -d 192.168.0.1 -p icmp -i eth1 -j DROP
  • -s o --source o --src: Per a indicar la IP o xarxa d'origen.
  • -d o --destination o --dst: Per indicar el destí.
  • -i o --in-interface: Per indicar la interfície de xarxa per la que filtra. En aquest cas, no es pot ficar -o perquè és una regla INPUT.

NAT

La taula NAT té 3 chains: PREROUTING, OUTPUT i POSTROUTING. Quant un paquet arriba al router però no està dirigit a la seua IP, ha de fer forward, és a dir, passar a través de dos targetes per tal de se encaminat a un altre router. Això es fa en la taula d'enrutament. Dins, pot decidir tractar el paquet en algun procés local o enviar-lo. En qualsevol cas, passa finalment per POSTROUTING. Si volem tradiur les direccions per tal de fer el NAT, s'ha de fer una vegada s'ha decidit a quina xarxa s'ha de reenviar el paquet, és a dir, en el POSTROUTING.

Entrada   +------------+         +------------+        +-------------+
--------> | PREROUTING | ----->  | Enrutament | -----> | POSTROUTING | ------> Eixida
          +------------+         +------------+        +-------------+  
                                       |                      ^              
                                       |                      |
                                       v                      |
                                 +--------------+        +-----------+
                                 | procés local | -----> |  OUTPUT   |
                                 +--------------+        +-----------+

NAT implica dos coses:

  • Source NAT (SNAT, per origen) Traduir les direccions internes de la xarxa en una direcció externa.
  • Destination NAT (DNAT, per destinació). Permetre que els paquets que arriben de l'exterior fins a la xarxa interna en una connexió ja establida siguen redireccionats al client que toca.

Source NAT és quan alterem l'origen del primer paquet: és a dir, estem canviant el lloc d'on ve la connexió. Source NAT sempre es fa després de l'encaminament, just abans que el paquet surti pel cable. L'emmascarament és una forma especialitzada de SNAT.

Destination NAT és quan alterem l'adreça de destinació del primer paquet: és a dir, canviem la direcció a on es dirigeix la connexió. DNAT sempre es fa abans de l'encaminament, quan el paquet entra pel cable. El port forwarding (reenviament de port), el balanceig de càrrega i el proxy transparent són formes de DNAT.

Dins del source NAT podem especificar amb --to la IP que serà modificada o dir MASQUERADE per si la IP pot canviar.

# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6 
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

El destination NAT especifica la IP interna de destí segons l'origen:

# iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 5.6.7.8
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j DNAT --to 5.6.7.8:8080
# La següent és per a redirigir el tràfic de un port a un altre en la mateixa IP:
# iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

Per tant, si volem exposar el port 80 del nostre firewall per al port 80 d'un servidor web en la xarxa interna:

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.31.0.23:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.4.2:80

Recorda que si tens un DROP per defecte per a tot el FORWARD, has d'afegir també aquesta regla:

iptables -A FORWARD -i eth0 -p tcp --dport 80 -d 172.31.0.23 -j ACCEPT

Casos resolts

Router simple

Si tenim dos xarxes i sols volem una comunicació entre elles sense NAT:

# sed -i -r 's/#(net.ipv4.ip_forward)/\1/' /etc/sysctl.conf 
# echo 1 > /proc/sys/net/ipv4/ip_forward

Després cal modificar les taules d'enrutament de les dues xarxes. Exemples en route i, més modern, ip route:

  1. route add -net 192.168.3.0 netmask 255.255.255.0 gw 192.168.1.254
  2. ip route add 192.168.3.0/24 via 192.168.1.254 dev eth1

Router simple en NAT

Si volem connectar una xarxa interna a Internet, en IPv4 és normal que les direccions internes no siguen úniques en Internet. Per tant, cal emmascarar la nostra IP interna amb la IP externa que té el servidor que fa de router.

# sed -i -r 's/#(net.ipv4.ip_forward)/\1/' /etc/sysctl.conf 
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
# apt install iptables-persistent
# iptables-save > /etc/iptables/rules.v4

Tot el que, després de decidir quin enrutament ha de tindre, va per la nic eth0, serà traduït per NAT.

Explicació de les Iptables: En aquest cas, estem modificant la taula de nat. Li afegim una regla al POSTROUTING de, tots els paquets que venen de la xarxa 192.168.2.0/24, passen per la taula d'enrutament i són encaminats a la nic eth0, fer un MASQUERADE, és a dir, traduir les direccions internes en la direcció externa del router.

Podem fer NAT en connexions entre xarxes internes. Però pot no ser necessari.

Router amb tallafocs i NAT

Si el router que estem configurant està connectat a Internet, és necessari fer primer un tallafocs i després anar obrint les mínimes coses possibles.

Primer de tot, eliminar totes les regles:

# iptables -F
# iptables -t nat -F 

A continuació establir les polítiques per defecte de les IPtables a les més restrictives possible:

# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP

Explicació de les Iptables: L'opció -P permet modificar les regles per defecte, les que no estan en l'espai d'usuari. Les 3 chains queden totalment tallades.

I ara obrim a possibilitat de fer forward, amés del nat:

Permetre accedir a l'exterior des de la xarxa interna.

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -A FORWARD -i eth0 -o eth2 -j ACCEPT
# iptables -A FORWARD -o eth0 -i eth2 -j ACCEPT

Zona desmilitaritzada

La configuració anterior pot no ser suficient, ja que deixa exposat el forward a qualsevol màquina externa, interna i qualsevol port. Una configuració més adequada seria fer el que es coneix com a zona desmilitaritzada.

MISC.

Comentaris en les IPtables

Pot ser molt útil posar comentaris en els IPtables de manera que, quan les visualitzem en iptables -L o similars, es puga saber quin és el propòsit de cadascuna.

Exemples:

# iptables -A INPUT -i eth1 -m comment --comment "my LAN - " -j DROP
# iptables -A INPUT -s 202.54.1.1 -j DROP -m comment --comment "DROP spam IP address - "
# iptables -A INPUT -p tcp --dport 80 -m comment --comment "block HTTPD access - " -j DROP
# iptables -A INPUT -p tcp --dport 443 -m comment --comment "block HTTPDS access - " -j DROP

Enllaços

Capa de xarxa#Routers Configuració de la xarxa en Linux Entendiendo iptables hashlimit