Informations :
Dates
- Publish : : Monday 22 december 2003
- Modification : Sunday 19 july 2020
- 10544 views
Share :
Introduction
Je vais vous expliquer comment configurer notre poste pour pouvoir naviguer sur internet. Détailler ainsi les fichiers de configurations et voir les régles firewall de bases pour se protéger des attaques. Nous utilisons pour cette documentation un Linux Debian. Certains fichers de configuration pouraient changer d'emplacement sur d'autres distributions (Mandrake).
Nous commençons par voir la configuration d'un poste client (derrère un routeur) puis celle d'un poste utilisé comme routeur/firewall.
Plages d'adresses IPv4 :
Pour information il existe 3 "grandes" classes d'IPv4 pour notre réseau privé qui sont :
- Classe A :
10.0.0.0/8
(plage IPv4 : 10.0.0.0 - 10.255.255.255) qui représente à 16 777 216 adresses IPv4 - Classe B :
172.16.0.0/12
(plage IPv4 : 172.16.0.0 - 172.31.255.255) qui représente à 1 048 576 adresses IPv4 - Classe C :
192.168.0.0/16
(plage IPv4 : 192.168.0.0 - 192.168.255.255) qui représente à 65 536 adresses IPv4
Plus la Classe D que l'on se sert pour le multicast 224.0.0.0 - Par exemple nos fournisseurs Internet s'en servent pour diffuser nos chaines télévisions.
Plus la Classe E réservée par IANA à un usage non déterminé.
Déclarons nos DNS
Les DNS servent à faire la relation entre une IP et un Nom. C'est à dire que si nos DNS ne sont pas déclarer nous pourons accéder à un serveur sur internet mais seulement en tappant son adresse IP (et non son Nom de domaine). ex : http://158.69.126.137 Une fois que nous aurons définis nos DNS nous pourons accéder à un serveur grâce à son nom de domaine (ex: http://zw3b.net ) Donc déclarons nos DNS :
Script avec 1 ligne
001vi /etc/resolv.conf
et ajoutons plusieurs DNS (au moins 1):
Script avec 3 lignes
001nameserver 1Z7.0.0.1
002nameserver 83.159.31.116
003nameserver 158.69.126.137
- DNS PUBLIC LAB3W/ZW3B :
83.159.31.116
-158.69.126.137
(accessible depuis n'importe quel accès Internet) - DNS chez Free :
212.27.32.176
-212.27.32.2
-212.27.32.175
- DNS chez Nérim :
62.4.16.70
-62.4.16.80
- DNS chez Wanadoo :
193.252.19.3
-193.252.19.4
- DNS chez Aol :
205.188.146.146
-202.67.95.0
- DNS chez Alice et Tiscali :
212.216.172.62
- DNS chez Cegetel :
194.6.128.3
-194.6.128.4
- DNS chez Club-Internet :
194.117.200.10
-194.117.200.15
- DNS chez Neuf Telecom :
212.30.96.108
-213.203.124.146
- DNS chez Numéricable :
81.220.255.4
-80.236.0.68
- DNS chez Télé2 :
130.244.127.161
-130.244.127.162
- DNS chez Liberty Surf :
194.149.160.9
-194.149.160.9
- DNS chez Magic Online :
194.149.160.9
-194.149.160.1
DNS publics (accessible depuis n'importe quel accès Internet) : 194.2.0.20
- 194.2.0.50
- 195.132.0.132
- 195.132.0.193
- 8.8.8.8
- 8.8.4.4
J'ajoute comment-faire un DNS sous Linux > serveurs > Configuration BIND9 Masters et Slaves
Naviguer depuis un poste derrière un routeur
La commande pour savoir qu'elles sont nos interfaces ethernet configurées est ifconfig
.
Si vous n'avez pas cette commande je vous suggère d'installer ces paquets grâce à la commande apt install iputils-ping dnsutils net-tools whois ipv6toolkit ipv6pref
qui sont logiciels/commandes réseaux.
Script avec 1 ligne
001ifconfig
Nous devons actuellement trouver 1 interface : L'interface lo
(boucle locale : interne à la machine) :
Script avec 8 lignes
001lo Lien encap:Boucle locale
002inet adr:127.0.0.1 Masque:255.0.0.0
003adr inet6: ::1/128 Scope:Hôte
004UP LOOPBACK RUNNING MTU:16436 Metric:1
005RX packets:11650 errors:0 dropped:0 overruns:0 frame:0
006TX packets:11650 errors:0 dropped:0 overruns:0 carrier:0
007collisions:0 lg file transmission:0
008RX bytes:5509007 (5.2 MiB) TX bytes:5509007 (5.2 MiB)
Pour assigner temporairement* une adresse IP à notre carte nous utilisons ifconfig
ou la commande ip
:
Script avec 1 ligne
001ifconfig eth0 192.168.0.2
ou
Script avec 1 ligne
001ip -4 address add 192.168.0.2/24 dev eth0
Maintenant en tapant ifconfig nous devions voir notre carte que nous venons de configurer. On doit trouver 2 interfaces. Notre carte ethernet et l'interface loop (local) :
Script avec 18 lignes
001eth0 Lien encap:Ethernet HWaddr 00:E0:18:DC:94:3E
002inet adr:192.168.0.2 Bcast:192.168.92.255 Masque:255.255.255.0
003adr inet6: fe80::2e0:18ff:fedc:943e/64 Scope:Lien
004UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
005RX packets:8715837 errors:0 dropped:0 overruns:0 frame:0
006TX packets:9630301 errors:0 dropped:0 overruns:0 carrier:0
007collisions:0 lg file transmission:1000
008RX bytes:1323496476 (1.2 GiB) TX bytes:3286670833 (3.0 GiB)
009Interruption:177 Adresse de base:0x2000
010 011lo Lien encap:Boucle locale
012inet adr:127.0.0.1 Masque:255.0.0.0
013adr inet6: ::1/128 Scope:Hôte
014UP LOOPBACK RUNNING MTU:16436 Metric:1
015RX packets:11650 errors:0 dropped:0 overruns:0 frame:0
016TX packets:11650 errors:0 dropped:0 overruns:0 carrier:0
017collisions:0 lg file transmission:0
018RX bytes:5509007 (5.2 MiB) TX bytes:5509007 (5.2 MiB)
Pour définir une passerelle (gw
) nous devons définir la route et l'adresse IPv4 de la passerelle que prendra les packets pour accéder à internet.
Script avec 1 ligne
001route add -net default gw 192.168.0.1
où ici l'adresse IP de la passerelle est 192.168.0.1
- temporairement parce qu'au prochain reboot votre carte ne sera plus configurée.
Nous pouvons aussi utiliser la commande ip
de cette manière :
Script avec 1 ligne
001ip -4 route add default via 192.168.0.1
Pour que notre carte ethernet soit prise en compte au boot/démarage de la machine nous devons éditer le fichier de configuration des interfaces réseau.
Script avec 1 ligne
001vi /etc/network/interfaces
et y ajouter :
Script avec 7 lignes
001auto eth0
002iface eth0 inet static
003address 192.168.0.2
004netmask 255.255.255.0
005network 192.168.0.0
006broadcast 192.168.0.255
007gateway 192.168.0.1
Nous pouvons (ou pas de suite) relancer la configuration du fichier réseau /etc/network/interfaces
de cette manière :
Script avec 1 ligne
001/etc/init.d/networking restart
Naviguer depuis un poste connecté directement à Internet
Donc la commande pour savoir qu'elles sont les interfaces ethernet configurées est ifconfig
Script avec 1 ligne
001ifconfig
Actuellement voilà ce que nous voyons (l'interface local (lo)) :
Script avec 8 lignes
001lo Lien encap:Boucle locale
002inet adr:127.0.0.1 Masque:255.0.0.0
003adr inet6: ::1/128 Scope:Hôte
004UP LOOPBACK RUNNING MTU:16436 Metric:1
005RX packets:11650 errors:0 dropped:0 overruns:0 frame:0
006TX packets:11650 errors:0 dropped:0 overruns:0 carrier:0
007collisions:0 lg file transmission:0
008RX bytes:5509007 (5.2 MiB) TX bytes:5509007 (5.2 MiB)
Déclarons une IP à notre carte : Vérifions si notre FAI à un serveur DHCP nous permettant de déclarer l'IP de notre carte relié au modem :
Script avec 1 ligne
001dhclient eth0
dhclient
se connecte de l'interface eth0
sur le serveur DHCP pour qu'il lui assigne une IP (par rapport à sa mac adresse ou à la classe d'IP). Voilà nous avons maintenant notre carte eth0
configurée. Nous devons voir l'interface loop (lo
) avec comme IP : 127.0.0.1
et notre carte ethernet (eth0
) avec comme IP : 1.2.3.4
reliée au modem :
Script avec 19 lignes
001eth0 Lien encap:Ethernet HWaddr 52:54:05:F5:95:BE
002inet adr:1.2.3.4 Bcast:1.2.3.255 Masque:255.255.255.0
003adr inet6: fe80::5054:5ff:fef5:95bc/64 Scope:Lien
004UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
005RX packets:8715837 errors:0 dropped:0 overruns:0 frame:0
006TX packets:9630301 errors:0 dropped:0 overruns:0 carrier:0
007collisions:0 lg file transmission:1000
008RX bytes:1323496476 (1.2 GiB) TX bytes:3286670833 (3.0 GiB)
009Interruption:177 Adresse de base:0x2000
010 011lo Lien encap:Boucle locale
012inet adr:127.0.0.1 Masque:255.0.0.0
013adr inet6: ::1/128 Scope:Hôte
014UP LOOPBACK RUNNING MTU:16436 Metric:1
015RX packets:11650 errors:0 dropped:0 overruns:0 frame:0
016TX packets:11650 errors:0 dropped:0 overruns:0 carrier:0
017collisions:0 lg file transmission:0
018RX bytes:5509007 (5.2 MiB) TX bytes:5509007 (5.2 MiB)
019
Pour que notre carte ethernet soit prise en compte au boot (démarage) de la machine nous devons éditer le fichier de config des interfaces réseau.
Script avec 1 ligne
001vi /etc/network/interfaces
et y ajouter :
Script avec 2 lignes
001auto eth0
002iface eth0 inet dhcp
Faire de notre machine un routeur
Si nous souhaitons faire de cette machine une passerelle/routeur, nous devons avoir une carte supplémentaire qui sera connecté au switch du réseau ou directement à un autre pc grâce à un cable RJ45 croisé. Occupons nous de notre réseau privé :
Script avec 2 lignes
001ifconfig eth1 192.168.0.1
002
Nos 2 cartes sont configurées, en tappant ifconfig
vous devez voir quelque chose approchant cela :
Script avec 29 lignes
001eth0 Lien encap:Ethernet HWaddr 52:54:05:F5:95:BE
002inet adr:1.2.3.4 Bcast:1.2.3.255 Masque:255.255.255.0
003adr inet6: fe80::5054:5ff:fef5:95bc/64 Scope:Lien
004UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
005RX packets:8715837 errors:0 dropped:0 overruns:0 frame:0
006TX packets:9630301 errors:0 dropped:0 overruns:0 carrier:0
007collisions:0 lg file transmission:1000
008RX bytes:1323496476 (1.2 GiB) TX bytes:3286670833 (3.0 GiB)
009Interruption:177 Adresse de base:0x2000
010 011eth1 Lien encap:Ethernet HWaddr 00:10:A7:1A:50:65
012inet adr:192.168.0.1 Bcast:192.168.0.255 Masque:255.255.255.0
013adr inet6: fe80::2e0:18ff:fedc:943e/64 Scope:Lien
014UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
015RX packets:8715837 errors:0 dropped:0 overruns:0 frame:0
016TX packets:9630301 errors:0 dropped:0 overruns:0 carrier:0
017collisions:0 lg file transmission:1000
018RX bytes:1323496476 (1.2 GiB) TX bytes:3286670833 (3.0 GiB)
019Interruption:177 Adresse de base:0x2000
020021 022
lo Lien encap:Boucle locale
023inet adr:127.0.0.1 Masque:255.0.0.0
024adr inet6: ::1/128 Scope:Hôte
025UP LOOPBACK RUNNING MTU:16436 Metric:1
026RX packets:11650 errors:0 dropped:0 overruns:0 frame:0
027TX packets:11650 errors:0 dropped:0 overruns:0 carrier:0
028collisions:0 lg file transmission:0
029RX bytes:5509007 (5.2 MiB) TX bytes:5509007 (5.2 MiB)
Ajoutons au fichier de conf des interfaces réseau notre carte eth1
.
Script avec 1 ligne
001vi /etc/network/interfaces
et y ajouter :
Script avec 6 lignes
001auto eth1
002iface eth1 inet static
003address 192.168.0.1
004netmask 255.255.255.0
005network 192.168.0.0
006broadcast 192.168.0.255
Et faire le routage grâce à iptables
qui permettra aux autres machines du réseau de pouvoir naviguer sur Internet. Iptables permet de configurer des règles de pare-feu ainsi que d'activer le Masquerading. Le masquerading permet de "cacher" toutes les adresses de notre réseau local. Les paquets partent sur Internet avec comme adresse source l'adresse de la passerelle. Notre réseau local est invisible sur internet (rappelez-vous que nous n'avons qu'une adresse IP attribuée par notre FAI et qu'il faut la partager).
Script avec 1 ligne
001iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
ou
Script avec 1 ligne
001iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT -o eth1 --to-source 1.2.3.4
sans oublier d'activer dans le noyeau le forward. à la volé :
Script avec 1 ligne
001echo 1 > /proc/sys/net/ipv4/ip_forward
en permanant :
Script avec 1 ligne
001vi /etc/network/options
et remplacer ip_forward=no
par ip_forward=yes
Explications pour configurer le pare-feu de notre machine routeur
On commence par configuer les "accés" à notre machine locale (la passerelle) : on va tout fermer :
Script avec 4 lignes
001# Fermer les portes
002iptables -P INPUT DROP
003iptables -P OUTPUT DROP
004iptables -P FORWARD DROP
on accepte les réponses des requêtes qui sortent de notre firewall :
Script avec 3 lignes
001# On accepte tous ce qui vient d'ici
002iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
003
on va autoriser l'accés à notre machine routeur/firewall sur le port 22 (SSH) du réseau local :
Script avec 3 lignes
001# Autoriser a se connecter sur la passerelle du réseau local
002iptables -A INPUT -i eth1 -m state --state NEW,ESTABLISHED -p tcp --dport 22 -j ACCEPT
003iptables -A OUTPUT -o eth1 -m state --state ESTABLISHED -p tcp --sport 22 -j ACCEPT
On continue en nous attaquant au réseau local (LAN) : on souhaite laisser passer toutes les requêtes vers et venant notre réseau local pour profiter entièrement de notre accès à Internet.
Script avec 3 lignes
001# Acces complet au net pour le LAN sur eth1
002iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
003iptables -A FORWARD -o eth1 -i eth0 -j ACCEPT
Voilà notre firewall est configuré. Imaginez maintenant que vous avez un serveur (logiciel) sur un poste de votre réseau local, il faudra alors router le port en question vers la machine serveur (toujours pour faire croire au réseau InterNet que votre machine passerelle (avec l'ip de votre FAI) héberge le serveur logiciel en question). Par exemple pour un serveur Web sur la machine 192.168.0.5
du réseau local et que votre IP Internet est 1.2.3.4
Script avec 3 lignes
001# WEB Serveur
002iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.5:80
003iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 443 -j DNAT --to-destination 192.168.0.5:443
ou tiens, un client p2p comme eMule :
Script avec 1 ligne
001iptables -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 4657 -j DNAT --to-destination 192.168.0.8:4657
En espèrant que cela poura vous aider. Bien sûr cet article ne se veut pas exhaustif mais peut vous aider à comprendre le fonctionnement d'une configuration pour naviguer sur InterNet d'un Linux. Les configurations pouvent changer en fonction de ce que vous voulez faire et de votre raccordement InterNet.
NdMoi-même 2020/04/09 : Je vous met ici un firewall IPv4 que je vous concoctais (ajouter vos règles selon les services que vous proposez) pour vivre en toutes sécurités ;)
On édite vim /root/firewall.sh
:
Script avec 366 lignes
001#!/bin/bash
002### BEGIN INIT INFO
003# Provides: firewall
004# Required-Start: $remote_fs $syslog
005# Required-Stop: $remote_fs $syslog
006# Default-Start: 2 3 4 5
007# Default-Stop: 0 1 6
008# Short-Description: Start daemon at boot time
009# Description: Enable service provided by daemon.
010### END INIT INFO
011 012#####-------------------------- VARIABLES ----------------------------######
013 014# Chemin commandes
015IPTABLE="/sbin/iptables"
016MODPROBE="/sbin/modprobe"
017 018# interfaces reseaux
019LOOP_IF="lo"
020NET_IF="eth0"
021VLAN_IF="eth1"
022 023# IPv4 du serveur
024NET_IP="1.2.3.4"
025VLAN_IP="10.106.42.254"
026 027# IPv4 des Containers
028CT_WWW="10.106.42.1"
029 030###########
031IPS="$NET_IP $VLAN_IP $CT_WWW"
032###########
033 034# port du service ssh
035PORT_SSH="22"
036 037# ports tcp et udp a ouvrir
038TCP_OK="514" # SYSLOG
039UDP_OK="69 123 161 514 546 547" # TFTP NTP SNMP SYSLOG DHCP
040 041# ip qui ont acces en ssh au serveur
042SSH_IP_OK="83.159.31.116 158.69.126.137" #
043 044LOOPBACK="127.0.0.0/8"
045CLASS_A="10.0.0.0/8"
046CLASS_B="172.16.0.0/12"
047CLASS_C="192.168.0.0/16"
048CLASS_D_MULTICAST="224.0.0.0/4"
049CLASS_E_RESERVED_NET="240.0.0.0/5"
050 051MODULES="iptable_filter iptable_nat iptable_mangle
052ip_tables ip_conntrack ip_conntrack_ftp
053ipt_state ipt_limit ipt_multiport ip_nat_ftp"
054 055#####-------------------------- VARIABLES ----------------------------######
056 057#####-------------------------- FONCTIONS ----------------------------######
058 059#####
060# diverses optimisations et protection du noyau
061#####
062 063function kernel()
064{
065for a in $MODULES #load Modules
066do
067$MODPROBE $a
068done
069 070# Enable 8192 Connections to track
071#/bin/echo "32768" > /proc/sys/net/ipv4/ip_conntrack_max
072 073# Disable response to ping.
074/bin/echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_all
075 076# Disable response to broadcasts.
077/bin/echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
078 079# Don't accept source routed packets.
080/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
081 082# Disable ICMP redirect acceptance.
083/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
084 085# Enable bad error message protection.
086/bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
087 088# No spoof
089for interface in /proc/sys/net/ipv4/conf/*/rp_filter; do
090/bin/echo "1" > ${interface}
091done
092 093/bin/echo "1" > /proc/sys/net/ipv4/tcp_syncookies
094/bin/echo "1024" > /proc/sys/net/ipv4/tcp_max_syn_backlog
095#/bin/echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
096 097 098# Log spoofed packets, source routed packets, redirect packets.
099/bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
100 101# Make sure that IP forwarding is turned on.
102# /bin/echo "1" > /proc/sys/net/ipv4/ip_forward
103104
echo " "+ Options du kernel : [OK]
105}
106 107function synflood()
108{
109## SYN-FLOODING PROTECTION
110$IPTABLE -N syn-flood
111$IPTABLE -A INPUT -i $NET_IF -p tcp --syn -j syn-flood
112$IPTABLE -A syn-flood -m limit --limit 1/s --limit-burst 4 -j RETURN
113$IPTABLE -A syn-flood -j DROP
114## Make sure NEW tcp connections are SYN packets
115$IPTABLE -A INPUT -i $NET_IF -p tcp ! --syn -m state --state NEW -j DROP
116 117echo " "+ Synflood Attack : [OK]
118}
119 120function spoofing()
121{
122## SPOOFING
123$IPTABLE -A INPUT -i $NET_IF -s $CLASS_A -j DROP
124$IPTABLE -A INPUT -i $NET_IF -s $CLASS_B -j DROP
125$IPTABLE -A INPUT -i $NET_IF -s $CLASS_C -j DROP
126$IPTABLE -A INPUT -i $NET_IF -s $CLASS_D_MULTICAST -j DROP
127$IPTABLE -A INPUT -i $NET_IF -s $CLASS_E_RESERVED_NET -j DROP
128$IPTABLE -A INPUT -i $NET_IF -s $LOOPBACK -j DROP
129echo " "+ Spoofing Attack : [OK]
130}
131 132function logging()
133{
134## LOGGING
135# Any udp not already allowed is logged and then dropped.
136$IPTABLE -A INPUT -i $NET_IF -p udp -m limit --limit 6/h --limit-burst 5 -j LOG --log-prefix "IPTABLES UDP-IN: "
137# $IPTABLE -A INPUT -i $NET_IF -p udp -m limit --limit 6/h --limit-burst 5
138$IPTABLE -A INPUT -i $NET_IF -p udp -j DROP
139 140$IPTABLE -A OUTPUT -o $NET_IF -p udp -m limit --limit 6/h --limit-burst 5 -j LOG --log-prefix "IPTABLES UDP-OUT: "
141# $IPTABLE -A OUTPUT -o $NET_IF -p udp -m limit --limit 6/h --limit-burst 5
142$IPTABLE -A OUTPUT -o $NET_IF -p udp -j DROP
143 144# Any icmp not already allowed is logged and then dropped.
145$IPTABLE -A INPUT -i $NET_IF -p icmp -m limit --limit 6/h --limit-burst 5 -j LOG --log-prefix "IPTABLES ICMP-IN: "
146# $IPTABLE -A INPUT -i $NET_IF -p icmp -m limit --limit 6/h --limit-burst 5
147$IPTABLE -A INPUT -i $NET_IF -p icmp -j DROP
148 149$IPTABLE -A OUTPUT -o $NET_IF -p icmp -m limit --limit 6/h --limit-burst 5 -j LOG --log-prefix "IPTABLES ICMP-OUT: "
150# $IPTABLE -A OUTPUT -o $NET_IF -p icmp -m limit --limit 6/h --limit-burst 5
151$IPTABLE -A OUTPUT -o $NET_IF -p icmp -j DROP
152 153# Any tcp not already allowed is logged and then dropped.
154$IPTABLE -A INPUT -i $NET_IF -p tcp -m limit --limit 6/h --limit-burst 5 -j LOG --log-prefix "IPTABLES TCP-IN: "
155# $IPTABLE -A INPUT -i $NET_IF -p tcp -m limit --limit 6/h --limit-burst 5
156$IPTABLE -A INPUT -i $NET_IF -p tcp -j DROP
157 158$IPTABLE -A OUTPUT -o $NET_IF -p tcp -m limit --limit 6/h --limit-burst 5 -j LOG --log-prefix "IPTABLES TCP-OUT: "
159# $IPTABLE -A OUTPUT -o $NET_IF -p tcp -m limit --limit 6/h --limit-burst 5
160$IPTABLE -A OUTPUT -o $NET_IF -p tcp -j DROP
161 162# Anything else not already allowed is logged and then dropped.
163# It will be dropped by the default policy anyway ........ but let's be paranoid.
164$IPTABLE -A INPUT -i $NET_IF -m limit --limit 6/h --limit-burst 5 -j LOG --log-prefix "IPTABLES PROTOCOL-X-IN: "
165# $IPTABLE -A INPUT -i $NET_IF -m limit --limit 6/h --limit-burst 5
166$IPTABLE -A INPUT -i $NET_IF -j DROP
167 168$IPTABLE -A OUTPUT -o $NET_IF -m limit --limit 6/h --limit-burst 5 -j LOG --log-prefix "IPTABLES PROTOCOL-X-OUT: "
169# $IPTABLE -A OUTPUT -o $NET_IF -m limit --limit 6/h --limit-burst 5
170$IPTABLE -A OUTPUT -o $NET_IF -j DROP
171 172echo " "+ LOG BURST 5 : [OK]
173}
174 175#####
176# on accepte tout de et pour "lo" local
177#####
178 179function loopback()
180{
181$IPTABLE -A INPUT -i lo -j ACCEPT
182$IPTABLE -A FORWARD -i lo -j ACCEPT
183$IPTABLE -A FORWARD -o lo -j ACCEPT
184$IPTABLE -A OUTPUT -o lo -j ACCEPT
185 186echo " "+ On accepte la loop : [OK]
187}
188 189#####
190# on fixe les regles general (DROP||ACCEPT)
191#####
192 193function policy()
194{
195$IPTABLE -P INPUT $1
196$IPTABLE -P FORWARD $1
197$IPTABLE -P OUTPUT $1
198 199echo " "+ On fixe les portes : $1
200}
201 202#####
203# on accepte tout ce qui sort et on fait du tracking
204#####
205 206function generique()
207{
208for ip in $IPS
209do
210# Permettre à une connexion ouverte de recevoir du trafic en entrée.
211$IPTABLE -A INPUT -d $ip -m state --state ESTABLISHED,RELATED -j ACCEPT
212# Accepter le ping
213$IPTABLE -A INPUT -d $ip -p icmp -m limit --limit 5/s --limit-burst 4 -j ACCEPT
214 215$IPTABLE -A OUTPUT -s $ip -m state ! --state INVALID -j ACCEPT
216 217done
218219
# Limiter un ping par seconde par adresse IPv4
220$IPTABLE -I INPUT -p icmp -m hashlimit --hashlimit-name ICMP --hashlimit-above 1/second --hashlimit-burst 1 --hashlimit-mode srcip --hashlimit-srcmask 32 -j DROP
221222
echo " "+ Retour REQ : [OK]
223echo " "+ Ping Limit 5/s Burst 4 : [OK]
224}
225 226#####
227# ouverture des acces SSH a certaines IP
228#####
229 230function ssh_ok()
231{
232# On autorise les IPv4 à accéder au SSH
233for host in $SSH_IP_OK
234do
235$IPTABLE -A INPUT -i $NET_IF -s $host -p tcp --dport $PORT_SSH -j ACCEPT
236done
237 238# On autorise les autres à accéder au SSH avec une limite de 3 connexions / minute
239$IPTABLE -A INPUT -i $NET_IF -p tcp --dport $PORT_SSH -m state --state NEW -m recent --set --name SSH
240$IPTABLE -A INPUT -i $NET_IF -p tcp --dport $PORT_SSH -m recent --update --seconds 60 --hitcount 3 --rttl --name SSH -j DROP
241$IPTABLE -A INPUT -i $NET_IF -p tcp --dport $PORT_SSH -j ACCEPT
242243
echo " "+ SSH : [OK]
244}
245 246#####
247# ouverture des ports tcp et upd
248#####
249 250function tcp_ok()
251{
252for port in $TCP_OK
253do
254$IPTABLE -A INPUT -p tcp --dport $port -j ACCEPT
255$IPTABLE -A OUTPUT -p tcp --sport $port -j ACCEPT
256done
257258
echo " "+ TCP : [OK]
259}
260 261function udp_ok()
262{
263for port in $UDP_OK
264do
265$IPTABLE -A INPUT -p udp --dport $port -j ACCEPT
266$IPTABLE -A OUTPUT -p udp --sport $port -j ACCEPT
267done
268269
echo " "+ UDP : [OK]
270}
271 272#####
273# ouverture des acces HTTP(S)
274#####
275 276function server_http()
277{
278HTTPX_PORTS="80 443"
279 280for port in $HTTPX_PORTS
281do
282# SOIT le service est sur LHOTE SOIT dans un VServer
283$IPTABLE -A INPUT -p tcp --dport $port -m tcp -m state --state NEW -m recent --set --name WEB_$port -j ACCEPT
284# $IPTABLE -A INPUT -p tcp --dport $port -m recent --update --seconds 60 --hitcount 1000 --rttl --name WEB_$port -j DROP
285$IPTABLE -A INPUT -p tcp --dport $port -j ACCEPT
286 287$IPTABLE -A OUTPUT -p tcp --sport $port -j ACCEPT
288 289# SOIT le service est dans un VServer ou AUTRE Machine
290$IPTABLE -t nat -A PREROUTING -d $NET_IP -p tcp --dport $port -j DNAT --to-destination $CT_WWW:$port
291 292done
293 294echo " "+ HTTP(S) : [OK]
295}
296 297#####
298# on route vers&pour les vservers (a peaufinner)
299#####
300 301function vservers_nat()
302{
303# On active le forward du noyeau
304/bin/echo "1" > /proc/sys/net/ipv4/ip_forward
305 306# On active le forward entre les cartes réseaux
307for interface in /proc/sys/net/ipv4/conf/*/forwarding; do
308/bin/echo "1" > ${interface}
309done
310311
# Acces complet au NET pour le VLAN
312$IPTABLE -A FORWARD -i $NET_IF -o $VLAN_IF -j ACCEPT
313$IPTABLE -A FORWARD -o $NET_IF -i $VLAN_IF -j ACCEPT
314315
# On route le CT_WWW à sortir sur Internet avec l'IP publique
316$IPTABLE -t nat -A POSTROUTING -o $NET_IF -s $CT_WWW -j MASQUERADE
317 318echo " "+ VSERVERS NAT : [OK]
319}
320 321#####-------------------------- FONCTIONS ----------------------------######
322 323#####-------------------------- START / STOP ----------------------------######
324 325case "$1" in
326 327start|restart)
328$0 stop
329echo "$0 Starting"
330kernel
331synflood
332spoofing
333loopback
334generique
335 336ssh_ok
337 338tcp_ok
339udp_ok
340 341vservers_nat
342 343server_http
344345
logging
346347
policy DROP
348;;
349 350 351stop)
352echo "$0 Stop"
353$IPTABLE -F
354$IPTABLE -t nat -F
355$IPTABLE -Z
356$IPTABLE -X
357policy ACCEPT
358;;
359 360*)
361echo "usage : $0 (start|stop|restart)"
362;;
363 364esac
365 366#####-------------------------- START / STOP ----------------------------######
Mettre le script en execution pour root chmod u+x /root/firewall.sh
puis lancer /root/firewall.sh (start|stop|restart)
.
Une fois que tout est Okay :
- Créer un lien symbolique dans initd comme cela
ln -s /root/firewall.sh /etc/init.d/firewall
- Puis ajouter le script au démarage de la machine en lancant la commande
update-rc.d firewall defaults
J'ajoute un lien qui explique bien le Routage avancé avec marquage de paquet et rp_filter (DLFP ) pour celles et ceux que çà intéresseraient.
Sauvegarder/restaurer votre configuration firewall.
J'ajoute 2 commandes qui peuvent être utile :) et qui peuvent servir pour NuFW .
Sauvegarder votre configuration firewall actuelle :
Script avec 1 ligne
001iptables-save > /etc/firewall.conf
Restaurer votre configuration firewall :
Script avec 1 ligne
001iptables-restore < /etc/firewall.conf
Visualiser votre firewall INPUT (entrée), FORWARD (transfert entre vos cartes réseaux), OUTPUT (sortie) :
Chain INPUT, FORWARD, OUTPUT.
Script avec 4 lignes
001iptables -L -vn
002iptables -L INPUT -vn
003iptables -L FORWARD -vn
004iptables -L OUTPUT -vn
La table NAT (Network Translation Address) :
Script avec 1 ligne
001iptables -L -vn -t nat
Cordialement,
Romain