Un firewall simple sous Linux avec «Ferm»

Attention: Article Technique!

Dans le but de faire profiter la postérité et ma mémoire personnelle voici mon premier post d’une série d’articles spécialisée sur Linux.

Ces articles proviennent de ma voûte documentaire professionnelle et personnelle.

Évidemment pour les publier ici je dois censurer les détails sensibles, vous me comprendrez (!)

Le fait de les avoir dans le format Wiki Markup de Confluence… et les traduire ici demande du temps pour les reformatter pour mon blogue.

D’autres articles spécialisés Debian Linux

D’autres articles technique (pour Debian Linux) seront aussi disponibles dans les prochaines semaines.

Voici une liste de quelques uns que je compte publier:

  1. Monter une machine en SNMP v2c en lecture seule
  2. Permettre des updates aux serveurs NTP a l’heure
  3. Installer VMware server 2 sur Debian
  4. Augumenter le niveau de sécurité pour Infra Publique sous Debian
  5. Procédure configuration SYSLOG-NG vers un serveur de log

J

Installer et configurer

En fait, sous Debian c’est pas très compliqué, on ajoute le paquet, puis on le configure comme mentionné plus bas.

# apt-get update
# apt-get install ferm libnet-dns-perl perl iptables

J’ai fait une petite version qui permet d’utiliser des variables et mettre le code un peu plus clean (d’un point de vue programmeur).

Vous pouvez remplacer par ce code ci:

# -*- shell-script -*-
#
#  Configuration file for ferm(1).
#
# vmware-mgmt = 8333
# vmware-console = 902
# ntop = 3000
# ... ports ajoutes dans /etc/services
 
# Source http://www.krzywanski.net/archives/90
# Interfaces
@def $DEV_LOCAL = lo;
@def $DEV_LAN = (eth1 vmnet1 vmnet8);
@def $DEV_INTERNET = eth0;
 
# Ports
@def $PORTS = (ntp name http https smtp);
 
# Known IPs
@def $SSH_ALLOWED = (69.159.234.55 192.168.2.1);
@def $SSH_DYNDNS = @resolve((somehost.renoirboulanger.com someotherhost.somenetwork.net));
 
# SSH Clients
@def $SSH_CLIENTS = ($SSH_ALLOWED $SSH_DYNDNS);
 
table filter {
    chain INPUT {
        policy DROP;
 
        # connection tracking
        mod state state INVALID DROP;
        mod state state (ESTABLISHED RELATED) ACCEPT;
 
        # allow local packages
        interface $DEV_LOCAL ACCEPT;
        interface $DEV_LAN ACCEPT;
 
        # allow ping from the administrator's network
        interface $DEV_INTERNET saddr ($SSH_DYNDNS $SSH_ALLOWED) proto icmp icmp-type echo-request ACCEPT;
 
        # respond to ping
        proto icmp icmp-type echo-request ACCEPT;
 
        # allow SSH connections
        proto tcp dport 2522 ACCEPT;
 
        proto tcp dport $PORTS ACCEPT;
    }
    chain OUTPUT {
        policy ACCEPT;
 
        # connection tracking
        mod state state INVALID DROP;
        mod state state (ESTABLISHED RELATED) ACCEPT;
    }
    chain FORWARD {
        policy DROP;
 
        # connection tracking
        mod state state INVALID DROP;
        mod state state (ESTABLISHED RELATED) ACCEPT;
    }
}

Pour plus de détails a propos de la syntaxe, voir la documentation.

Autres ressources

J’ai utilisé, entre autres ces ressources pour m’inspirer de ce mini-tutoriel

  1. Securing Debian HOWTO
  2. Linux Security HOWTO
  3. Firewall Tools
  4. Debian Security
  5. Debian Policies