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.

251 lines
7.5 KiB
Markdown

---
title: "Cortafuegos I: De nodo con iptables"
date: 2023-02-15T23:46:36+01:00
draft: false
image: featured.png
categories:
- documentación
- Seguridad y Alta Disponibilidad
tags:
- Cortafuegos
- iptables
---
Enunciado: [https://fp.josedomingo.org/seguridadgs/u03/ejercicio1.html](https://fp.josedomingo.org/seguridadgs/u03/ejercicio1.html)
## Preparación
**Limpiamos las reglas previas**
```bash
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
```bash
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
```bash
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**
```bash
iptables -P INPUT DROP
iptables -P OUTPUT DROP
```
Ahora pruebo que se han aplicado, por ejemplo, haciendo un ping:
![ping](https://i.imgur.com/GgWurZe.png)
**Permitimos tráfico por la interfaz de loopback**
```bash
iptables -A INPUT -i lo -p icmp -j ACCEPT
iptables -A OUTPUT -o lo -p icmp -j ACCEPT
```
**Peticiones y respuestas del protocolo ICMP**
```bash
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](https://i.imgur.com/eTTjjEV.png)
**Consultas y respuestas DNS**
```bash
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](https://i.imgur.com/Ep1vuVz.png)
**Tráfico HTTP**
```bash
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](https://i.imgur.com/aB17haB.png)
**Tráfico HTTPS**
```bash
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](https://i.imgur.com/BzyJeje.png)
**Tráfico HTTP/HTTPs**
Los dos puntos anteriores se pueden resumir en una sola regla
```bash
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**
```bash
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](https://i.imgur.com/1TbKhY2.png)
## Ejercicios
### 1. Permite poder hacer conexiones ssh al exterior
Para esto uso las reglas de ssh citas anteriormente:
```bash
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
```bash
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](https://i.imgur.com/8h6tmFh.png)
![ssh2](https://i.imgur.com/xhNYful.png)
### 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
```bash
iptables -L -n -v --line-numbers
```
![iptables](https://i.imgur.com/VLs4Xd7.png)
La regla que permite el acceso está en la dirección 8; ahora creo la regla con la ip de mi máqunina:
```bash
iptables -I INPUT 8 -s 172.29.0.42 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j DROP
```
![iptables2](https://i.imgur.com/T361Yz0.png)
Ahora compruebo que no puedo acceder al servidor web desde mi máquina
![web](https://i.imgur.com/9xydTG9.png)
### 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
```bash
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:
```bash
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](https://i.imgur.com/May5Dwa.png)
Y si que puedo usando el dns, `dig@192.168.202.2 www.josedomingo.org`:
![dns2](https://i.imgur.com/1O9FXoM.png)
### 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](https://i.imgur.com/HbcTZPw.png)
Está en el lugar 5. Ahora creo la regla con la ip de josedomingo.org:
```bash
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](https://i.imgur.com/Xp4mGZu.png)
Ahora compruebo que no puedo acceder al servidor web de josedomingo.org
![web](https://i.imgur.com/POagTDZ.png)
y si que puedo acceder a portquiz.net:
![web2](https://i.imgur.com/f0SccEm.png)
### 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:
```bash
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](https://i.imgur.com/tBoRNWu.png)
### 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:
```bash
apt install mariadb-server
```
Configuro el acceso remoto, editando el fichero `/etc/mysql/mariadb.conf.d/50-server.cnf`:
```bash
bind-address = 0.0.0.0
```
Tras eso, reinicio el servicio y añado la regla para permitir el acceso desde mi cliente:
```bash
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](https://i.imgur.com/1Z8hCqe.png)