Shorewall
De wikiGite
Gestion simplifiée de Netfilter (IPTables, filtre de paquets fourni avec le noyau linux).
Sommaire
Installation sur Debian
apt-get install shorewall
Configuration
Dans /etc/shorewall créer les fichiers :
zones
#ZONE TYPE OPTIONS IN OUT # OPTIONS OPTIONS fw firewall net ipv4 loc ipv4 drbd ipv4 #dmz ipv4
"fw" désigne la machine elle-même. Relier ces zones à des cartes réseau :
interfaces
#ZONE INTERFACE BROADCAST OPTIONS net eth1 detect routefilter loc eth0 detect drbd eth3 detect #dmz eth2 detect
Ici la carte eth3 est reliée en direct à un autre serveur pour un cluster DRBD. Il n'y a pas de zone DMZ. Indiquer ensuite la politique par défaut de chaque zone :
policy
#SOURCE DEST POLICY LOG LEVEL LIMIT:BURST loc net ACCEPT fw loc ACCEPT fw net ACCEPT drbd fw ACCEPT net all DROP info all all REJECT info
Il faut se souvenir que les paquets en sortie (de "fw" vers internet ou le réseau local) sont aussi bloqués par défaut. Soit on déclare une politique "ACCEPT" du serveur vers l'extérieur, soit il faudra penser à créer des règles dans les 2 sens si nécessaire.
rules
#ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE # PORT(S) PORTS(S) DEST LIMIT ACCEPT net fw tcp 22 - - 1/min:3 ACCEPT net fw tcp 80,443 ACCEPT net fw udp 53 Ping/ACCEPT net fw #Ping/ACCEPT fw net
La première règle limite à une connexion ssh par minute (avec un burst de 3/minute) venant de la même IP (évite les attaques SSH). L'avant-dernière utilise une macro ("Ping") pour éviter d'avoir à gérer les types de paquets de protocoles (icmp 8, 13, etc...). La dernière ligne n'est pas nécessaire puisqu'on a une politique "ACCEPT" du firewall vers l'extérieur.
Eventuellement, rules peut servir pour blacklister des adresses IP
DROP net:12.34.567.89 all
Optionnel : Traffic Shaping
Exemple : http://www.ckollars.org/shaping.html
tcdevices
#INTERFACE IN-BANDWIDTH OUT-BANDWIDTH eth1 1mbit 5mbit
tcclasses
#INTERFACE MARK RATE CEIL PRIORITY OPTIONS # mark/prio 1 for interactive (only remote administration, very little), # mark/prio 2 for DNS (normally much much less, this is a worst case ceiling, # the high priority is to minimize hangs as much as possible), and tcp-ack # mark/prio 3 for email in (usually uses above allocations too, runs quickly # when needed, but just passes allocation down most of the time), # mark/prio 4 for web (main legitimate use), # and mark/prio 5 is everything else (i.e. P2P, MMORPG, "bulk", etc.) # (last class is assumed to contain most discouraged uses and little else) # Class 5 guaranteed rate is very small to reduce # responsiveness so much MMORPGs aren't usable - mostly class 5 bandwidth # depends on "surplus" bandwidth cascading down unused from higher # priorities, and as a result is too bursty for interactive use eth1 1 full*2/100 full 1 eth1 2 full*20/100 full 2 tcp-ack eth1 3 full*10/100 full 3 eth1 4 full*64/100 full 4 eth1 5 full*4/100 full*8/10 5 default # Note sum of RATEs is exactly 100%.
La priorité 5 est celle par défaut pour les ports non stipulés au-dessus. Elle utilise 4% de la bande passante, et peut monter au maximum à 80% si la ligne est totalement libre.
Les autres priorités utilisent différentes parts de B.P., et sont attribuées aux ports désignés ci-dessous.
tcrules
#MARK SOURCE DESTINATION PROTOCOL PORT(S) SOURCE PORT(S) # Net effect is highest priority to admin/interactive, second to DNS in/out, # third to email in, fourth to web (both http and https) in/out, # and everything else last 1 0.0.0.0/0 0.0.0.0/0 tcp 20,21,22 1 0.0.0.0/0 0.0.0.0/0 udp 20,21,22 2 0.0.0.0/0 0.0.0.0/0 tcp 53 2 0.0.0.0/0 0.0.0.0/0 udp 53 3 0.0.0.0/0 0.0.0.0/0 tcp 110,143,25 3 0.0.0.0/0 0.0.0.0/0 udp 110,143,25 4 0.0.0.0/0 0.0.0.0/0 tcp 80,443
Optionnel : params
NET_IF=eth0 NET_BCAST=130.252.100.255 NET_OPTIONS=routefilter,routefilter
Permet de définir des variables shell utilisées dans les autres scripts (ici on utilisera $NET_IF, ou $NET_OPTIONS)
Enfin, éditer /etc/default/shorewall, et modifier la ligne startup
startup=1
Relancer shorewall à chaque modification.
/etc/init.d/shorewall restart
Voir l'application sur les iptables
iptables -L
TIPS
FORWARD:REJECT
Si des messages de la forme
kernel: Shorewall:FORWARD:REJECT:IN=vmbr0 OUT=vmbr0 PHYSIN=bond0 PHYSOUT=vmtab103i0d0 SRC=10.0.0.248 DST=10.0.0.254 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=29232 SEQ=15
apparaissent, c'est qu'on essaie de faire discuter une zone avec elle-même (typiquement : shorewall installé sur un host KVM, les paquets arrivent sur son interface bridge vmbr0 à destination d'un machine virtuelle, via cette même interface vmbr0).
Dans ce cas, dans le fichier interfaces remplacer routefilter par loc vmbr0 detect routeback
NOTES
- Les scripts sont interprétés, on peut donc y insérer du code. Par exemple dans rules :
SHELL for z in net loc dmz; do echo "ACCEPT $z fw tcp 22"; done
est équivalent à
ACCEPT net fw tcp 22 ACCEPT loc fw tcp 22 ACCEPT dmz fw tcp 22
Si le script prend plusieurs lignes, on peut utiliser :
BEGIN SHELL <shell script> END [ SHELL ]
- Les exclusions se font avec le caractère "!"
- On peut créer des macros (des macros sont livrées dans /usr/share/shorewall).
Par exemple macro.WEB :
#ACTION SOURCE DEST PROTO DEST SOURCE RATE USER/ # PORT(S) PORT(S) LIMIT GROUP PARAM - - tcp 80 # HTTP (plaintext) PARAM - - tcp 443 # HTTPS (over SSL)
Pourra ensuite être utilisée dans "rules" :
WEB(ACCEPT) net fw
Voir les détails sur http://www.shorewall.net/configuration_file_basics.htm