# Pare-feu

Il ouvre et ferme les porcs, c'est pas très halal.

# [Pare-feu] UFW

## Introduction

Le pare-feu **UFW** pour **Uncomplicated Firewall** est une surcouche à iptables qui permet de mettre en place des règles de pare-feu sur un système Linux en ligne de commande. Une version GUI de cette application a été implémentée (GUFW).

[![image.png](https://wiki.neopipe.fr/uploads/images/gallery/2024-01/scaled-1680-/yKaimage.png)](https://wiki.neopipe.fr/uploads/images/gallery/2024-01/yKaimage.png)

## Source

- [Documentation officielle Ubutnu sur UFW](https://doc.ubuntu-fr.org/ufw)

## Installation

```bash
sudo apt install -y ufw
```

## Manuel

#### Afficher les règles en place

```bash
ufw status [verbose]
```

#### Définir une politique par défaut

- **Autoriser le trafic entrant** suivant les règles par défaut :

```bash
ufw default allow
```

- **Refuser le trafic entrant** suivant les règles par défaut :

```bash
ufw default deny
```

- **Autoriser le trafic sortant** suivant les règles par défaut :

```bash
ufw default allow outgoing
```

- **Refuser le trafic sortant** suivant les règles par défaut :

```bash
ufw default deny outgoing
```

#### Ajout de règle de trafic entrant

- Syntaxe de règle des flux entrants :

```bash
ufw [allow|deny] [PORT]/[TCP|UDP]
```

<span style="text-decoration: underline;">Exemple :</span>

```bash
ufw allow 22/tcp
```

#### Ajout de règle de trafic sortant

- Syntaxe de règle des flux sortants :

```bash
ufw [allow|deny] outgoing [PORT]/[TCP|UDP]
```

<span style="text-decoration: underline;">Exemple :</span>

```bash
ufw allow outgoing 80/tcp
```

#### Activer le pare-feu

```bash
ufw enable
```

#### Désactiver le pare-feu

```bash
ufw disable
```

## Politique ICMP

Par défaut, UFW ne prend pas en charge la gestion de flux ICMP. Cependant, il est possible d'ajouter des règles iptables dans le fichier de configuration **/etc/ufw/before.rule** pour gérer ces flux.

#### Autoriser le ping entrant (actif par défaut)

```
# ok icmp codes for INPUT
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT
```

#### Autoriser le ping sortant (inactif par défaut)

```
# ok icmp codes for OUTPUT
-A ufw-before-output -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-output -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-output -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-output -p icmp --icmp-type echo-request -j ACCEPT
```

# [Pare-feu] IPTables

## Introduction

Certainement l'outil le plus complet et le plus fiable sur Linux pour créer vos règles de pare-feu et de routage, **iptables** remplira ses missions sans broncher.

Toutefois, sa multitude d'options fait qu'il est assez rugueux à prendre en main.

[![image.png](https://wiki.neopipe.fr/uploads/images/gallery/2024-01/scaled-1680-/PMRimage.png)](https://wiki.neopipe.fr/uploads/images/gallery/2024-01/PMRimage.png)

## Sources

- [Documentation Ubuntu - IPTables](https://doc.ubuntu-fr.org/iptables)

## Installation

#### Debian

```bash
apt install -y iptables
```

## Configuration pare-feu

#### Afficher les règles actives

```bash
iptables -L
```

<p class="callout warning">N'affiche que la table "filter". Ajoutez l'option -t suivie de "nat", "mangle" ou "raw" pour voir les tables correspondantes.</p>

#### Politiques par défaut

- Bloquer le trafic entrant :

```bash
iptables -P INPUT DROP
```

- Bloquer le trafic sortant :

```bash
iptables -P OUTPUT DROP
```

- Bloquer le forwarding :

```
iptables -P FORWARD DROP
```

- Autoriser le trafic entrant :

```bash
iptables -P INPUT ACCEPT
```

- Autoriser le trafic sortant :

```bash
iptables -P OUTPUT ACCEPT
```

- Autoriser le forwarding :

```bash
iptables -P FORWARD ACCEPT
```


#### Autoriser un flux entrant

Tout d'abord, il faut autoriser le trafic déjà établit en sortant :

```bash
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
```

Permettre les connexions entrantes sur un port spécifique, lancez la commande suivante :

```bash
iptables -A INPUT -p [tcp|udp] -i <IFACE> --dport <PORT> -j ACCEPT
```

#### Autoriser un flux sortant

Tout d'abord, il faut autoriser le trafic déjà établit en entrant :

```bash
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
```

Et bloquer les paquets invalides (en-têtes malveillantes etc) :

```bash
iptables -A INPUT --m conntrack --ctstate INVALID -j DROP
```

 Permettre les connexions sortantes sur un port spécifique, lancez la commande suivante :

```bash
iptables -A OUTPUT -p [tcp|udp] --dport <PORT> -j ACCEPT
```

#### Politique ICMP

- Autoriser le ping sortant :

```bash
iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
```

- Autoriser le ping entrant :

```bash
iptables -A INPUT -p icmp -j ACCEPT
```

- Bloquer le ping sortant :

```bash
iptables -A OUTPUT -p icmp -m conntrack --ctstate NEW,ESTABLISHED,RELATED -j DROP
```

- Bloquer le ping entrant :

```bash
iptables -A INPUT -p icmp -j DROP
```

#### Supprimer une règle

Tout d'abord affichez la table avec les numéros de ligne :

```bash
iptables -L --line-numbers
```

Admettons la table ci-dessous :

```bash
Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    DROP       icmp --  anywhere             anywhere
2    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh
3    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:www
4    ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:webmin

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  anywhere             anywhere            tcp spt:www
2    ACCEPT     tcp  --  anywhere             anywhere            tcp spt:12345
```

Dans le cas où on souhaite supprimer la deuxième ligne de la chaîne OUTPUT, on devrait taper cette commande :

```bash
iptables -D OUTPUT 2
```

#### Persistence des règles après redémarrage

Exportez vos règles IPv4 dans le fichier **/etc/iptables/rules.v4** et vos règles IPv6 dans le fichier **/etc/iptables/rules.v6** si vous en avez :

```bash
iptables-save > /etc/iptables/rules.v4
```

```bash
ip6tables-save > /etc/iptables/rules.v6
```

Installez le paquet **iptables-persistent** :

```bash
apt install -y iptables-persistent
```

## Exemple configuration

Voici un exemple de fichier de configuration qui autorise les connexions sortants sur les ports **80/TCP**, **443/TCP**, **53/UDP** et **80/TCP**, **22/TCP** en entrant :

```bash
# Generated by iptables-save v1.8.9 (nf_tables) on Sat Jan 20 13:17:34 2024
*filter
:INPUT DROP [30:2646]
:FORWARD DROP [0:0]
:OUTPUT DROP [371:23832]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p icmp -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
COMMIT
# Completed on Sat Jan 20 13:17:34 2024
```

<span style="color: rgb(187, 187, 187); font-family: var(--font-heading, var(--font-body)); font-size: 2.8275em; font-weight: 400;">Configuration NAT</span>

Tout d'abord, activez la fonctionnalité de **port forwarding** dans le fichier **/etc/sysctl.conf** en décommentant la ligne suivante :

```bash
net.ipv4.ip_forward=1
```

Puis créez les règles de routage suivantes :

```bash
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -i eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
```

<p class="callout info">Remplacez **eth0** par le nom de l'interface de votre premier réseau et faites de même pour **eth1** avec le deuxième réseau.</p>