Shorewall : Différence entre versions
De wikiGite
(20 révisions intermédiaires par 2 utilisateurs non affichées) | |||
Ligne 1 : | Ligne 1 : | ||
− | Gestion simplifiée de Netfilter (IPTables, filtre de paquets fourni avec noyau linux). | + | Gestion simplifiée de Netfilter (IPTables, filtre de paquets fourni avec le noyau linux). |
− | Installation sur Debian | + | = Installation sur Debian = |
apt-get install shorewall | apt-get install shorewall | ||
− | + | Si la version de Shorewall est trop vieille dans les paquets Debian, installation manuelle : | |
− | + | cd /root/install | |
+ | wget http://france.shorewall.net/pub/4.5/shorewall-4.5.21/shorewall-core-4.5.21.tgz | ||
+ | wget http://france.shorewall.net/pub/4.5/shorewall-4.5.21/shorewall-4.5.21.tgz | ||
+ | |||
+ | tar -xvzf shorewall-core-4.5.21.tgz | ||
+ | cd shorewall-core-4.5.21 | ||
+ | cp shorewallrc.debian shorewallrc | ||
+ | ./install.sh | ||
+ | # BUG 4.5.21 : | ||
+ | #vi /usr/share/shorewall/lib.cli | ||
+ | # chercher ".rstore" et remplacer par ".restore" | ||
+ | |||
+ | cd .. | ||
+ | tar -xvzf shorewall-4.5.21.tgz | ||
+ | cd shorewall-4.5.21 | ||
+ | ./install.sh | ||
+ | |||
+ | update-rc.d shorewall remove | ||
+ | update-rc.d shorewall defaults | ||
+ | |||
+ | = Installation sur CentOS = | ||
+ | Installer le [http://wiki.kogite.fr/index.php/D%C3%A9p%C3%B4ts_compl%C3%A9mentaires#EPEL dépôt EPEL], puis : | ||
+ | yum install --enablerepo=epel shorewall | ||
+ | |||
+ | = Configuration = | ||
+ | Dans /etc/shorewall créer les fichiers : | ||
+ | == zones == | ||
#ZONE TYPE OPTIONS IN OUT | #ZONE TYPE OPTIONS IN OUT | ||
# OPTIONS OPTIONS | # OPTIONS OPTIONS | ||
Ligne 13 : | Ligne 39 : | ||
#dmz ipv4 | #dmz ipv4 | ||
"fw" désigne la machine elle-même. Relier ces zones à des cartes réseau : | "fw" désigne la machine elle-même. Relier ces zones à des cartes réseau : | ||
− | + | == interfaces == | |
#ZONE INTERFACE BROADCAST OPTIONS | #ZONE INTERFACE BROADCAST OPTIONS | ||
− | net eth1 detect | + | net eth1 detect routefilter |
loc eth0 detect | loc eth0 detect | ||
drbd eth3 detect | drbd eth3 detect | ||
#dmz eth2 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 : | 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 | #SOURCE DEST POLICY LOG LEVEL LIMIT:BURST | ||
loc net ACCEPT | loc net ACCEPT | ||
Ligne 29 : | Ligne 55 : | ||
all all REJECT 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. | 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 | #ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE | ||
# PORT(S) PORTS(S) DEST LIMIT | # PORT(S) PORTS(S) DEST LIMIT | ||
ACCEPT net fw tcp 22 - - 1/min:3 | ACCEPT net fw tcp 22 - - 1/min:3 | ||
ACCEPT net fw tcp 80,443 | ACCEPT net fw tcp 80,443 | ||
− | ACCEPT net fw udp 53 | + | ACCEPT net fw udp 53 - - 100/min:300 |
Ping/ACCEPT net fw | Ping/ACCEPT net fw | ||
#Ping/ACCEPT fw net | #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. | + | 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, idem pour DNS). 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 == | ||
+ | Manuel : http://www.shorewall.net/traffic_shaping.htm | ||
+ | |||
+ | 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*5/10 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. | Relancer shorewall à chaque modification. | ||
/etc/init.d/shorewall restart | /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 |
Version actuelle datée du 6 novembre 2013 à 13:50
Gestion simplifiée de Netfilter (IPTables, filtre de paquets fourni avec le noyau linux).
Sommaire
Installation sur Debian
apt-get install shorewall
Si la version de Shorewall est trop vieille dans les paquets Debian, installation manuelle :
cd /root/install wget http://france.shorewall.net/pub/4.5/shorewall-4.5.21/shorewall-core-4.5.21.tgz wget http://france.shorewall.net/pub/4.5/shorewall-4.5.21/shorewall-4.5.21.tgz tar -xvzf shorewall-core-4.5.21.tgz cd shorewall-core-4.5.21 cp shorewallrc.debian shorewallrc ./install.sh # BUG 4.5.21 : #vi /usr/share/shorewall/lib.cli # chercher ".rstore" et remplacer par ".restore" cd .. tar -xvzf shorewall-4.5.21.tgz cd shorewall-4.5.21 ./install.sh update-rc.d shorewall remove update-rc.d shorewall defaults
Installation sur CentOS
Installer le dépôt EPEL, puis :
yum install --enablerepo=epel 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 - - 100/min:300 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, idem pour DNS). 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
Manuel : http://www.shorewall.net/traffic_shaping.htm
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*5/10 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