Firewall - debian


#1

Bonjour à tous !!!

Me voilà de retour avec mes mille et une questions !!! :stuck_out_tongue:

Ca fait déjà plusieurs fois que je cherche via notre célèbre ami ‘google’ de la doc sur comment installer un firewall sous debian.
Je trouve des pages disant ce qu’il faut faire… mais sans réelles explications… :cry:
J’aime bien suivre un exemple, mais j’aime encore plus lorsque, par exemple, on me dit pourquoi on doit retirer tel ou tel paquet…

Voili, voilou.
Je remercie d’avance toute bonnes âmes m’aidant dans ma recherche !!!


#2

Va voir là, c’est plein d’exemple de script firewall => http://www.linuxguruz.com/iptables/

A ta question, pourquoi “retirer” tel ou tel paquet, la réponse est simple : parce que l’admin du firewall ne veut pas que tel paquet passe … En gros mille et une raison de bloquer un port …


#3

bonsoir,
je te conseille guarddog, facile à parametrer et efficace selon moi.
Bonne soirée.


#4

slt,

encore et toujours “man iptables”…puis linux-france.org/prj/inetdoc … ing-HOWTO/ sinon vla un bout de code pour te donné les bases…tu fou ca dans tes rcx.d qui vont bien et voilou

#!/bin/sh

Start/stop/restart/status firewall:

red="\033[01;31m"
whi="\033[0m"
firewall_start() {

                            echo "[Démarrage du firewall]"

    ############################### REGLES PAR DEFAUT ###########################

                            echo "[Initialisation de la table filter]"
    iptables -F
    iptables -X

                            echo "[Politique par défaut de la table filter]"

    # On ignore tout ce qui entre ou transite  par la passerelle
    iptables -P INPUT DROP
    iptables -P FORWARD DROP

    # On accepte, ce qui sort
    iptables -P OUTPUT ACCEPT

    # Pour éviter les mauvaises suprises, on va
    # autoriser l'accès à la loopback, c'est vital !
    iptables -A INPUT  -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT

    ############################### LOCAL-INTERNET ###########################

    #echo "[On autorise les clients à accéder à internet ]"

    #On créé une nouvelle chaîne, le nom est indifférent
    # appelons-la "local-internet"
    iptables -N local-internet

    # On définit le profil de ceux qui appartiendront à "local-internet"
    # "local-internet" concerne toutes les connections sauf celles venant d'internet ( ! = non)
    # En gros avec ça, vous rendez, vos serveurs inaccessibles depuis internet.
    # Pas de panique, certains serveurs seront autorisés explicitement dans la suite.
    iptables -A local-internet -m state --state NEW -i ! eth0 -j ACCEPT

    #Evidemment, une fois acceptées comme "local-internet", les connections peuvent continuer
    # et faire des petits :slightly_smiling:
    iptables -A local-internet -m state --state ESTABLISHED,RELATED -j ACCEPT

    # On termine en indiquant que les connections appartenant à "local-internet"
    # accèdent à internet de manière transparente.
    iptables -A INPUT -j local-internet
    iptables -A FORWARD -j local-internet

    ############################### LES TABLES NAT ET MANGLE #############################

                            echo "[Initialisation des tables nat et mangle]"

    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

    #################################### LE MASQUERADING ########################################

    # Commentez ces 2 lignes, si vous ne faîtes pas du masquerading (nat)
    #echo "[Mise en place du masquerading]"
    #iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE

    ################################# ACTIVATION DE LA PASSERELLE ##################

    #echo "[Activation de la passerelle]"
    #echo 1 > /proc/sys/net/ipv4/ip_forward

    ################################# PAS DE SPOOFING ############################

                            echo "[Pas de sp00fing]"
    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 "[Pas de synfl00d]"
    if [ -e /proc/sys/net/ipv4/tcp_syncookies ] ; then
            echo 1 > /proc/sys/net/ipv4/tcp_syncookies
    fi

    ################################## PAS DE PING ###############################

    # commentez ces 6 lignes, si vous autorisez les pings sur votre passerelle
    #echo "[Pas ping]"
    #echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
    #echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
    #if [ -e /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ] ; then
    #       echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
    #fi

    ############################ Fonctionnalités serveurs #####################################

    #echo "[Etude des fonctionalités serveurs, visibles depuis internet ]"

    # A ce stade, tous vos clients du réseau local et de la passerelle ont accès à internet. Mieux,
    # vos clients du réseau local, ont accès à vos serveurs apache, proftp ... localement. Mais personne
    # depuis internet ne peux accéder à l'un des serveurs que vous hébergés.

    # Il est bien-sûr possible de dévérrouiller pontuellement l'accès à un serveur depuis internet,
    # en décommentant les 2 ou 3 lignes correspondantes.

                            echo "[Ok pour ssh(22) ...]"
    iptables -A INPUT -p tcp --dport ssh -j ACCEPT

    #echo "[autorisation du serveur smtp(25) ...]"
    #iptables -A INPUT -p tcp --dport smtp -j ACCEPT

    #echo "[autorisation du serveur http(80) ...]"
    #iptables -A INPUT -p tcp --dport www -j ACCEPT

    #echo "[autorisation du serveur https(443) ...]"
    #iptables -A INPUT -p tcp --dport https -j ACCEPT

    #echo "[autorisation du serveur DNS(53) ...]"
    #iptables -A INPUT -p udp --dport domain -j ACCEPT
    #iptables -A INPUT -p tcp --dport domain -j ACCEPT

    #echo "[autorisation du serveur irc(6667) ...]"
    #iptables -A INPUT -p tcp --dport ircd -j ACCEPT

    #echo "[autorisation du serveur cvs (2401) ...]"
    #iptables -A INPUT -p tcp --dport cvspserver -j ACCEPT

    #echo "[autorisation du serveur FTP(21 et 20) ...]"
    #iptables -A INPUT -p tcp --dport ftp -j ACCEPT
    #iptables -A INPUT -p tcp --dport ftp-data -j ACCEPT

    # Ne pas décommenter les 3 lignes qui suivent.
    # Plus généralement :
    #echo "[autorisation du serveur Mon_truc(10584) ...]"
    #iptables -A INPUT -p tcp --dport 10584 -j ACCEPT

                    echo -e $red "-[ firewall activé mon poussin... ^_^ ]-"
                    echo -e "$whi"

}

firewall_stop() {

    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 " [firewall descativé! ]"

}

firewall_restart() {
firewall_stop
sleep 2
firewall_start
}

case “$1” in
’start’)
firewall_start
;;
‘stop’)
firewall_stop
;;
‘restart’)
firewall_restart
;;
‘status’)
iptables -L
iptables -t nat -L
iptables -t mangle -L
;;
*)
echo "Usage: firewall {start|stop|restart|status}"
esac


#5

Merci beaucoup pour cette exemple !!

Petite question, si je place le script dans le répertoire rcx.d qui va bien, ca ne le démarrera que pour le niveau de démarrage établit dans mon fichier /etc/inittab ?

Es-tu sûre de m’avoir donné un exemple pour Debian ? Je n’ai jamais vu encore de service ‘status’ sous Debian… Sous Red-Hat oui…

Et puis, le fichier *.sh ne doit-il pas plutôt être dans /etc/init.d/ ?


#6

Effectivement, sous Debian on place les scripts de démarrage sous /etc/init.d puis on active leur démarrage avec la commande update-rc.d
Les paramétres que l’on peut passer au script, c’est au minimum start ou stop, mais tu peux en rajouter tant que tu veux, et ce que tu veux.


#7

[quote=“stonfi”]slt,

encore et toujours “man iptables”…puis linux-france.org/prj/inetdoc … ing-HOWTO/ sinon vla un bout de code pour te donné les bases…tu fou ca dans tes rcx.d qui vont bien et voilou

#!/bin/sh

Start/stop/restart/status firewall:

red="\033[01;31m"
whi="\033[0m"
firewall_start() {

                            echo "[Démarrage du firewall]"

    ############################### REGLES PAR DEFAUT ###########################

                            echo "[Initialisation de la table filter]"
    iptables -F
    iptables -X

                            echo "[Politique par défaut de la table filter]"

    # On ignore tout ce qui entre ou transite  par la passerelle
    iptables -P INPUT DROP
    iptables -P FORWARD DROP

    # On accepte, ce qui sort
    iptables -P OUTPUT ACCEPT

    # Pour éviter les mauvaises suprises, on va
    # autoriser l'accès à la loopback, c'est vital !
    iptables -A INPUT  -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT

    ############################### LOCAL-INTERNET ###########################

    #echo "[On autorise les clients à accéder à internet ]"

    #On créé une nouvelle chaîne, le nom est indifférent
    # appelons-la "local-internet"
    iptables -N local-internet

    # On définit le profil de ceux qui appartiendront à "local-internet"
    # "local-internet" concerne toutes les connections sauf celles venant d'internet ( ! = non)
    # En gros avec ça, vous rendez, vos serveurs inaccessibles depuis internet.
    # Pas de panique, certains serveurs seront autorisés explicitement dans la suite.
    iptables -A local-internet -m state --state NEW -i ! eth0 -j ACCEPT

    #Evidemment, une fois acceptées comme "local-internet", les connections peuvent continuer
    # et faire des petits :slightly_smiling:
    iptables -A local-internet -m state --state ESTABLISHED,RELATED -j ACCEPT

    # On termine en indiquant que les connections appartenant à "local-internet"
    # accèdent à internet de manière transparente.
    iptables -A INPUT -j local-internet
    iptables -A FORWARD -j local-internet

    ############################### LES TABLES NAT ET MANGLE #############################

                            echo "[Initialisation des tables nat et mangle]"

    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

    #################################### LE MASQUERADING ########################################

    # Commentez ces 2 lignes, si vous ne faîtes pas du masquerading (nat)
    #echo "[Mise en place du masquerading]"
    #iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ppp0 -j MASQUERADE

    ################################# ACTIVATION DE LA PASSERELLE ##################

    #echo "[Activation de la passerelle]"
    #echo 1 > /proc/sys/net/ipv4/ip_forward

    ################################# PAS DE SPOOFING ############################

                            echo "[Pas de sp00fing]"
    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 "[Pas de synfl00d]"
    if [ -e /proc/sys/net/ipv4/tcp_syncookies ] ; then
            echo 1 > /proc/sys/net/ipv4/tcp_syncookies
    fi

    ################################## PAS DE PING ###############################

    # commentez ces 6 lignes, si vous autorisez les pings sur votre passerelle
    #echo "[Pas ping]"
    #echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
    #echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
    #if [ -e /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses ] ; then
    #       echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
    #fi

    ############################ Fonctionnalités serveurs #####################################

    #echo "[Etude des fonctionalités serveurs, visibles depuis internet ]"

    # A ce stade, tous vos clients du réseau local et de la passerelle ont accès à internet. Mieux,
    # vos clients du réseau local, ont accès à vos serveurs apache, proftp ... localement. Mais personne
    # depuis internet ne peux accéder à l'un des serveurs que vous hébergés.

    # Il est bien-sûr possible de dévérrouiller pontuellement l'accès à un serveur depuis internet,
    # en décommentant les 2 ou 3 lignes correspondantes.

                            echo "[Ok pour ssh(22) ...]"
    iptables -A INPUT -p tcp --dport ssh -j ACCEPT

    #echo "[autorisation du serveur smtp(25) ...]"
    #iptables -A INPUT -p tcp --dport smtp -j ACCEPT

    #echo "[autorisation du serveur http(80) ...]"
    #iptables -A INPUT -p tcp --dport www -j ACCEPT

    #echo "[autorisation du serveur https(443) ...]"
    #iptables -A INPUT -p tcp --dport https -j ACCEPT

    #echo "[autorisation du serveur DNS(53) ...]"
    #iptables -A INPUT -p udp --dport domain -j ACCEPT
    #iptables -A INPUT -p tcp --dport domain -j ACCEPT

    #echo "[autorisation du serveur irc(6667) ...]"
    #iptables -A INPUT -p tcp --dport ircd -j ACCEPT

    #echo "[autorisation du serveur cvs (2401) ...]"
    #iptables -A INPUT -p tcp --dport cvspserver -j ACCEPT

    #echo "[autorisation du serveur FTP(21 et 20) ...]"
    #iptables -A INPUT -p tcp --dport ftp -j ACCEPT
    #iptables -A INPUT -p tcp --dport ftp-data -j ACCEPT

    # Ne pas décommenter les 3 lignes qui suivent.
    # Plus généralement :
    #echo "[autorisation du serveur Mon_truc(10584) ...]"
    #iptables -A INPUT -p tcp --dport 10584 -j ACCEPT

                    echo -e $red "-[ firewall activé mon poussin... ^_^ ]-"
                    echo -e "$whi"

}

firewall_stop() {

    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 " [firewall descativé! ]"

}

firewall_restart() {
firewall_stop
sleep 2
firewall_start
}

case “$1” in
’start’)
firewall_start
;;
‘stop’)
firewall_stop
;;
‘restart’)
firewall_restart
;;
‘status’)
iptables -L
iptables -t nat -L
iptables -t mangle -L
;;
*)
echo "Usage: firewall {start|stop|restart|status}"
esac[/quote]
salut,

la pluaprt des firewall sont basé sur iptables.
si tu ne veux une interface graphique plus conviviale pour ton firewall, il y a firestarter dispo en paquets debian.
A+


#8

Moi, j’ai bcp appris ici : olivieraj.free.fr/fr/linux/information/firewall/
:wink:


#9

Alors, nous avons le schema suivant :

Et nous avons les règles suivantes :

[quote] TCP/IP - Administration de réseau - O’REILLY
b[/b] iptables - F INPUT
b[/b] iptables -F FORWARD
b[/b] iptables -A INPUT -i eth1 -j DROP
b[/b] iptables -A FORWARD -i eth1 -s 172.16.0.0/16 -j DROP
b[/b] iptables -A FORWARD -o eth1 -d 172.16.0.0/16 -j DROP
b[/b] iptables -A FORWARD -d 172.16.12.1 25 -j ACCEPT
b[/b] iptables -A FORWARD -d 172.16.12.6 80 -j ACCEPT
b[/b] iptables -A FORWARD -j DROP[/quote]

Bon, on est d’accord sur le faite que les ligne 1 et 2 efface les règles concernant le trafic entrant à destination d’un processus et le trafic émis d’un système à un autre.

La ligne 3 détruit tous les paquets entrant à destination d’un processus mais je n’arrive pas à comprendre le sens de ‘i’ :


ou

Quelqu’un peut-il me dire si je me trompe complètement d’interprétation ou sinon le sens réel de i ?

Merci d’avance !!!


#10

Quel i ? Sur la figure ou dans les règles ?


#11

Dans ta figure, le i correspond à un paquet reçu ou émis par ta machine.
Autre chose, si tu souhaites qu’une chaine DROP les paquets qu’elle reçoit par défaut, utilise plutôt

Là, la chaine input rejettera tous les paquets qui passent dans cette chaine et qui ne sont pas traités par une autre régle.
Généralement, on commence toujours une chaîne par un connection tracking :

Ainsi, lorsqu’une connection est ouverte par ta machine vers l’exterrieur, la machine distante pourra répondre sans probléme.

Le plus important dans iptables, c’est de bien comprendre dans quel chaîne passe chaque paquet entrant, sortant ou transitant par ta machine, après ça va tout seul.


#12

Le ‘i’ correspond au : iptables -A INPUT [u]-i[/u] eth1 -j DROP.


#13

ha, dans ce cas le -i correspond à --in-interface. T’as fait un man iptables avant de poser cette question? :laughing:


#14

Ca veut dire interface. Tu spécifies que tu agis sur les paquets transitant via cette interface réseau.


#15

Oui, je sais que ‘i’ :
“définit le nom de l’interface réseau d’entrée auquel la règle s’applique. Seuls les paquets reçus sur cette interface sont concernés par la règle.”

Mais du coup quel est la différence avec ‘o’ ?
(‘o’ : “définit le nom de l’interface réseau de sortie auquel la règle s’applique. Seuls les paquets envoyés via cette interface sont concernés par la règle.”)


#16

i=entrée, o=sortie, je vois difficilement comment être plus clair.
i veut dire que la régle s’applique aux paquets entrant par cette interface, o veut dire que la régle s’applique aux paquets sortant par cette interface.


#17

et oui.
Car on peut souhaiter traiter “en entrée” des paquets à destination de telle ou telle interface de sortie.
Le “lieu” de traitement (INPUT OUTPUT) est dans le cas général différent de l’interface d’entrée ou de sortie par lesquels passent des paquets.


#18

Merci Bobx !!!

Iptables commence à devenir plus claire !!


#19

Me revoilà !!! :laughing:

J’ai créé mon script iptables.sh.

Par contre je ne trouve pas comment faire pour créé mon fichier /etc/rc2.d/Sxxiptables… Quelqu’un pourrait me donner un p’tit coup de pouce ?

(Au fait, vive iptables -L -v !!! Ca aide à visualiser ce que l’on fait !!! lol )


#20

Le mieux pour un script de firewall, c’est de le déposer dans /etc/network/if-up.d pour qu’il soit lancé lorsque le réseau est démarré.