Après avoir sécurisé l’accès SSH de notre serveur il convient maintenant de « l’habiller ». En effet celui ci est actuellement « à poil » sur internet, nous allons donc lui faire revêtir une « armure » en veillant à ce que notre serveur puisse tout de même « respirer » ! Bon ok, l’analogie n’est peut-être pas très bien trouvé mais l’essentiel est là… Nous allons installer un pare-feu sur notre machine Linux à l’aide de l’incontournable Iptables.
Au lieu de repartir de zéro j’ai modifié le script iptables de « Nicolargo » (http://blog.nicolargo.com/ ) et je l’ai adapté à mes besoins. Personnellement je n’utilise aucun contrôle sur le trafic sortant de mon serveur, uniquement sur l’entrant.
Commencez par créer votre script :
1 |
nano /etc/init.d/firewall.sh |
Copiez coller le script ci-dessous (je vous expliquerais 2-3 choses plus bas :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 |
#!/bin/sh # # Simple Firewall configuration. # # Author: Nicolargo # Edit : fmplaw # # chkconfig: 2345 9 91 # description: Activates/Deactivates the firewall at boot time # ### BEGIN INIT INFO # Provides: firewall.sh # Required-Start: $syslog $network # Required-Stop: $syslog $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start firewall daemon at boot time # Description: Custom Firewall script. ### END INIT INFO PATH=/bin:/sbin:/usr/bin:/usr/sbin # Services that the system will offer to the network # SSH = 22 TCP_SERVICES="22" UDP_SERVICES="" if ! [ -x /sbin/iptables ]; then exit 0 fi ########################## # Start the Firewall rules ########################## fw_start () { # Input traffic: /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Services if [ -n "$TCP_SERVICES" ] ; then for PORT in $TCP_SERVICES; do /sbin/iptables -A INPUT -p tcp --dport ${PORT} -j ACCEPT done fi if [ -n "$UDP_SERVICES" ] ; then for PORT in $UDP_SERVICES; do /sbin/iptables -A INPUT -p udp --dport ${PORT} -j ACCEPT done fi # Remote testing /sbin/iptables -A INPUT -p icmp -j ACCEPT /sbin/iptables -A INPUT -i lo -j ACCEPT /sbin/iptables -P INPUT DROP /sbin/iptables -A INPUT -j LOG # Other network protections # (some will only work with some kernel versions) echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo 0 > /proc/sys/net/ipv4/ip_forward echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts echo 1 > /proc/sys/net/ipv4/conf/all/log_martians echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route } ########################## # Stop the Firewall rules ########################## fw_stop () { /sbin/iptables -F /sbin/iptables -t nat -F /sbin/iptables -t mangle -F /sbin/iptables -P INPUT DROP /sbin/iptables -P FORWARD DROP /sbin/iptables -P OUTPUT ACCEPT } ########################## # Clear the Firewall rules ########################## fw_clear () { /sbin/iptables -F /sbin/iptables -t nat -F /sbin/iptables -t mangle -F /sbin/iptables -P INPUT ACCEPT /sbin/iptables -P FORWARD ACCEPT /sbin/iptables -P OUTPUT ACCEPT } ########################## # Test the Firewall rules ########################## fw_save () { /sbin/iptables-save > /etc/iptables.backup } fw_restore () { if [ -e /etc/iptables.backup ]; then /sbin/iptables-restore < /etc/iptables.backup fi } fw_test () { fw_save sleep 30 && echo "Restore previous Firewall rules..." && fw_restore & fw_stop fw_start } case "$1" in start|restart) echo -n "Starting firewall.." fw_stop fw_start echo "done." ;; stop) echo -n "Stopping firewall.." fw_stop echo "done." ;; clear) echo -n "Clearing firewall rules.." fw_clear echo "done." ;; test) echo -n "Test Firewall rules..." fw_test echo -n "Previous configuration will be restore in 30 seconds" ;; *) echo "Usage: $0 {start|stop|restart|clear|test}" echo "Be aware that stop drop all incoming/outgoing traffic !!!" exit 1 ;; esac exit 0 |
Ensuite rendez le exécutable :
1 |
chmod +x /etc/init.d/firewall.sh |
Puis on le lance au démarrage :
1 |
update-rc.d firewall.sh defaults |
Cela dit il peut-être utile de comprendre comme il fonctionne… Tout d’abord il reconnait les paramètres suivants :
start : permet de lancer le script.
stop : ATTENTION réinitialise les règles iptables et empêche le trafic forward et input.
restart : redémarre le script.
clear : réinitialise les règles iptables et autorise tous les trafics.
test : permet de tester la configuration iptables 30 sec.
save : permet de sauvegarder la conf iptables.
restore : permet la restauration de la conf iptables.
L’intérêt de ce script est qu’il est très facilement éditable. En effet si vous voulez ajouter le service ftp à votre serveur il est impératif d’ouvrir les ports 20 et 21 en TCP. Rien de plus simple, éditez votre script :
1 |
nano /etc/init.d/firewall.sh |
Puis rajoutez ces ports à la ligne 26 (voir script ci-dessus) de la variable TCP_SERVICES:
1 2 3 4 |
# Services that the system will offer to the network # SSH = 22 TCP_SERVICES="22 20 21" UDP_SERVICES="" |
Sauvegardez ces changements et relancez le services :
1 |
/etc/init.d/firewall.sh restart |
Et voilà ! Simple, non ?
Merci Fluffy
EXCELLENT TUTO