Debian - Shorewall - 2 interfaces
Un article de Wiki.OmBreNoiRe.net.
|
Sommaire → Install → Aptitude → Locales → SSHd → Shorewall → 6wall → DHCP3-server → Bind9 → VsFTPd → Apache/MySQL → Mail → BackupManager |
|
Préambule — 1 interface (Serveur Distant) — 2 interfaces (Serveur Local/Partage connexion internet) |
But de la configuration
Vous avez serveur qui ne possède 2 interfaces (cartes réseau), vous souhaitez qu'il partage votre connexion internet en le protégeant des intrusions grâce à un firewall efficace, mais vous souhaitez aussi pouvoir héberger vos sites web directement sur le serveur. Vous êtes au bon endroit !
Grâce à cette configuration, on filtre seulement les connexions qui vont vers le serveur et les ordinateurs du réseau local, à contrario le serveur et les autres ordinateurs locaux peuvent envoyer des requêtes vers l'extérieur sans limitation.
Comme d'habitude, c'est du copier-coller, pour plus d'informations, je vous invite à aller sur le site de Shorewall qui est très bien documenté.
Pré-requis
Avant d'installer et paramétrer Shorewall, il faut s'assurer que votre configuration réseau est correcte. Pour cela voici différents fichiers que vous devez éditer afin qu'il contienne à peu prêt les mêmes informations (à adapter pour votre configuration bien sûr) :
Le fichier /etc/hostname
Il contient le nom de votre machine.
monordi
Le fichier /etc/hosts
Il contient le nom de votre machine sur chacune des adresses des IPs.
# Do not remove the following line, or various programs # that require network functionality will fail. # IPv4 127.0.0.1 localhost.localdomain localhost 192.168.0.1 monordi.monrezo.rez monordi 1.2.3.4 monordi.mondomaine.net monordi
Plusieurs remarques pour ce fichier :
- Remplacer 1.2.3.4 par votre IP fixe (celle fournie pas votre provider, free par exemple)
- Remplacer monordi par votre nom de machine (le même que dans /etc/hostname)
- Remplacer mondomaine.net par votre domaine auquel vous avez rattaché votre machine. Par exemple si votre adresse IPest 82.136.78.144 et que votre domaine est trucdeouf.fr, il vous faudra déclarer dans vos zones DNS (sur le serveur par la suite à l'étape du serveur DNS Bind9 ou chez votre registrar si vous ne désirer pas gérer vos DNS pour ce domaine).
- 192.168.0.1 est l'adresse désormais fixe de votre serveur pour le réseau local, ne la modifier pas
- monrezo.rez est l'adresse d'un domaine local, vous pouvez le modifier par ce que vous voulez (en finissant par .rez) mais n'oublier pas que vous avez fait cette modification quand vous allez configurer votre serveur DNS.
Le fichier /etc/network/interfaces
Il contient la configuration de vos différentes interfaces.
Je pars du principe que votre interface pour internet s'appelle eth0 et que celle pour le reseau local est eth1, si pour une raison ou pour une autre, ce n'était pas le cas etc... veuillez remplacer dans les fichiers de configuration qui vont suivre par vos noms d'interfaces !
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 1.2.3.4
netmask 255.255.255.0
network 1.2.3.0
broadcast 1.2.3.255
gateway 1.2.3.1
# Carte pour reseau local
auto eth1
iface eth1 inet static
address 192.168.0.1
netmask 255.255.255.0
Ce qu'il faut modifier :
- 1.2.3.4 : Par votre adresse IP, par exemple 82.136.78.144 (celle fournie pas votre provider, free par exemple)
- 255.255.255.0 (pour eth0) : A vous de vérifier avec celui qui est mis par défaut ou auprès de votre fournisseur d'accès (généralement c'est 255.255.255.0)
- 1.2.3.0 : Généralement c'est votre adresse IP qui finie par 0, soit avec l'exemple, 82.136.78.0
- 1.2.3.255 : Idem mais avec 255, soit avec l'exemple, 82.136.78.255
- 1.2.3.1 : Idem mais avec 1, soit avec l'exemple, 82.136.78.1.
Tous ces paramètres sont fournis par votre fournisseur, à vous d'en vérifier l'exactitude, si vous commettez une erreur dans ce fichier, le prochain reboot sera fatal et vous aller être condamné à dépanner votre machine
Si vous n'avez pas d'adresse IP fixe, il vous faut remplacer la configuration d'eth0 par celle-ci dans /etc/network/interfaces :
[...] # The primary network interface allow-hotplug eth0 iface eth0 inet dhcp [...]
Installation de Shorewall et ULOGd
Comme d'habitude grâce à Debian tout va très vite :
Cela va normalement installer d'autres paquets, tout cela est normal.
ULOGd va permettre de rediriger les logs de Shorewall dans un fichier spécifique et vous permettre de voir plus clair dans vos logs.
Configuration de ULOGd
- Il faut juste remplacer le fichier /etc/ulogd.conf par celui là :
# Example configuration for ulogd # $Id: ulogd.conf.in 714 2005-02-19 21:33:43Z laforge $ # Adapted to Debian by Achilleas Kotsis <achille@debian.gr> [global] ###################################################################### # GLOBAL OPTIONS ###################################################################### # netlink multicast group (the same as the iptables --ulog-nlgroup param) nlgroup=1 # logfile for status messages logfile="/var/log/ulogd.log" # loglevel: debug(1), info(3), notice(5), error(7) or fatal(8) loglevel=5 # socket receive buffer size (should be at least the size of the # in-kernel buffer (ipt_ULOG.o 'nlbufsiz' parameter) rmem=131071 # libipulog/ulogd receive buffer size, should be > rmem bufsize=150000 ###################################################################### # PLUGIN OPTIONS ###################################################################### # We have to configure and load all the plugins we want to use # general rules: # 1. load the plugins _first_ from the global section # 2. options for each plugin in seperate section below # # ulogd_BASE.so - interpreter plugin for basic IPv4 header fields # you will always need this plugin="/usr/lib/ulogd/ulogd_BASE.so" # output plugins. plugin="/usr/lib/ulogd/ulogd_LOGEMU.so" #plugin="/usr/lib/ulogd/ulogd_OPRINT.so" #plugin="/usr/lib/ulogd/ulogd_MYSQL.so" #plugin="/usr/lib/ulogd/ulogd_PGSQL.so" #plugin="/usr/lib/ulogd/ulogd_SQLITE3.so" #plugin="/usr/lib/ulogd/ulogd_PCAP.so" [LOGEMU] file="/var/log/shorewall" sync=1 [OPRINT] file="/var/log/ulog/pktlog.log" [MYSQL] table="ulog" pass="changeme" user="laforge" db="ulogd" host="localhost" [PGSQL] table="ulog" schema="public" pass="changeme" user="postgres" db="ulogd" host="localhost" [SQLITE3] table="ulog" db="/path/to/sqlite/db" buffer=200 [PCAP] file="/var/log/ulog/pcap.log" sync=1
- Et créer le fichier de log, comme ceci et on redémarre :
root@monordi:~# chgrp adm /var/log/shorewall
root@monordi:~# reboot
Configuration de Shorewall
Presque tout se passe dans /etc/shorewall
Sauvegarde configuration d'origine
Comme je vous donne une configuration clé en main, il vaut mieux remplacer directement les fichiers installés par défaut par les miens. Mais on sauvegarde tout de même.
root@monordi:~# mkdir orig
root@monordi:~# mv * orig
mv: ne peut déplacer `orig' vers un sous-répertoire de lui-même `orig/orig'
root@monordi:~# mv orig/Makefile .
Création des fichiers de configuration
Avec emacs, il vous suffit de créer chacun des fichiers suivants :
Le fichier /etc/shorewall/shorewall.conf
La seule chose à modifier sur ce fichier est DISABLE_IPV6=Yes par DISABLE_IPV6=No si vous souhaitez utiliser l'IPv6 (n'oubliez pas d'installer un firewall IPv6 dans ce cas !).
# # /etc/shorewall/shorewall.conf V3.2 # STARTUP_ENABLED=Yes VERBOSITY=2 LOG=ULOG LOGFILE=/var/log/shorewall LOGFORMAT="Shorewall:%s:%s:" LOGTAGONLY=No LOGRATE= LOGBURST= LOGALLNEW= BLACKLIST_LOGLEVEL= MACLIST_LOG_LEVEL=$LOG TCP_FLAGS_LOG_LEVEL=$LOG RFC1918_LOG_LEVEL=$LOG SMURF_LOG_LEVEL=$LOG LOG_MARTIANS=No IPTABLES= PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:/usr/local/sbin SHOREWALL_SHELL=/bin/sh SUBSYSLOCK="" MODULESDIR= CONFIG_PATH=/etc/shorewall:/usr/share/shorewall RESTOREFILE= IPSECFILE=zones IP_FORWARDING=On ADD_IP_ALIASES=Yes ADD_SNAT_ALIASES=No RETAIN_ALIASES=No TC_ENABLED=Internal TC_EXPERT=No CLEAR_TC=Yes MARK_IN_FORWARD_CHAIN=No CLAMPMSS=No ROUTE_FILTER=Yes DETECT_DNAT_IPADDRS=No MUTEX_TIMEOUT=60 ADMINISABSENTMINDED=Yes BLACKLISTNEWONLY=Yes DELAYBLACKLISTLOAD=No MODULE_SUFFIX= DISABLE_IPV6=Yes BRIDGING=No DYNAMIC_ZONES=No PKTTYPE=Yes RFC1918_STRICT=No MACLIST_TABLE=filter MACLIST_TTL= SAVE_IPSETS=No MAPOLDACTIONS=No FASTACCEPT=No IMPLICIT_CONTINUE=Yes HIGH_ROUTE_MARKS=No BLACKLIST_DISPOSITION=DROP MACLIST_DISPOSITION=REJECT TCP_FLAGS_DISPOSITION=DROP
Le fichier /etc/shorewall/blacklist
Vierge pour l'instant, mais si vous êtes amenés à bloquer des IP, il vous suffira de les ajouter avant la #LAST LINE.
# # Shorewall version 3.2 - Blacklist File # ############################################################################### #ADDRESS/SUBNET PROTOCOL PORT #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
- En ajoutant une IP vous lui interdisez de se connecter à vous, sur TOUS les ports, mais VOUS pouvez encore la contacter.
- Veuillez à blacklister uniquement TEMPORAIREMENT pour 2 raisons :
- Certaines IP sont dynamiques
- Les IP fixes peuvent changer de propriétaire
- Après avoir modifié ce fichier n'oubliez pas de faire un make dans le répertoire /etc/shorewall.
Le fichier /etc/shorewall/interfaces
# # Shorewall version 3.2 - Interfaces File for two interfaces configuration. # ############################################################################### #ZONE INTERFACE BROADCAST OPTIONS net eth0 detect routefilter,norfc1918,dhcp,tcpflags,blacklist,nosmurfs loc eth1 detect dhcp,tcpflags,maclist,nosmurfs #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
Le fichier /etc/shorewall/maclist
Ce fichier contient la liste des adresses MAC des cartes réseaux du réseau local autorisées à se connecter sur le serveur. En effet avec cette configuration, aucun ordinateur ne pourra se connecter à votre réseau sans avoir été précédemment déclaré.
Si vous ne souhaitez pas que cette option soit active, il faut enlever le mot clé maclist dans le fichier /etc/shorewall/interfaces
# # Shorewall version 3.2 - Maclist File # ############################################################################### #INTERFACE MAC IP ADDRESSES (Optional) #LAST LINE -- ADD YOUR ENTRIES BEFORE THIS ONE -- DO NOT REMOVE
Pour autoriser une adresse MAC c'est très simple, il suffit d'ajouter la ligne suivante avant la #LAST LINE :
eth1 00:11:AA:BB:CC:DD 192.168.0.2 #autreordi
#autreordi est un commentaire, il n'est donc pas interprété.
Je vous conseil de mettre à chaque fois le nom de la machine en commentaire à la fin d'une ligne d'ajout d'adresse MAC, cela permet de mieux s'y retrouver.Le fichier /etc/shorewall/masq
Ce fichier sert à indiquer à Shorewall fait quel interface on veut faire le partage de la connexion (NAT).
# # Shorewall version 3.2 - Masquerade file For Two Interfaces. # ############################################################################### #INTERFACE SUBNET ADDRESS PROTO PORT(S) IPSEC eth0 eth1 #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE
Le fichier /etc/shorewall/policy
Dans ce fichier est spécifié le comportement général de Shorewall (sans qu'aucune règle ne soit mis en place dans le fichier /etc/shorewall/rules).
# # Shorewall version 3.2 - Policy File for for two-interface configuration. # ############################################################################### #SOURCE DEST POLICY LOG LEVEL LIMIT:BURST # # Policies for traffic originating from the local LAN (loc) # # If you want to force clients to access the Internet via a proxy server # on your firewall, change the loc to net policy to REJECT info. loc net ACCEPT loc $FW REJECT $LOG loc all REJECT $LOG # # Policies for traffic originating from the firewall ($FW) # $FW net ACCEPT $FW loc REJECT $LOG $FW all REJECT $LOG # # Policies for traffic originating from the Internet zone (net) # net $FW DROP $LOG net loc DROP $LOG net all DROP $LOG # THE FOLLOWING POLICY MUST BE LAST all all REJECT $LOG # #LAST LINE -- ADD YOUR ENTRIES ABOVE THIS LINE -- DO NOT REMOVE
Le fichier /etc/shorewall/routestopped
# # Shorewall version 3.2 - Routestopped file for two interfaces. # ############################################################################### #INTERFACE HOST(S) eth1 - #LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE
Le fichier /etc/shorewall/zones
# # Shorewall version 3.2 - Zones File for two-interface configuration. # ############################################################################### #ZONE TYPE OPTIONS IN OUT # OPTIONS OPTIONS fw firewall net ipv4 loc ipv4 #LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE
Le fichier /etc/shorewall/rules
On attaque le fichier de configuration que VOUS allez devoir personnaliser. Je vous donne ici la configuration qu'il faut avec les services que je vous fais installer par la suite. Si vous ne voulez pas, par exemple, installer de serveur ftp, n'oubliez pas de fermer les ports en commentant (avec #) ou supprimant les lignes dans le fichier /etc/shorewall/rules.
# # Shorewall version 3.2 - Rules File for one-interface configuration. # ############################################################################################################# #ACTION SOURCE DEST PROTO DEST SOURCE ORIGINAL RATE USER/ # PORT PORT(S) DEST LIMIT GROUP # On accepte le ping LOCAL et INTERNET ACCEPT loc $FW icmp 8 ACCEPT net $FW icmp 8 # On accepte de pinger l'exterieur ACCEPT $FW loc icmp # Pour le serveur SMTP ACCEPT net $FW tcp 25 ACCEPT loc $FW tcp 25 # Pour le serveur POP ACCEPT net $FW tcp 110 ACCEPT loc $FW tcp 110 # Accept FTP (port NON standard et mode PASSIF) ACCEPT net $FW tcp 891 ACCEPT net $FW tcp 890 ACCEPT net $FW tcp 44600:44700 ACCEPT loc $FW tcp 891 ACCEPT loc $FW tcp 890 ACCEPT loc $FW tcp 44600:44700 # Accept DNS ACCEPT loc $FW tcp 53 ACCEPT loc $FW udp 53 ACCEPT net $FW tcp 53 ACCEPT net $FW udp 53 # Pour le serveur DHCP en LOCAL exclusivement ACCEPT $FW loc udp 67 ACCEPT $FW loc udp 68 ACCEPT loc $FW udp 67 ACCEPT loc $FW udp 68 # On interdit le port 113 bizarrement rester ouvert DROP net $FW tcp 113 DROP net $FW udp 113 # on accepte SSH (depuis interne et externe - port NON standard) ACCEPT net $FW tcp 52 ACCEPT loc $FW tcp 52 # SERVEUR WEB (En interne et Externe) ACCEPT loc $FW tcp 80 ACCEPT net $FW tcp 80 ACCEPT loc $FW tcp 443 ACCEPT net $FW tcp 443 #LAST LINE - ADD YOUR ENTRIES ABOVE THIS ONE - DO NOT REMOVE
Shorewall ne ferme pas le port 113 de façon automatique, à vous de le spécifier (ce qui est fait ici)
La structure de se fichier est simple, pour ouvrir un port vous n'avez qu'à ajouter une ligne sous se format :
ACCEPT net $FW PROTOCOLE PORT
En remplaçant :
- PROTOCOLE par tcp ou udp
- PORT par le numéro du port d'écoute
Vous pouvez d'ailleurs cibler un peu plus vos requêtes:
- Mettre net:IP IP étant une IP externe, en faisant cela vous n'accepter les requêtes QUE de cette IP
- Mettre $FW:IP IP étant l'une de vos IP sur le serveur (utile quand on a plusieurs IP externe, ce qui n'est pas le cas généralement pour une connexion internet classique.)
- Faites des règles les plus précises possibles (à chaque fois que vous ajouter une règle, vous faites un trou dans votre firewall. Il vaut mieux plein de petit trou que peu de grand trou.
- Après avoir modifié ce fichier n'oubliez pas de faire un make dans le répertoire /etc/shorewall.
Il existe d'autre types de règles comme DNAT ou REDIRECT par exemple qui peut vous permettre de rediriger un port.
Mettons que vous souhaitiez vous connecter depuis votre faculté sur votre serveur en SSH, mais que la fac bloque votre port non standard, mais ouvre le port standard. Vous pouvez spécifier une règle qui va rediriger les requetes faites depuis votre fac sur le port standard vers le port non standard comme ceci :
REDIRECT net:IP.DE.VOTRE.FAC 52 tcp 22 - -
Autre exemple, vous avez sur l'une des machines réseau un programme qui tourne en local, comme par exemple, un serveur web. Et voulez y accéder depuis internet par l'adresse web http://votre.adresse.IP:5080 :
DNAT net loc:192.168.0.2 tcp 5080 - -
Cela sous entends que vous avez réglé votre serveur web qui tourne sur la machine dont l'adresse IP 192.168.0.2 pour qu'il écoute sur le port 5080. Si vous aviez laissé le port par défaut (80), vous auriez pu faire :
DNAT net loc:192.168.0.2:80 tcp 5080 - -
La différence entre REDIRECT et DNAT est simple :
- DNAT sert à rediriger une requête vers une autre IP en y associant accessoirement le port d'entrée.
- REDIRECT sert à rediriger un port vers un autre port SUR le firewall uniquement.
Modification du fichier /etc/default/shorewall
Se fichier est configurer pour empêcher Shorewall de se lancer par défaut sans configuration. Maintenant qu'il est configurer il faut le modifier comme ceci :
# prevent startup with default configuration # set the below variable to 1 in order to allow shorewall to start startup=1
Premier lancement de Shorewall
root@monordi:~# chmod 640 *
root@monordi:~# chmod 755 orig
root@monordi:~# make
NE FERMEZ PAS LA SESSION SSH EN COURS ! Essayez tout de suite d'en ouvrir une autre en parallèle, si cela fonctionne c'est que Shorewall ne bloque pas le port, ce qui indique soit qu'il ne fonctionne pas, soit qu'il est bien configuré ;)
Verification du filtrage
Lancer la commande suivante :
En parallèle, ouvrez un explorateur web et taper l'adresse suivante : http://IP.DE.VOTRE.SERVEUR:PORT PORT étant un port NON ouvert bien sûr, par exemple 1037 en prenant la configuration que je vous ai donnée. Avec l'IP prise en exemple plus haut : http://82.136.78.144:1037
Revenez à votre terminal SSH vous devez voir ce genre de ligne apparaitre :
Jun 22 13:49:52 monordi Shorewall:net2fw:DROP: IN=eth0 OUT= MAC=00:12:AA:BB:CC:DD:EE:FF:00:11:AA:BB:CC:DD SRC=96.128.14.63 DST=82.136.78.144 LEN=48 TOS=00 PREC=0x00 TTL=116 ID=4829 DF PROTO=TCP SPT=54671 DPT=1037 SEQ=416072178 ACK=0 WINDOW=8192 SYN URGP=0
Ce qu'il faut regarder dans toutes ces informations c'est :
- net2fw : c'est une requête qui vient du net vers le serveur
- IN=eth0 et OUT= : la requête vient rentre par eth0 et rien n'allez sortir (c'est donc bien une requête qui vient du net)
- DPT=1037 : C'est le port D'arriver de la requête, donc ici notre port local, à savoir 1037 fermé :)
- SPT=54671 : C'est le port de départ (Start) qui n'apporte pas d'information car c'est le port de la machine distante
- SRC=96.128.14.63 : L'adresse IP qui a réalisé cette requête (c'est ce genre d'IP qu'il faut ajouter dans votre fichier /etc/shorewall/blacklist si elle revient trop fréquemment.
- DST=82.136.78.144 C'est votre IP ;)
Modification de la configuration
A chaque fois que je vous aller modifier un fichier (normalement vous n'avez plus qu'à modifier /etc/shorewall/rules et /etc/shorewall/blacklist) n'oubliez de réaliser les commandes suivantes :
Conclusion
Votre serveur dispose maintenant d'un firewall fiable qui protège votre réseau local des intrus et partage la connexion internet !
Vous pouvez passer à l'installation de votre firewall pour IPv6, ou si vous ne souhaitez pas utiliser IPv6, passer directement à l'installation de votre serveur DHCP.

