#!/bin/sh
# ------------------------------------------
# essai de firewall avec iptable
# le 29/11/2003
# Rév° 08/02/2004
# ------------------------------------------
script_start (){
echo " "
echo "initialisations"
echo " "
echo "chargement des modules de suivi/masquage pour ftp et irc"
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc
# Activation de la passerelle
echo "mise en place du forwarding"
echo 1 > /proc/sys/net/ipv4/ip_forward
# Pas de spoofing
echo "no spofing"
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ] ; then
for filtre in /proc/sys/net/ipv4/conf/*/rp_filter
do
echo 1 > $filtre
done
fi
# Pas de synflood
echo "no synflood"
if [ -e /proc/sys/net/ipv4/tcp_syncookies ] ; then
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
fi
# nous vidons toutes les chaines existantes
echo "remise à zéro des tables..."
iptables -F
# idem pour les chaines perso
iptables -X
# Nouvelle chaine pour placer dans les log
echo "Definition pour les log: intitulé dans syslog: '[IPTABLES DROP] : ' "
iptables -N LOG_DROP
iptables -A LOG_DROP -m limit --limit 15/minute -j LOG --log-prefix '[IPTABLES DROP] : '
# nous faisons une chaine pour droper silencieusement:
iptables -A LOG_DROP -j DROP
# Nous faisons pointer sur DROP (effacement complet des paquets entrants)
echo "interdiction de tout les paquets par defaut"
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
# Nous pointons les tables nat et mangle sur accept, toutes les autres
# (c'est à dire filter uniquement) pointent sur drop
echo "tout sur 'nat' et 'mangle' est accepté"
iptables -t nat -F
iptables -t nat -X
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
# Jusqu'ici, rien ne passe:
# -> ni du net vers le serveur
# -> ni du reseau local vers le serveur
# -> ni du serveur vers le reseau local
# -> ni du serveur vers lui même
# Ouvrons quelques portes en considerans le resau local 'sûr'
# Les process locaux peuvent parler entre eux
echo " "
echo "autorisation sur 'lo'"
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# On veut pouvoir ouvrir une connexion avec le modem adsl
# iptables -A INPUT -i eth0 -j ACCEPT
echo "regle en attente..."
# iptables -A OUTPUT -o eth0 -j ACCEPT
echo "regle en attente..."
# Le reseau local peut aussi parler avec le serveur
echo "autorisation pour: "
echo " -> ncc1701d -> eth1"
iptables -A INPUT -i eth1 -j ACCEPT
echo " -> ncc1701d <- eth1"
iptables -A OUTPUT -o eth1 -j ACCEPT
echo " -> ncc1701d -> usb0"
iptables -A INPUT -i usb0 -j ACCEPT
echo " -> ncc1701d <- usb0"
iptables -A OUTPUT -o usb0 -j ACCEPT
echo " -> ncc1701d -> wlan0"
iptables -A INPUT -i wlan0 -j ACCEPT
echo " -> ncc1701d <- wlan0"
iptables -A OUTPUT -o wlan0 -j ACCEPT
# A present, on peut pinger en interne, uniquement, mais on ne
# peut pas encore allez sur le net
# On accept les connexions du reseau local vers le net
echo "forwarding pour: "
echo " -> eth1 -> ppp0"
iptables -A FORWARD -i eth1 -o ppp0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
echo " -> usb0 -> ppp0"
iptables -A FORWARD -i usb0 -o ppp0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
echo " -> wlan0 -> ppp0"
iptables -A FORWARD -i wlan0 -o ppp0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# On accept les connexions venant du net UNIQUEMENT si ce celles-ci
# on ete initialisees par le reseau local
echo "accepter les paquets en réponse à une demande du réseau local: "
echo " -> ppp0 -> eth1"
iptables -A FORWARD -i ppp0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
echo " -> ppp0 -> usb0"
iptables -A FORWARD -i ppp0 -o usb0 -m state --state ESTABLISHED,RELATED -j ACCEPT
echo " -> ppp0 -> wlan0"
iptables -A FORWARD -i ppp0 -o wlan0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Ouvrons le net pour les clients traversant le serveur
echo "masquerade"
echo " -> reseau 192.168.2.0/24"
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o ppp0 -j MASQUERADE
echo " -> reseau 192.168.3.0/24"
iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o ppp0 -j MASQUERADE
# Jusqu'ici, le serveur peut parler avec le reseau local, mais pas avec le net
# (mais le reseau local peux parler avec le net)
# de plus, le net ne peut pas parler avec le serveur (ni avec le reseau local,
# sauf pour les connexions déjà établies depuis les hotes du reseau local)
# On va ouvrir quelques portes du serveur vers le net
echo " "
echo "ouverture de quelques portes:"
# le dns:
echo " - requetes dns serveur -> net"
iptables -A OUTPUT -o ppp0 -p udp --sport 1024: --dport 53 -m state --state ! INVALID -j ACCEPT
echo " - réponses de net aux demandes du serveur"
iptables -A INPUT -i ppp0 -p udp --sport 53 --dport 1024: -m state --state RELATED,ESTABLISHED -j ACCEPT
# le courrier (smtp):
echo " - courrier smtp serveur -> net"
iptables -A OUTPUT -o ppp0 -p tcp --sport 1024: --dport 25 -m state --state ! INVALID -j ACCEPT
echo " - réponse du net aux requetes smtp d'exim"
iptables -A INPUT -i ppp0 -p tcp --sport 25 --dport 1024: -m state --state RELATED,ESTABLISHED -j ACCEPT
# on doit pouvoir récupérer du courrier via fetchmail sur le port 110 (pop3)
echo " - courrier pop3 serveur -> net"
iptables -A OUTPUT -o ppp0 -p tcp --dport 110 -m state --state ! INVALID -j ACCEPT
echo " - réponse du net aux requetes pop3"
iptables -A INPUT -i ppp0 -p tcp --sport 110 -m state --state RELATED,ESTABLISHED -j ACCEPT
# wwwoffle doit pouvoir allez sur le net
echo " - proxy du serveur -> net"
iptables -A OUTPUT -o ppp0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
echo " - réponse du net aux requetes de wwwofle"
iptables -A INPUT -i ppp0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
# leafnode doit pouvoir allez sur le net
echo " - leafnode du serveur -> net"
iptables -A OUTPUT -o ppp0 -p tcp --dport 119 -m state --state NEW,ESTABLISHED -j ACCEPT
echo " - réponse du net aux requetes de leafnode"
iptables -A INPUT -i ppp0 -p tcp --sport 119 -m state --state ESTABLISHED -j ACCEPT
# ----------------------------------------------
# le ftp doit passer du serveur vers internet:
echo " - requete ftp (actif et passif) du serveur -> net"
echo " - réponse du net aux requetes ftp"
iptables -A INPUT -p tcp -m tcp --sport ftp -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport ftp -m state --state NEW,ESTABLISHED -j ACCEPT
# active FTP
iptables -A INPUT -p tcp -m tcp --sport ftp-data -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport ftp-data -m state --state ESTABLISHED -j ACCEPT
# passive FTP
iptables -A INPUT -p tcp -m tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT
# Maintenant, on veux acceder depuis le net, à divers service du serveur.
echo " "
echo "ouverture des ports pour l'acces du net vers mes serveurs:"
# ssh:
echo " -> ouverture ssh net -> serveur"
iptables -A INPUT -p tcp --dport 22 -i ppp0 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -o ppp0 -j ACCEPT
# le serveur apache:
echo " -> ouverture http net -> serveur"
iptables -A INPUT -p tcp --dport www -i ppp0 -j ACCEPT
iptables -A OUTPUT -p tcp --sport www -o ppp0 -j ACCEPT
# le serveur ftp?
echo " -> ouverture ftp net -> serveur"
# iptables -A INPUT -p tcp --dport www -i ppp0 -j ACCEPT
# iptables -A OUTPUT -p tcp --sport www -o ppp0 -j ACCEPT
# la partie sécurisee du serveur apache:
echo " -> ouverture https net -> serveur"
iptables -A INPUT -p tcp --dport https -i ppp0 -j ACCEPT
iptables -A OUTPUT -p tcp --sport https -o ppp0 -j ACCEPT
# Nous ouvrons 'un peu' sur le protocole ICMP, au moins pour récupérer les
# messages d'erreurs pour nos propres demandes (du serveur car nous avions
# déjà tout ouvert pour les hotes du reseau local)
echo "Autorisation de réponse(s) icmp"
iptables -A INPUT -p icmp -m state --state RELATED -j ACCEPT
# ---------------------------------------------------------------------------------
# Toutes les règles qui n'ont pas passé les
# règles du firewall seront refusées et loguées...
# facile :
echo "---------------------------------------------------------------------------------"
echo "on bloque silencieusement certains ports"
# *************************************
# les services fermés silencieusement
# *************************************
# for p in auth
# do
# iptables -A INPUT -p tcp --dport $p -i ppp0 -j DROP
# done
# for p in netbios-ns microsoft-ds
# do
echo "port 135"
p=135
iptables -A INPUT -p tcp --dport $p -i ppp0 -j DROP
iptables -A INPUT -p udp --dport $p -i ppp0 -j DROP
echo "port 136"
p=136
iptables -A INPUT -p tcp --dport $p -i ppp0 -j DROP
iptables -A INPUT -p udp --dport $p -i ppp0 -j DROP
echo "port 137"
p=137
iptables -A INPUT -p tcp --dport $p -i ppp0 -j DROP
iptables -A INPUT -p udp --dport $p -i ppp0 -j DROP
echo "port 138"
p=138
iptables -A INPUT -p tcp --dport $p -i ppp0 -j DROP
iptables -A INPUT -p udp --dport $p -i ppp0 -j DROP
echo "port 4762"
p=4762
iptables -A INPUT -p tcp --dport $p -i ppp0 -j DROP
iptables -A INPUT -p udp --dport $p -i ppp0 -j DROP
# done
echo "tous les paquets qui ne sont pas valables iront dans /var/log/syslog"
iptables -A FORWARD -j LOG_DROP
iptables -A INPUT -j LOG_DROP
iptables -A OUTPUT -j LOG_DROP
echo "---------------------------------------------------------------------------------"
# ---------------------------------------------------------------------------------
echo "Fin"
}
script_stop() {
echo " "
echo "Arret du firewall"
echo " "
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -F
iptables -t nat -X
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
iptables -t mangle -F
iptables -t mangle -X
iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
echo " [pare-feu desactivé! ]"
}
script_restart() {
script_stop
sleep 2
script_start
}
case "$1" in
'start')
script_start
;;
'stop')
script_stop
;;
'restart')
script_restart
;;
'status')
iptables -L
iptables -t nat -L
iptables -t mangle -L
;;
*)
echo "Usage: fire-script.sh {start|stop|restart|status}"
esac