You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

7.5 KiB

title date draft image categories tags
Cortafuegos I: De nodo con iptables 2023-02-15T23:46:36+01:00 false featured.png
documentación
Seguridad y Alta Disponibilidad
Cortafuegos
iptables

Enunciado: https://fp.josedomingo.org/seguridadgs/u03/ejercicio1.html

Preparación

Limpiamos las reglas previas

iptables -F
iptables -t nat -F
iptables -Z
iptables -t nat -Z

Acceso por SSH

Antes de añadir la política por defecto voy a añadir reglas para permitir el acceso por ssh

iptables -A INPUT -s 172.22.0.0/16 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d 172.22.0.0/16 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

Estas reglas sirve para acceder desde la misma red, además añado las siguientes para acceder a través de la VPN

iptables -A INPUT -s 172.29.0.0/16 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d 172.29.0.0/16 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

Ahora añado las políticas por defecto

iptables -P INPUT DROP
iptables -P OUTPUT DROP

Ahora pruebo que se han aplicado, por ejemplo, haciendo un ping:

ping

Permitimos tráfico por la interfaz de loopback

iptables -A INPUT -i lo -p icmp -j ACCEPT
iptables -A OUTPUT -o lo -p icmp -j ACCEPT

Peticiones y respuestas del protocolo ICMP

iptables -A INPUT -i ens3 -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -o ens3 -p icmp --icmp-type echo-request -j ACCEPT

Pruebo que funciona haciendo un ping

ping2

Consultas y respuestas DNS

iptables -A OUTPUT -o ens3 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i ens3 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT

Pruebo que funciona haciendo una consulta DNS

dns

Tráfico HTTP

iptables -A OUTPUT -o ens3 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i ens3 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

Pruebo que funciona haciendo una consulta HTTP

http

Tráfico HTTPS

iptables -A OUTPUT -o ens3 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i ens3 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

Pruebo que funciona haciendo una consulta HTTPS

https

Tráfico HTTP/HTTPs

Los dos puntos anteriores se pueden resumir en una sola regla

iptables -A OUTPUT -o ens3 -p tcp -m multiport --dports 80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i ens3 -p tcp -m multiport --sports 80,443 -m state --state ESTABLISHED -j ACCEPT

Acceso al servidor web

iptables -A INPUT -i ens3 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o ens3 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

Pruebo que funciona haciendo una consulta HTTP desde el exterior

web

Ejercicios

1. Permite poder hacer conexiones ssh al exterior

Para esto uso las reglas de ssh citas anteriormente:

iptables -A INPUT -s 172.22.0.0/16 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d 172.22.0.0/16 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

Estas reglas sirve para acceder desde la misma red, además añado las siguientes para acceder a través de la VPN

iptables -A INPUT -s 172.29.0.0/16 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d 172.29.0.0/16 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

ssh1 ssh2

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

Como ya he creado en la preparación una regla que permite el acceso al servidor web, para que el bloque funcione tengo que añadir la regla antes, ya que el orden es importante en iptables. Para ello, primero miro la posición de la regla que permite el acceso al servidor web

iptables -L -n -v --line-numbers

iptables

La regla que permite el acceso está en la dirección 8; ahora creo la regla con la ip de mi máqunina:

iptables -I INPUT 8 -s 172.29.0.42 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j DROP

iptables2

Ahora compruebo que no puedo acceder al servidor web desde mi máquina

web

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

Primero borro las reglas de DNS que he creado anteriormente

iptables -D OUTPUT -o ens3 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -D INPUT -i ens3 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT

Y ahora añado las reglas nuevas, permitiendo solo el servidor 192.168.202.2:

iptables -A OUTPUT -d 192.168.202.2 -p udp --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -s 192.168.202.2 -p udp --sport 53 -m state --state ESTABLISHED -j ACCEPT

Ahora compruebo que no puedo hacer un dig@1.1.1.1 www.josedomingo.org:

dns

Y si que puedo usando el dns, dig@192.168.202.2 www.josedomingo.org:

dns2

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

Al igual que en el ejercicio 2, primero miro la posición de la regla que permite el acceso al servidor web

iptables

Está en el lugar 5. Ahora creo la regla con la ip de josedomingo.org:

iptables -I OUTPUT 5 -d 37.187.119.60 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j DROP

Compruebo que se ha creado correctamente:

iptables2

Ahora compruebo que no puedo acceder al servidor web de josedomingo.org

web

y si que puedo acceder a portquiz.net:

web2

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

Para hacerlo utilizo la ip de babuino:

iptables -A OUTPUT -d 192.168.203.3 -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -s 192.168.203.3 -p tcp --sport 25 -j ACCEPT

smtp

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

Instalo MariaDB:

apt install mariadb-server

Configuro el acceso remoto, editando el fichero /etc/mysql/mariadb.conf.d/50-server.cnf:

bind-address            = 0.0.0.0

Tras eso, reinicio el servicio y añado la regla para permitir el acceso desde mi cliente:

sudo iptables -A INPUT -s 172.29.0.42 -p tcp --dport 3306 -j ACCEPT
sudo iptables -A OUTPUT -d 172.29.0.42 -p tcp --sport 3306 -j ACCEPT

Ahora, en la siguiente captura, realizo una conexión con la base de datos desde el cliente, tras eso, desconecto la VPN para dejar de tener la IP que está autorizada, y vuelvo a intentar acceder, pero no puedo:

mariadb