Mise en place d'une passerelle "sécurisée" pour le partage d'une connexion internet


précédentsommairesuivant

II. Quelques petits plus...

II-1. Proxy Transparent

On peut vouloir configurer un proxy transparent. Ainsi, les machines clientes ne devront pas être configurées spécialement pour aller sur internet.

/etc/squid/squid.conf
Sélectionnez
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on   
httpd_accel_uses_host_header on
 
Sélectionnez
# activer le routage d'adresses
echo 1 > /proc/sys/net/ipv4/ip_forward

# vous devez adapter zone_ip_interne et IP_interne

# exemple zone_ip_interne = 192.168.0.0
iptables -t nat -A PREROUTING -s zone_ip_interne/255.255.255.0 \ 
-p tcp -m tcp --dport 80 -j REDIRECT --to-port 8080
# exemple IP_interne = 192.168.0.1
iptables -t nat -A PREROUTING -s zone_ip_interne/255.255.255.0 \ 
-p tcp -m tcp --dport 80 -j DNAT --to-destination IP_interne:8080

II-2. Interdire ping depuis l'extérieur

Il peut être utile d'interdire le ping depuis l'extérieur, surtout si votre machine est directement reliée à un modem, et non un routeur... car dans une telle situation, vous êtes en première ligne. D'ailleurs, il vaut mieux toujours penser qu'on est dans la pire des situations, car des petits malins finiront par nous prouver qu'on était bien en-dessous de la vérité.

Pour cela, nous allons créer un fichier /etc/init.d/no_ping_from_eth0

/etc/init.d/no_ping_from_eth0
Sélectionnez
#! /bin/sh
echo "Setting 'No Ping From Red Zone'"
iptables -i eth0 -A INPUT -p icmp -j DROP

Il faut ensuite le placer au niveau 2 du démarrage... enfin, je conseille le niveau 2 ;)

 
Sélectionnez
update-rc.d no_ping_from_eth0 start 99 2 5 .

II-3. Fermer certains ports

Pour des raisons de sécurité, il est parfois utile de fermer certains ports... pour les services inutilisés.

On commence par regarder les ports ouverts à n'importe quelle machine...

 
Sélectionnez
netstat -lp | grep "*"

Toutefois, c'est un peu lourd à décrypter... et pas forcemment parlant. On peut aussi utiliser cette commande.

 
Sélectionnez
lsof -P | grep TCP | grep '*:'
# la sortie est formatee ainsi 
# service	...	TCP	*:port (LISTEN)

Ainsi, vous voyez quel processus utilise quel port. Ensuite, quand on voit un process inutile, on commence par chercher sur google à quoi il peut bien servir. Si l'on veut toujours le supprimer, on commence par l'arrêter "temporairement"...

 
Sélectionnez
/etc/init.d/service stop

On vérifie que tout fonctionne normalement... si oui, on veut qu'il ne démarre pas tout simplement.

 
Sélectionnez
update-rc.d -n service remove
# on verifie d'abord ce que cela va realiser... puis, on fait :
update-rc.d -f service remove

Par exemple, avec l'installation minimale par défaut de la debian sarge, on pourrait désactiver les services suivants :

  • portmap (port 111)
  • inetd (port 113)
  • nfs-common (statd port 742)

On peut aussi fermer le ssh (port 22) sur la zone rouge (eth0), mais cela dépend de votre utilisation...

Si vous n'avez pas besoin de cet accès extérieur ajoutez cette ligne dans /etc/ssh/sshd_config

/etc/ssh/sshd_config
Sélectionnez
# Vous devez adapter IP_interne à vos besoins
ListenAddress IP_interne

II-4. Se doter d'un nom de domaine

Si vous souhaitez bénéficier d'un accès extérieur pour un service quelconque (http, ssh, ftp, etc), vous pouvez souhaiter disposer d'un nom de domaine... ce qui évite d'avoir à apprendre son IP publique par coeur, ou permet de faciliter l'usage des IP dynamiques. Prenez un compte gratuit sur DynDNS par exemple.

Une fois que cela est fait, si vous êtes dans le cas d'une IP publique dynamique, il vous faut installer un client dyndns.

 
Sélectionnez
apt-get install ipcheck

Ensuite, il faut créer un script /usr/local/sbin/update_ip_dyndns.sh

 
Sélectionnez
#! /bin/sh
/usr/sbin/ipcheck -l -r checkip.dyndns.org:8245 login password hostname

Maintenant, il faut exécuter ce script régulièrement, afin qu'il mette à jour votre IP publique auprès de DynDNS. Il faut donc ajouter à votre crontab.

 
Sélectionnez
crontab -e
# cela va vous ouvrir un fichier avec votre editeur préféré... 
# et il faudra ajouter cette ligne
*/10     *       *       *       *      /usr/local/sbin/update_ip_dyndns.sh

II-5. Autres services

Si vous avez besoin d'ouvrir des ports pour des services ne passant pas par une passerelle http, il vous faudra soit installer un "proxy" spécifique (ftp, smtp) ; soit quelques notions d'iptables... un article est en cours de rédaction avec Spoutnik.

Nous allons maintenant montrer comment ouvrir l'accès vers un port spécifique à l'extérieur, depuis les machines situées derrière la passerelle ; et ce, de manière transparente. L'exemple sera avec le protocole SSH, associé au port tcp 22.

 
Sélectionnez
IF_LOCAL="eth1"
IF_NET="eth0"
iptables -A FORWARD -d zone_ip_interne/255.255.255.0 -i ${IF_LOCAL} -o ${IF_NET} \ 
--dport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s zone_ip_interne/255.255.255.0 -i ${IF_LOCAL} -o ${IF_NET} \
--dport 22 -m state --state ! INVALID -j ACCEPT

On peut aussi, si l'on ne veut pas s'embêter, laisser la zone verte sortir librement...

 
Sélectionnez
IF_LOCAL="eth1"
IF_NET="eth0"

## On active la translation d adresse pour l'ensemble du reseau local pour l ensemble des ports
iptables -t nat -A POSTROUTING -o ${IF_NET} -i ${IF_LOCAL} -s zone_ip_interne/255.255.255.0 -d 0.0.0.0/0 -j MASQUERADE

Chaque proxy a sa propre configuration, et nous ne pouvons pas tous les présenter ici...

II-6. Quelques notions sur iptables

Il faut faudra certainement quelques notions d'iptables pour mieux comprendre ces règles...

 
Sélectionnez
#! /bin/sh

IPTABLES="iptables"

IF_LOCAL="eth1"
IF_NET="eth0"

IP_NET=XXX.XXX.XXX.XXX
ZONE_INTERNE=192.168.0.0/255.255.255.0
IP_LOCAL=192.168.0.1
DNS_FAI=YYY.YYY.YYY.YYY
GW_FAI=ZZZ.ZZZ.ZZZ.ZZZ

#### Initialisation

# modes pour le ftp
modprobe ip_nat_ftp
modprobe ip_conntrack_ftp

# purger iptables
$IPTABLES -F
$IPTABLES -t nat -F
$IPTABLES -t mangle -F
$IPTABLES -X
$IPTABLES -t nat -X
$IPTABLES -t mangle -X

# Politique par defaut : les paquets sont refuses
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

# On accepte les paquets reconnus par le moteur d'etat
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT


#### Autoriser les connexions sortantes sur un port particulier

# exemple: on autorise les connexion ssh sortantes
$IPTABLES -A OUTPUT -m state --state ! INVALID -p tcp --sport 1024: --dport 22 -j ACCEPT


#### Autoriser les connexions entrantes vers un port particulier, et une interface particulière

# exemple: on ouvre le port tcp/22 depuis l'interieur, donc sur l'interface eth1
$IPTABLES -A INPUT -m state --state NEW -p tcp -s ${ZONE_INTERNE} --sport 1024: --dport 22 -i ${IF_LOCAL} -j ACCEPT


#### Router les paquets arrivant sur un port vers un autre port de la meme machine

# exemple: on route le port web (tcp/80) sur le port de squid
$IPTABLES -t nat -A PREROUTING  -s ${ZONE_INTERNE} -p tcp -m tcp --dport 80 -j REDIRECT --to-port 3128
$IPTABLES -t nat -A PREROUTING  -s ${ZONE_INTERNE} -p tcp -m tcp --dport 80 -j DNAT --to-destination ${IP_LOCAL}:3128


##### Router les paquets arrivant sur un port vers le port d'une autre machine

# exemple: on autorise le routage des connexions ssh depuis l'interieur vers l'exterieur
$IPTABLES -A FORWARD -m state --state NEW -p tcp -s ${ZONE_INTERNE} --sport 1024: --dport 22 -i ${IF_LOCAL} -o ${IF_NET} -j ACCEPT


#### Diriger les requetes en sortie
# pour qu'elles fassent ZONE_INTERNE -> eth1:Passerelle -> eth0:Passerelle -> ZONE_EXTERNE

$IPTABLES -t nat -A POSTROUTING -s ${ZONE_INTERNE} -o ${IF_NET} -j SNAT --to ${IP_NET}

#### Activer le routage
echo 1 > /proc/sys/net/ipv4/ip_forward

II-7. Compléments

Il faut se protéger d'une attaque Denial of Service, dont le but est de saturer la passerelle par de nombreuses connexions non abouties, et ainsi de la faire tomber sous la charge. Pour cela, une ligne suffit...

 
Sélectionnez
echo 1 > /pros/sys/net/ipv4/tcp_syncookies

Je signale l'existence du module AdZapper pour Squid, afin de supprimer tout ce qui pourrait ressembler à un bandeau publicitaire...

Il manque encore quelques détails à rajouter sur la QoS, mais vous trouverez plus complet dans un article à venir sur iptables. Si vous avez d'autres suggestions... n'hésitez pas ;)


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

Copyright (c) 2006 Nicolas Vallée. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. Read the full license here : http://www.gnu.org/licenses/fdl.txt