Outils personnels

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
Puis dans /etc/shorewall créer les fichiers :
+
Si la version de Shorewall est trop vieille dans les paquets Debian, installation manuelle :
* zones
+
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
+
== interfaces ==
 
  #ZONE      INTERFACE    BROADCAST    OPTIONS
 
  #ZONE      INTERFACE    BROADCAST    OPTIONS
  net        eth1          detect       dhcp,routefilter
+
  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
+
== 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
+
== 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).

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