Bonjour,
Ces dernières années j’ai surtout bossé avec CentOS et Slackware (et occasionnellement Ubuntu) sur des serveurs. J’ai utilisé Debian entre Potato et Sarge, mais j’ai un peu perdu la main. Alors voilà: j’aimerais utiliser mon pare-feu fait maison sur un serveur Debian. Jusque-là ça fonctionne à peu près comme ça devrait, juste que ça ne se lance pas au démarrage du serveur. J’aimerais faire les choses de façon plus ou moins propre et orthodoxe. Et bref, voici ce que j’ai.
- Quelques variables générales :
[code]# Fichier /etc/default/firewall
Démarrer le pare-feu : yes/no
FW_ACTIVE=yes
Démarrer le partage de connexion : yes/no
FW_MASQ=yes
Internet
IFACE_INET=eth0
Réseau local
IFACE_LAN=eth1
IFACE_LAN_IP=192.168.2.0/24[/code]
- Le script pour désactiver le pare-feu :
[code]#!/bin/bash
/etc/firewall/firewall-stop
Lire la configuration
. /etc/default/firewall
IPT=$(which iptables)
SYS=$(which sysctl)
Remettre iptables à zéro
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P POSTROUTING ACCEPT -t nat
$IPT -P PREROUTING ACCEPT -t nat
$IPT -P OUTPUT ACCEPT -t nat
$IPT -F
$IPT -F -t nat
$IPT -X
Désactiver le partage de connexion
$SYS -q -w net.ipv4.ip_forward=0[/code]
- Le script pour l’activer :
[code]#!/bin/bash
/etc/firewall/firewall-start
Lire la configuration
. /etc/default/firewall
IPT=$(which iptables)
SYS=$(which sysctl)
if [ $FW_ACTIVE != “yes” ]; then
echo "Firewall disabled in /etc/default/firewall."
exit 0
fi
Remise à zéro de toutes les règles de pare-feu
. /etc/firewall/firewall-stop
Les connexions entrantes sont bloquées par défaut
$IPT -P INPUT DROP
Les connexions destinées à être routées sont acceptées par défaut
$IPT -P FORWARD ACCEPT
Les connexions sortantes sont acceptées par défaut
$IPT -P OUTPUT ACCEPT
Faire confiance à nous-mêmes ;o)
$IPT -A INPUT -i lo -j ACCEPT
Ping
$IPT -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
$IPT -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
Connexions établies
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
FTP
/sbin/modprobe ip_conntrack_ftp
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 21 -j ACCEPT
SSH
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 22 -j ACCEPT
$IPT -A INPUT -p tcp -i $IFACE_INET --dport 22 -m state --state NEW \
-m recent --set --name SSH
$IPT -A INPUT -p tcp -i $IFACE_INET --dport 22 -m state --state NEW \
-m recent --update --seconds 60 --hitcount 2 --rttl --name SSH -j DROP
$IPT -A INPUT -p tcp -i $IFACE_INET --dport 22 -j ACCEPT
DNS
$IPT -A INPUT -p udp -i $IFACE_LAN --dport 53 -j ACCEPT
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 53 -j ACCEPT
DHCP
$IPT -A INPUT -p udp -i $IFACE_LAN --dport 67 -j ACCEPT
HTTP
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 80 -j ACCEPT
NTP
$IPT -A INPUT -p udp -i $IFACE_LAN --dport 123 -j ACCEPT
CUPS
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 631 -j ACCEPT
$IPT -A INPUT -p udp -i $IFACE_LAN --dport 631 -j ACCEPT
Samba
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 135 -j ACCEPT
$IPT -A INPUT -p udp -i $IFACE_LAN --dport 137 -j ACCEPT
$IPT -A INPUT -p udp -i $IFACE_LAN --dport 138 -j ACCEPT
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 139 -j ACCEPT
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 445 -j ACCEPT
NFS
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 111 -j ACCEPT
$IPT -A INPUT -p udp -i $IFACE_LAN --dport 111 -j ACCEPT
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 2049 -j ACCEPT
$IPT -A INPUT -p udp -i $IFACE_LAN --dport 2049 -j ACCEPT
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 32765:32769 -j ACCEPT
$IPT -A INPUT -p udp -i $IFACE_LAN --dport 32765:32769 -j ACCEPT
Squid
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 3128 -j ACCEPT
$IPT -A INPUT -p udp -i $IFACE_LAN --dport 3128 -j ACCEPT
$IPT -t nat -A PREROUTING -i $IFACE_LAN -p tcp ! -d 192.168.2.1 \
–dport 80 -j REDIRECT --to-port 3128
Apt-Cacher
$IPT -A INPUT -p tcp -i $IFACE_LAN --dport 3142 -j ACCEPT
Log
$IPT -A INPUT -j LOG --log-prefix "+++ IPv4 packet rejected +++ "
$IPT -A INPUT -j REJECT
Partage de connexion
if [ $FW_MASQ = ‘yes’ ]; then
$IPT -t nat -A POSTROUTING -o $IFACE_INET -s $IFACE_LAN_IP -j MASQUERADE
$SYS -q -w net.ipv4.ip_forward=1
fi[/code]
- Et enfin, un script pour intégrer tout ça dans le système Init-V:
[code]#!/bin/sh -e
Script d’initialisation /etc/init.d/firewall
BEGIN INIT INFO
Provides: firewall
Required-Start: networking
Required-Stop:
Default-Start: S
Short-Description: Start firewall and masquerading
END INIT INFO
Fonctions de base
. /lib/lsb/init-functions
Fonctions pour start, stop et restart
case “$1” in
start|restart)
log_begin_msg “Starting firewall and masquerading…”
. /etc/firewall/firewall-start
log_end_msg 0
;;
stop)
log_begin_msg “Stopping firewall and masquerading…”
. /etc/firewall/firewall-stop
log_end_msg 0
;;
*)
log_success_msg "Usage: xxx {start|stop|restart}"
exit 1
;;
esac
exit 0[/code]
Bien sûr, j’ai placé les droits d’exécution là où il fallait. À présent, lorsque j’invoque manuellement 'service firewall start|stop|restart, ça marche très bien (d’après iptables -L).
J’ai voulu lancer le pare-feu proprement au démarrage. Pour ce faire, je me suis servi de sysv-rc-conf.
[root@bernadette:~] # sysv-rc-conf --list firewall
firewall 2:on 3:on 4:on 5:on
Malheureusement, cela n’a aucune incidence, et le pare-feu ne se lance pas au démarrage du serveur.
Quelqu’un a une idée de ce que j’ai bien pu oublier ici ?
Un gentil bonjour de la garrigue ensoleillée.