II. Quelques petits plus…▲
II-A. 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.
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
# 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-B. 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
#! /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 ;)
update-rc.d no_ping_from_eth0 start 99
2
5
.
II-C. 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…
netstat -lp |
grep "*"
Toutefois, c'est un peu lourd à décrypter… et pas forcément parlant. On peut aussi utiliser cette commande.
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 »…
/etc/init.d/service stop
On vérifie que tout fonctionne normalement… si oui, on veut qu'il ne démarre pas tout simplement.
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
# Vous devez adapter IP_interne à vos besoins
ListenAddress IP_interne
II-D. 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 cœur, 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.
apt-get install ipcheck
Ensuite, il faut créer un script /usr/local/sbin/update_ip_dyndns.sh
#! /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.
crontab -e
# cela va vous ouvrir un fichier avec votre editeur prefere...
# et il faudra ajouter cette ligne
*/10
* * * * /usr/local
/sbin/update_ip_dyndns.sh
II-E. 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.
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…
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-F. Quelques notions sur iptables▲
Il faut faudra certainement quelques notions d'iptables pour mieux comprendre ces règles…
#! /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 connexions 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-G. 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…
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 ;)