Les orages de cet hivers ont eu raison de ma Livebox, j’en profite donc pour proposer un article côté sécurité avec la mise en place d’une passerelle NAT.
Le système d’exploitation utilisé sera bien entendu un BSD avec le roi de la sécurité : OpenBSD en version 4.6.
Les machines du réseau LAN seront autorisées à surfer sur Internet et à faire du FTP. Le serveur HTTP et IMAP seront accessibles depuis Internet. On les place donc en DMZ pour augmenter la sécurité et protéger le réseau local.
Avant d’écrire les règles de filtrage, il faut activer le routage IP pour que les paquets transitent d’une carte réseau à l’autre. L’activation se fait à partir des sysctl.
$ cat /etc/sysctl.conf net.inet.ip.forwarding=1
Le routage sera persistant au prochain redémarrage du système. Pour une activation directe, exécutons la commande :
$ sysctl net.inet.ip.forwarding=1
La politique de filtrage sera la suivante :
| IP Src | IP Dest | Port Src | Port Dest | Protocol | Service | Action |
|---|---|---|---|---|---|---|
| NAT | ||||||
| 192.168.33.0/24 | * | * | * | * | * | NAT |
| 192.168.50.0/24 | * | * | * | * | * | NAT |
| Redirection | ||||||
| * | 172.16.0.154 | * | 80 | TCP | HTTP | 192.168.50.80:80 |
| * | 172.16.0.154 | * | 443 | TCP | HTTPS | 192.168.50.80:443 |
| * | 172.16.0.154 | * | 25 | TCP | SMTP | 192.168.50.25:25 |
| * | 172.16.0.154 | * | 143 | TCP | IMAP | 192.168.50.25:143 |
| Filtrage IP | ||||||
| * | * | * | * | * | * | Block |
| 192.168.33.0/24 | * | - | - | ICMP | PING | Pass |
| 192.168.33.0/24 | * | * | 53 | UDP | DNS | Pass |
| 192.168.50.0/24 | * | * | 53 | UDP | DNS | Pass |
| 192.168.33.0/24 | * | * | 80 | TCP | HTTP | Pass |
| 192.168.33.0/24 | * | * | 443 | TCP | HTTPS | Pass |
| 192.168.33.0/24 | * | * | 21 | TCP | FTP | Pass |
| 192.168.50.25 | * | * | 25 | TCP | SMTP | Pass |
Par conséquence, le fichier de configuration de PF est :
$ cat /etc/pf.conf
# --- Macros --- #
ext_if = "vic0"
int_if = "vic1"
dmz_if = "vic2"
ip_web = "192.168.50.80"
ip_mail = "192.168.50.25"
icmp_types = "echoreq"
# --- Options --- #
set skip on lo0
# --- Normalisation --- #
match in all scrub (reassemble tcp)
# --- NAT --- #
# FTP passif
nat-anchor "ftp-proxy/*"
nat on $ext_if inet from any to any -> $ext_if
# --- Redirection --- #
# FTP actif
rdr-anchor "ftp-proxy/*"
rdr pass on $int_if inet proto tcp from $int_if:network to any \
port ftp -> 127.0.0.1 port 8021
rdr pass on $ext_if inet proto tcp from any to $ext_if \
port { http, https } -> $ip_web
rdr pass on $ext_if inet proto tcp from any to $ext_if \
port { smtp, imap } -> $ip_mail
# --- Filtrage IP --- #
# Politique par defaut
block log all
# Antispoofing
antispoof log quick for { lo0, $ext_if, $int_if, $dmz_if }
# In
anchor "ftp-proxy/*"
pass in on $int_if inet proto icmp from $int_if:network to any \
icmp-type $icmp_types tag good
pass in inet proto udp from { $int_if:network, $dmz_if:network } \
to any port domain tag good
pass in on $int_if inet proto tcp from $int_if:network to any \
port { http, https } tag good
pass in on $dmz_if inet proto tcp from $ip_mail to any \
port smtp tag good
# Out
pass out on $ext_if tagged good
pass out on $ext_if inet proto tcp from $ext_if to any port ftp
L’utilisation de tag sur les paquets entrants valides, facilite la lisibilité et la maintenance des règles de filtrage.
Pour que les connexions FTP puissent sortir de la passerelle NAT, il nous faut utiliser un démon proxy : ftp-proxy. Packet Filter transmettra les paquets à ce démon par le biais de l’ancre anchor « ftp-proxy/* ». Ce démon se chargera d’activer les règles de filtrage adéquates tant que la connexion est active.
Activons le démon au démarrage du serveur :
$ vi /etc/rc.conf.local [...] ftpproxy_flags=""
Aucun paramètre n’est passé au démon, il se lancera avec comme options par défaut d’écouter sur l’interface de loopback sur le port 8021.
Pour un démarrage immédiat :
$ /usr/sbin/ftp-proxy $ netstat -na -f inet | grep 8021 tcp 0 0 127.0.0.1.8021 *.* LISTEN
La commande pfctl permet de contrôler le système de filtrage.
$ pfctl -n -v -f /etc/pf.conf [...]
En cas d’absence d’erreur dans le fichier, le détail des règles sera affiché.
$ pfctl -s info pfctl -s info Status: Disabled for 0 days 00:00:01 Debug: Urgent [...]
La passerelle est dans un état désactivée.
$ pfctl -e pf enabled
$ pfctl -d pf disabled
Pour finir, l’état de la passerelle peut être visualisé à partir de la commande pfctl ou par le binaire pftop.
Si vous avez des remarques ou juste pour dire un petit « merci », laissez un commentaire.
Bonjour,
Tout d’abord merci pour ce super tutorial très complet.
J’ai cependant sur petit problème sur mon réseau, je n’arrive pas à me connecter en ftp sur une machine distante depuis les machines de mon LAN.
Une petite idée peut-être ?
Merci d’avance
Bonjour,
Je viens de relire l’article et de m’apercevoir que je n’ai pas parlé du service ftp-proxy que l’on doit lancer sur le serveur.
J’ai modifié l’article en conséquence et merci pour le commentaire.
Cordialement