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
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)
|