juil
18
Posted on 18-07-2010
Filed Under (Réseau) by admin

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.

Schéma réseau :

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.

Routage IP

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

Règles de filtrage

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.

Démon ftp-proxy

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

Gestion de la passerelle

La commande pfctl permet de contrôler le système de filtrage.

  • Vérifier la syntaxe des règles 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é.

  • Etat du moteur de filtrage
  • $ 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.

  • Activation / Désactivation
  • $ 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.

(2) Comments    Read More   

Commentaires

dark69 le 22 mai 2011 à 12 h 21 min

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


jaax le 23 mai 2011 à 19 h 43 min

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


Poster un commentaire
Votre pseudo:
Votre e-mail:
Votre site:
Votre commentaire: