Bon, ça fait un moment que mon serveur maison tourne avec le script suivant, j’ai suivis différents documents glanés ça et là. Les services:
- Web vers * ou/et vers le réseau maison suivant les cas
- NFS vers le réseau maison
- ssh vers le réseau maison
Mon but est de choisir l’état du serveur au lancement du script, à savoir ouvrir le http vers le web ou pas, etc… J’ai donc différentes fonctions qui si je ne me suis pas trompé font ce que je veux. Mes questions:
- Est-ce raisonnable de mixer un NFS et un serveur web sur la même machine ou vaut-il mieux éviter?
- J’ai l’impression d’avoir des chaînes superflues, est-ce la cas?
Merci.
[code]#!/bin/bash
firewall une interface
laisser passer le trafic http depuis le net et/ou l’intèrieur suivant ce qu’on veut
laisser passer le trafic nfs sur les adresses qui vont bien.
IPTABLES="/sbin/iptables"
ANYWHERE="0.0.0.0/0"
PRIVPORTS="0:1023"
UNPRIVPORTS="1024:65535"
CUICUI=“192.168.1.102”
parano() {
Effacement de toutes les règles
echo -en “Effacement des anciennes regles :”
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -t nat -X
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
echo -e “OK”
echo -en “Mise en place de la polique par defaut :”
$IPTABLES -P INPUT DROP # drop all incoming packets
$IPTABLES -P OUTPUT DROP # drop all outcoming packets
$IPTABLES -P FORWARD DROP # drop all forwarded packets
echo -e “###################### rien ne passe (en theorie) ########################”
}
stop() {
$IPTABLES -F
$IPTABLES -X
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT
echo -e “######################## firewall desactive ##########################”
}
minimum-client() {
autorise trafic entrant sur connexion deja etablie.
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
L’interface de loopback etant consideree comme sure, toutes les
connexions sont autoriees
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
echo -e "loopback OK"
client DNS.
$IPTABLES -A OUTPUT -o eth0 -p udp \
--sport $UNPRIVPORTS \
--dport 53 -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p udp \
--sport 53 \
--dport $UNPRIVPORTS -j ACCEPT
echo -e "DNS client OK"
Gérer les connexions aux serveurs ftp
$IPTABLES -A INPUT -i eth0 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p tcp --dport 20 -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p tcp --sport $UNPRIVPORTS --dport $UNPRIVPORTS -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p tcp --sport $UNPRIVPORTS --dport $UNPRIVPORTS -m state --state ESTABLISHED,RELATED -j ACCEPT
echo -e "FTP client OK"
Gérer l’accès aux sites web en tant que client
Note :
Si le client DNS n’est pas autorisé, alors il est uniquement possible de naviguer sur Internet
en employant les addresse ip des sites webs.
# Libérer le port 80 (input et output)
$IPTABLES -A OUTPUT -o eth0 -p tcp --sport $UNPRIVPORTS --dport 80 -s $CUICUI -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p tcp --sport 80 --dport $UNPRIVPORTS -s $ANYWHERE -d $CUICUI -j ACCEPT
# Libérer le port 443 (input et output)
$IPTABLES -A OUTPUT -o eth0 -p tcp --sport $UNPRIVPORTS --dport 443 -s $CUICUI -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p tcp --sport 443 --dport $UNPRIVPORTS -s $ANYWHERE -d $CUICUI -j ACCEPT
echo -e "http client OK"
Gérer le ping vers l’extérieur
Note :
Le ping est basé sur le protocol ICMP.
L’ICMP-type 8 correspond à l’envoi de echo vers l’extérieur
L’ICMP-type 0 correspond à la réception d’un echo-reply
# Autoriser l'envoie d'un echo
$IPTABLES -A OUTPUT -o eth0 -p icmp --icmp-type 8 -j ACCEPT
# Autoriser la réception d'un echo-reply
$IPTABLES -A INPUT -i eth0 -p icmp --icmp-type 0 -j ACCEPT
echo -e "un peu d'ICMP quand meme..."
}
serveur-web() {
autoriser connexion deja etablie
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
parano
minimum-client
le ssh en local
$IPTABLES -A INPUT -p tcp -i eth0 -s 192.168.1.100/24 --dport ssh -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o eth0 --sport ssh -d 192.168.1.100/24 -j ACCEPT
$IPTABLES -A INPUT -p tcp -i eth0 -d 192.168.1.100/24 --sport ssh -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o eth0 --dport ssh -s 192.168.1.100/24 -j ACCEPT
Gérer un serveur web (80)
$IPTABLES -A INPUT -i eth0 -p tcp -s $ANYWHERE --sport $UNPRIVPORTS -d $CUICUI --dport 80 -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p tcp -s $CUICUI --sport 80 -d $ANYWHERE --dport $UNPRIVPORTS -j ACCEPT
}
serveur-lan() {
minimum-client
le ssh en local
$IPTABLES -A INPUT -p tcp -i eth0 -s 192.168.1.100/24 --dport ssh -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o eth0 --sport ssh -d 192.168.1.100/24 -j ACCEPT
$IPTABLES -A INPUT -p tcp -i eth0 -d 192.168.1.100/24 --sport ssh -j ACCEPT
$IPTABLES -A OUTPUT -p tcp -o eth0 --dport ssh -s 192.168.1.100/24 -j ACCEPT
Gérer un serveur web (80) en interne
$IPTABLES -A INPUT -i eth0 -p tcp -s 192.168.1.100/24 --sport $UNPRIVPORTS -d $CUICUI --dport 80 -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p tcp -s $CUICUI --sport 80 -d 192.168.1.100/24 --dport $UNPRIVPORTS -j ACCEPT
le NFS en local
$IPTABLES -A INPUT -i eth0 -p udp -s 192.168.1.100/24 -d $CUICUI --dport 111 -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p tcp -s 192.168.1.100/24 -d $CUICUI --dport 111 -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p udp -s 192.168.1.100/24 -d $CUICUI --dport 2049 -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p tcp -s 192.168.1.100/24 -d $CUICUI --dport 2049 -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p udp -s 192.168.1.100/24 -d $CUICUI --dport 32765:32769 -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p tcp -s 192.168.1.100/24 -d $CUICUI --dport 32765:32769 -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p udp -s 192.168.1.100/24 -d $CUICUI --dport 113 -j ACCEPT
$IPTABLES -A INPUT -i eth0 -p tcp -s 192.168.1.100/24 -d $CUICUI --dport 113 -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p udp -d 192.168.1.100/24 -s $CUICUI --sport 111 -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p tcp -d 192.168.1.100/24 -s $CUICUI --sport 111 -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p udp -d 192.168.1.100/24 -s $CUICUI --sport 2049 -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p tcp -d 192.168.1.100/24 -s $CUICUI --sport 2049 -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p udp -d 192.168.1.100/24 -s $CUICUI --sport 32765:32769 -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p tcp -d 192.168.1.100/24 -s $CUICUI --sport 32765:32769 -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p udp -d 192.168.1.100/24 -s $CUICUI --sport 113 -j ACCEPT
$IPTABLES -A OUTPUT -o eth0 -p tcp -d 192.168.1.100/24 -s $CUICUI --sport 113 -j ACCEPT
echo “NFS, enlever ce qui est superflu, sur la chaine OUTPUT… TODO!”
}
restart() {
stop
sleep 2
start
}
case “$1” in
’client’ )
parano
minimum-client
;;
‘web’ )
parano
serveur-web
;;
‘lan’ )
parano
serveur-lan
;;
‘parano’ )
parano
;;
‘stop’ )
stop
;;
‘start’ )
parano
serveur-web
serveur-lan
;;
‘restart’ )
restart
;;
‘status’ )
$IPTABLES -L -n -v
echo "Usage: /etc/init.d/firewall {start|stop|restart|status|parano|client|web|lan}"
esac
[/code]