Cortafuegos I: De nodo con iptables.

Primera práctica de la unidad de Firewall.

SAD

Creado en February 11, 2023.


Tabla de Contenido.


Limpieza de las reglas previas.

root@maquina:/home/debian# iptables -F
root@maquina:/home/debian# iptables -t nat -F
root@maquina:/home/debian# iptables -Z
root@maquina:/home/debian# iptables -t nat -Z

Vamos a permitir ssh.

Cómo estamos conectado a la máquina por ssh, vamos a permitir la conexión ssh desde la red 172.22.0.0/16, antes de cambiar las políticas por defecto a DROP, para no perder la conexión:

root@maquina:/home/debian# iptables -A INPUT -s 172.22.0.0/16 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
root@maquina:/home/debian# iptables -A OUTPUT -d 172.22.0.0/16 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

Política por defecto.

root@maquina:/home/debian# iptables -P INPUT DROP
root@maquina:/home/debian# iptables -P OUTPUT DROP

Comprobamos que el equipo no puede acceder a ningún servicio ni de Internet ni de la red local, ya que la política lo impide.

root@maquina:/home/debian# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=111 time=478 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=111 time=586 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=111 time=463 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 463.406/509.111/586.265/54.865 ms
root@maquina:/home/debian# iptables -P INPUT DROP
root@maquina:/home/debian# iptables -P OUTPUT DROP
root@maquina:/home/debian# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2033ms

Permitimos tráfico para la interfaz loopback.

root@maquina:/home/debian# iptables -A INPUT -i lo -p icmp -j ACCEPT
root@maquina:/home/debian# iptables -A OUTPUT -o lo -p icmp -j ACCEPT

Peticiones y respuestas protocolo ICMP.

Compruebo que no funciona:

root@maquina:/home/debian# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
^C
--- 8.8.8.8 ping statistics ---
11 packets transmitted, 0 received, 100% packet loss, time 10226ms

Añado las reglas:

root@maquina:/home/debian# iptables -A INPUT -i ens3 -p icmp --icmp-type echo-reply -j ACCEPT
root@maquina:/home/debian# iptables -A OUTPUT -o ens3 -p icmp --icmp-type echo-request -j ACCEPT

Comprobamos su funcionamiento haciendo ping a una IP pública:

root@maquina:/home/debian# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=2 ttl=111 time=312 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=111 time=486 ms
64 bytes from 8.8.8.8: icmp_seq=5 ttl=111 time=302 ms
64 bytes from 8.8.8.8: icmp_seq=6 ttl=111 time=594 ms
^C
--- 8.8.8.8 ping statistics ---
6 packets transmitted, 4 received, 33.3333% packet loss, time 5018ms
rtt min/avg/max/mdev = 302.468/423.514/594.125/122.526 ms

Consultas y respuestas DNS.

root@maquina:/home/debian# iptables -A OUTPUT -o ens3 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
root@maquina:/home/debian# iptables -A INPUT -i ens3 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT

Comprobamos su funcionamiento con una consulta DNS:

root@maquina:/home/debian# dig @8.8.8.8 www.josedomingo.org

; <<>> DiG 9.16.37-Debian <<>> @8.8.8.8 www.josedomingo.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 17100
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;www.josedomingo.org. IN A

;; ANSWER SECTION:
www.josedomingo.org. 900 IN CNAME endor.josedomingo.org.
endor.josedomingo.org. 900 IN A 37.187.119.60

;; Query time: 304 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Tue Feb 14 11:51:49 UTC 2023
;; MSG SIZE rcvd: 84

Tráfico https.

root@maquina:/home/debian# iptables -A OUTPUT -o ens3 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
root@maquina:/home/debian# iptables -A INPUT -i ens3 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

Tráfico http/https.

root@maquina:/home/debian# iptables -A OUTPUT -o ens3 -p tcp -m multiport --dports 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
root@maquina:/home/debian# iptables -A INPUT -i ens3 -p tcp -m multiport --sports 80,443 -m state --state ESTABLISHED -j ACCEPT

Permitimos el acceso a nuestro servidor web.

root@maquina:/home/debian# iptables -A INPUT -i ens3 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
root@maquina:/home/debian# iptables -A OUTPUT -o ens3 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

Ejercicios.

1. Permite poder hacer conexiones ssh al exterior.

Añadimos reglas para permitir ssh al exterior:

root@maquina:/home/debian# iptables -A INPUT -i ens3 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
root@maquina:/home/debian# iptables -A OUTPUT -o ens3 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

Probamos que funciona el ssh

root@maquina:/home/debian# ssh alemd@172.22.0.161
The authenticity of host '172.22.0.161 (172.22.0.161)' can't be established.
ECDSA key fingerprint is SHA256:P4VynMzXNSUoRSzuUrFgWShiT4hYwT/y6DqQ7Sf/ujs.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '172.22.0.161' (ECDSA) to the list of known hosts.
alemd@172.22.0.161's password:
Linux debian 5.19.0-0.deb11.2-amd64 #1 SMP PREEMPT_DYNAMIC Debian 5.19.11-1~bpo11+1 (2022-10-03) x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have new mail.
alemd@debian:~$

2. Deniega el acceso a tu servidor web desde una ip concreta.

Instalamos apache y hacemos una web de prueba. Muestro las reglas para denegar el acceso a alfa que es la IP 172.22.200.13

root@maquina:/home/debian# iptables -I INPUT 4 ! -s 172.22.200.13 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
root@maquina:/home/debian# iptables -I OUTPUT 4 ! -d 172.22.200.13 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

Desde mi máquina, hago un curl.

alemd@debian:~$ curl 172.22.200.42
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<body>
<h1>PRACTICA FIREWALL</p>
</body>
</html>

Desde alfa hago un curl.

usuario@alfa:~$ curl 172.22.200.42
curl: (28) Failed to connect to 172.22.200.42 port 80: Connection timed out

3. Permite hacer consultas DNS sólo al servidor 192.168.202.2. Comprueba que no puedes hacer un dig @1.1.1.1.

Las reglas introducidas son las siguientes:

root@maquina:/home/debian# iptables -I INPUT 6 -s 192.168.202.2/32 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT
root@maquina:/home/debian# iptables -I OUTPUT 6 -d 192.168.202.2/32 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT

Hago una consulta al servidor 192.168.202.2:

root@maquina:/home/debian# dig @192.168.202.2 www.josedomingo.org

; <<>> DiG 9.16.37-Debian <<>> @192.168.202.2 www.josedomingo.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40487
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 5, ADDITIONAL: 6

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 456870443b553f07e841ab7e63ed310c806bb11f806a708b (good)
;; QUESTION SECTION:
;www.josedomingo.org. IN A

;; ANSWER SECTION:
www.josedomingo.org. 900 IN CNAME endor.josedomingo.org.
endor.josedomingo.org. 900 IN A 37.187.119.60

;; AUTHORITY SECTION:
josedomingo.org. 3600 IN NS ns1.cdmon.net.
josedomingo.org. 3600 IN NS ns2.cdmon.net.
josedomingo.org. 3600 IN NS ns5.cdmondns-01.com.
josedomingo.org. 3600 IN NS ns4.cdmondns-01.org.
josedomingo.org. 3600 IN NS ns3.cdmon.net.

;; ADDITIONAL SECTION:
ns1.cdmon.net. 67034 IN A 35.189.106.232
ns2.cdmon.net. 67034 IN A 35.195.57.29
ns3.cdmon.net. 67034 IN A 35.157.47.125
ns4.cdmondns-01.org. 3600 IN A 52.58.66.183
ns5.cdmondns-01.com. 67034 IN A 52.59.146.62

;; Query time: 260 msec
;; SERVER: 192.168.202.2#53(192.168.202.2)
;; WHEN: Wed Feb 15 19:22:52 UTC 2023
;; MSG SIZE rcvd: 318

Hago una consulta a través del servidor 1.1.1.1:

root@maquina:/home/debian# dig @1.1.1.1 www.josedomingo.org

; <<>> DiG 9.16.37-Debian <<>> @1.1.1.1 www.josedomingo.org
; (1 server found)
;; global options: +cmd
;; connection timed out; no servers could be reached

4. No permitir el acceso al servidor web de www.josedomingo.org (Tienes que utilizar la ip). ¿Puedes acceder a fp.josedomingo.org?

Las reglas usadas son las siguientes.

root@maquina:/home/debian# iptables -I OUTPUT 8 ! -d 37.187.119.60/32 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
root@maquina:/home/debian# iptables -I INPUT 8 ! -s 37.187.119.60/32 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

Realizo un curl a www.josedomingo.org

root@maquina:/home/debian# curl www.josedomingo.org
curl: (28) Failed to connect to www.josedomingo.org port 80: Connection timed out

Realizo un curl a fp.josedomingo.org.

root@maquina:/home/debian# curl fp.josedomingo.org
curl: (28) Failed to connect to fp.josedomingo.org port 80: Connection timed out

Como vemos a fp.josedomingo.org no se puede acceder ya que tiene la misma ip que www.josedomingo.org.

Si hago un curl a otra ip si funciona:

root@maquina:/home/debian# curl alejandro-montes.es
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

5. Permite mandar un correo usando nuestro servidor de correo: babuino-smtp. Para probarlo ejecuta un telnet bubuino-smtp.gonzalonazareno.org 25.

Las reglas utilizadas son las siguientes:

root@maquina:/home/debian# iptables -A OUTPUT -d 192.168.203.3/32 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
root@maquina:/home/debian# iptables -A INPUT -s 192.168.203.3/32 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

La ip 192.168.203.3 no se encuentra disponible:

debian@maquina:~$ ping babuino-smtp.gonzalonazareno.org
PING babuino-smtp.gonzalonazareno.org (192.168.203.3) 56(84) bytes of data.
^C
--- babuino-smtp.gonzalonazareno.org ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4104ms

6. Instala un servidor mariadb, y permite los accesos desde la ip de tu cliente. Comprueba que desde otro cliente no se puede acceder.

Las reglas usadas son las siguientes:

root@maquina:/home/debian# iptables -A INPUT -s 172.22.6.172/16 -p tcp --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
root@maquina:/home/debian# iptables -A OUTPUT -d 172.22.6.172/16 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

He creado un servidor mariadb habilitando el acceso remoto. Desde un cliente me conecto al usuario FIREWALL.

usuario@debian:~$ mysql -h 172.22.200.42 -u FIREWALL testing -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 34
Server version: 10.5.18-MariaDB-0+deb11u1 Debian 11

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [testing]>

Documento realizado por:

✒️ Alejandro Montes Delgado - 2º ASIR

Siguiente post

Ejercicios de K8s II.

Post anterior.

Ejercicios de K8s.