Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
Fonctionnement d'un parefeu iptables
Envoyé par: paulriluma

Bonjour tout le monde
Je me suis conçu un petit parefeu fonctionnant avec Iptables.
Je fonctionne avec une sarge et une connection bas débit
(bon je sais, un parefeu sur une connection bas débit... mais au moins je serai paré pour quand j'aurai l'adsl...)
ça semble marcher correctement sauf que :
Je ne peux pas faire de transfert de fichier via ftp avec gFTP par exemple pour installer un site...
Je ne peux pas ouvrir la page d'administration de mon compte chez mon fournisseur d'accès en l'occurance club-internet. Ces pages fnctionnent avec ssl.
J'ai par exemple bien essayé d'ajouter des lignes concernant ssl, mais comme ça ne correspond à aucun port listé dans le /etc/services, iptables me raconte que les lignes en questions sont erronées...
Donc ma question, c'est de savoir quoi faire pour ouvrir les connection sécurisées sur les pages de fournisseurs d'accès et les transferts ftp.
Voilà
Je vous mets là le parefeu en question... des fois que ça inspirerait quelqu'un
c'est conçu à partir de plusieurs parefeu proposés sur les site de trustonme et de lea linux et quelques autres documentations glanées sur le net.
Merci de toute suggestion
Paul
#!/bin/sh

#fonction de chargement des modules
chargemd(){
/sbin/modprobe iptable_nat
/sbin/modprobe iptable_filter
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc
echo "[les modules sont charges]"
}
#fonction de vidage des règles
vidage(){
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -F
echo "[toutes les regles sont effacees]"
}
#fonction de mise à zéro de iptable
zero(){
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
echo "[iptable permet tout partout]"
}
#fonction de mise en place du masquerading
nat(){
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
echo "[Le masquerading est en place]"
}
#surveillance minimale de ce que le parefeu interdit
jrnl(){
iptables -N LOG_DROP
iptables -A LOG_DROP #--log-prefix IPT ça n\'est pas reconnu
iptables -A LOG_DROP -j DROP
}
#régles par défaut sur la machine locale
deflo(){
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A FORWARD -i lo -j ACCEPT
iptables -A FORWARD -o lo -j ACCEPT
echo "[iptable permet tout sur la machine locale]"
}
#règles par défaut sur le réseau local
defet(){
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A OUTPUT -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -j ACCEPT
iptables -A FORWARD -o etho -j ACCEPT
echo "[iptable bloque l'exterieur et permet les mouvements interieurs au reseau]"
}
#regles suplementaires : ce que l'on permet
regles(){
iptables -A OUTPUT -p icmp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p icmp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p icmp -m state --state NEW -m limit --limit 10/min -j ACCEPT

iptables -A FORWARD -i eth0 -o ppp0 -j ACCEPT
iptables -A FORWARD -o etho -i ppp0 -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --sport www -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p tcp --dport www -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p tcp --dport 20 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --sport 21 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p tcp --dport 21 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p udp --sport 20 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p udp --dport 20 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p udp --sport 21 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p udp --dport 21 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p udp --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p udp --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p udp --sport tftp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p udp --dport tftp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --sport pop3 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p tcp --dport pop3 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --sport pop3s -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p tcp --dport pop3s -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --sport smtp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p tcp --dport smtp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --sport irc -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p tcp --dport irc -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p tcp --sport domain -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p tcp --dport domain -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i ppp0 -p udp --sport domain -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p udp --dport domain -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#pas de spoofing
if [ -e /proc/sys/net/ipv4/conf/all/ip_filter ];
then
for filtre in /proc/sys/net/ipv4/conf/*/rp_filter
do
echo > 1 $filtre
done
fi
echo "[pas de spoofing]"
#pas de synflood
if [ -e /proc/sys/net/ipv4/tcp_syncookies ];
then
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
fi
echo "[pas de synflood]"
}
#status : apperçu des regles en cours
status(){
iptables -L
iptables -t nat -L
}
jrnls(){
iptables -A FORWARD -j LOG_DROP
iptables -A INPUT -j LOG_DROP
iptables -A OUTPUT -j LOG_DROP
}
#programme du parefeu en lui-même
start(){
chargemd
vidage
zero
nat
jrnl
deflo
defet
regles
echo "[le parefeu demarre]"
}
#arret du parefeu avec conservation du masquerading
stop(){
vidage
zero
nat
echo "[le parefeu s'arrete et le masquerading reste]"
}
#redémarrage du marefeu
restart(){
stop
sleep 2
jrnl
deflo
defet
regles
echo "[le parefeu redemarre]"
}
case "$1" in
'start')
start
;;
'stop')
stop
;;
'restart')
restart
;;
'status')
status
;;
*) echo "[usage : { start | stop | restart | status }]"
esac
#EOF

Poste le Sunday 20 January 2008 11:13:49
Répondre     Citer    
Re: Fonctionnement d'un parefeu iptables
Envoyé par: chromosome

Et bien t'en as du courage pour taper un truc pareil.

Il y a beaucoup plus simple que ca.
Tu devrais mettre en premier lieu simplement 3 regles RELATED,ESTABLISHED (et sans NEW) sur les trois tables. Ensuite dans tes regles n'ouvres que les regles pour l'initialisation des sessions (donc en tenant compte de celui qui initie la connection comme source). Apres tu peux mettre les numero de port au lieu des nom, ca solutionnera ton probleme pour le port d'administration.

Ensuite il faut mettre les regles DROP comme defaut sur les interfaces sauf peut-etre pour l'OUTPUT.

Tu ne dois pas definir les regles de retours car celle-ci sont inclues dans la regles ESTABLISHED,RELATED (sans filtre)
Ensuite ton script sera beaucoup plus clair.

Poste le Sunday 20 January 2008 19:03:57
Répondre     Citer    
Re: Fonctionnement d'un parefeu iptables
Envoyé par: paulriluma

Bonjour chromosome
Bon merci pour cette réponse indicatrice de pas mal de trucs à revoir...
Bon pour lees numéro de port : oui en plus je mets multiport avant et j'indique l'ensemble des ports séparé par des virgules
d'accord
mais alors pour le reste
je n'ai pas bien clairement compris ce que tu indiques
tu me dis de mettre trois règles... established related : oui lesquelles et à la place desquelles ?
ensuite tu me dis de mettre du drop par défaut sauf pour le output je suppose que tu fais allusion au reègle que j'ai mis dans la function defet ?
ben oui mais justement *j'ai testé et si je ne fais pas comme ça, je ne vois rien à l'extérieur ! où alors précise ce que tu penses que je devrais modifier
merci d'avance de tes conseils
paul

Poste le Sunday 20 January 2008 19:58:02
Répondre     Citer    
Re: Fonctionnement d'un parefeu iptables
Envoyé par: chromosome

Alors il te faut uniquement c'est lignes en ESTABLISHED,RELATED


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

Ensuite tu mets tes regles qu'il te faut, mais simplement celles qui initient la session, donc un truc du genre :


iptables -A FORWARD -i eth1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp --dport 443 -j ACCEPT
iptables -A FORWARD -i eth1 -p udp --dport 53 -j ACCEPT
....

Il ne sert a rien de mettre des regles pour l'OUTPUT (du moins en ACCEPT) car la regle par defaut est deja ACCEPT.

Tu mets un LOG sur les dernieres lignes des tables qui sont en DROP par defaut

donc tu dois avoir avant :
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

Poste le Sunday 20 January 2008 22:27:52
Répondre     Citer    
Re: Fonctionnement d'un parefeu iptables
Envoyé par: paulriluma

Bonjour Chromosome
Je te remercie de ces indications
je vais me débrouiller avec ça et je donnerai des nouvelles des conséquences
à suivre
Paul

Poste le Monday 21 January 2008 08:34:33
Répondre     Citer    
Re: Fonctionnement d'un parefeu iptables
Envoyé par: paulriluma

Bon Suite aux remarques et indications de Chromosome j'ai fait des essais et modifications
en fait je m'apperçois que mes règles sont trop permissives ou l'inverse !. Tel que construit j'ai pu testé chaque partie du programme séparément.
et bref... mon réseau derrière la passerelle est soit complètement ouvert soit complètement fermé !!!
bon alors d'abords je reprécise comment est mon réseau : une machine 192.168.1.1 qui me sert de masserelle et que j'utilise pour faire des trasfert ftp pour installer des sites et du courrier (donc y'a dessus clamav qui tourne et thunderbird)
et les deux autres machines 192.168.1.2 et 192.168.1.3 qui sont mandrake et sarge et qui de temps en temps vont jeter un oeil sur internet.
Donc le parefeu est sur la passerelle.
J'ai d'abord déclaré des variables pour les ports tcp et udp et refait des règles avec -m multiport --dport ou --sport.
déjà ça clarifie un peu
ensuite j'ai essayé de simplifier aussi la logique, mes règles étaient chacune juste mais glogbalement redondantes donc du coup les paquets ne vont pas jusqu'au bout des règles... je ne suis pas bien sûr d'avoir tout compris là dedans
bref pour résumer je copie là les éléments principaux de mes modifications.
bon mais y'a encore à voir...
parce que en l'état, les autres machines que la passerelle ne voient pas internet.
#définition des variables de ports
defvar(){
tcpt="20,21,22,25,53,80,110,194,443,995"
udpt="21,22,53,69,80,443"
}
#
...
...
#règles par défaut sur le réseau local
defet(){
#politique par défaut
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
echo "[iptable bloque l'exterieur et permet les mouvements interieurs au reseau]"
}
#regles suplementaires : ce que l'on permet
regles(){
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #là j'ai un doute quant à l'indispensabilité ...
iptables -A FORWARD -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT

#iptables -A INPUT -p icmp -m state --state NEW -m limit --limit 10/min -j ACCEPT

iptables -A FORWARD -i eth0 -p tcp -m multiport --dport $tcpt -j ACCEPT
iptables -A FORWARD -i eth0 -p udp -m multiport --dport $udpt -j ACCEPT

a
#iptables -A FORWARD -i ppp0 -o eth0 -p tcp -m multiport --dport $tcpto -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#iptables -A FORWARD -i eth0 -p udp -m multiport --dport $udpto -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
...
}
Voilà
Merci de toute expertise
à suivre
Paul

Poste le Monday 21 January 2008 21:45:28
Répondre     Citer    
Re: Fonctionnement d'un parefeu iptables
Envoyé par: chromosome

Alors 2 choses :
- Tes ports UDP , tu es sur ? udp 21 ? udp 22 ? 80 et 443 ? La j'ai des gros doutes.
- Maintenant il te manque plus que la regle de LOG a mettre en dernier lieu, et alors faire tes tests, et dans les log tu verras pourquoi il drop. (en esperant que tu as quand meme laisser le chargement des modules et le MASQUERADE)

Poste le Monday 21 January 2008 23:56:25
Répondre     Citer    
Re: Fonctionnement d'un parefeu iptables
Envoyé par: paulriluma

Bonjour chromosome.
oui bien sûr j'ai rien touché aux autres modules du programme.
je n'ai effectivement pas penc*ser à aller voir dans les log ce qu'il raconte.
bon pour les ports udp, c'est parce que je les ai vu comme ça dans la listes et que je ne comprends pas ce qui empèche la connection complète lors du transfert ftp, gftp attend une cnfirmation qui ne vient pas, j'ai bien le mode passif mis dans les préférences etc
et d'autre part je ne comprends pas quel ports est cause de l'ouverture ou non des pages spéciales demandant aussi un code (sur les pages des fai et flashmail)
voilà
j'ai voulu tout essayé
mais bon
ça ne march pas non plus
je vais voir ça aujourd'hui
à suivre
paul

Poste le Tuesday 22 January 2008 08:32:08
Répondre     Citer    
Re: Fonctionnement d'un parefeu iptables
Envoyé par: paulriluma

Rebonjour tout le monde
Bon il semble que cette fois je tienne le bon bout
j'ai apporté quelques épuration dans la liste de ports ouverts en udp d'une part
et fait une modification qui a donné des résultats positifs.
il fallait déclarer l'ouverture du FORWARD avec -i eth0 -o ppp0 pour que les paquets de nouvelles connections "NEW" traversent le parefeu depuis le réseau local vers l'internet.
Une de mes incompréhensions, je suppose, était dans le sens directionnel à donner à -i et -o selon qu'on parle de ppp0 ou de eth0 sur la machine passerelle où est installé le parefeu.
donc au final
je recopie ici les modifs dernièrement faites :
#définition des variables de ports
#J'ai regroupé les ports selon les processus tcp et udp afin de simplifier les règles d'ouverture sélectives des ports.
defvar(){
tcpt="20,21,22,25,53,80,110,194,443,995"
udpt="53,69"
}
...
#regles suplementaires
...
regles(){<br />
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
iptables -A FORWARD -i eth0 -o ppp0 -m state --state NEW -p tcp -m multiport --dport $tcpt -j ACCEPT
iptables -A FORWARD -i eth0 -o ppp0 -m state --state NEW -p udp -m multiport --dport $udpt -j ACCEPT
...
Voilà
Merci à chromosome de son aide qui a été patiente et essentielle.
au revoir
Paul

Poste le Tuesday 22 January 2008 11:32:02
Répondre     Citer    
Re: Fonctionnement d'un parefeu iptables
Envoyé par: paulriluma

Bon
vous allez rire
C'est pas encore vraiment au point
d'abord j'ai mis à la fin de mon programme une fonction jrnls() pour logguer ce qui ne passe pas
comme suit
iptables -A FORWARD -j LOG
iptables -A INPUT -j LOG
iptables -A OUTPUT -j LOG
pour récupérer tout... au cas où...
Maintenant il y a une question idiote... où est-ce que je vais lire la sortie de cette commande ?
Je suis allé fouiner dans /var/sys/log... oui mais plus précisément... je suis en train de fouiller la doc, mais pour le moment je n'ai pas trouvé ma réponse

Ensuite serait-il possible donc de mettre une redirection vers un fichier facilement accessible ?
là aussi je fouille la doc sans trouver autre chose que de mettre après LOG --log-prefixe prefixe
oui mais encore, ça 'enregistre où exactement ?

Bon ensuite y aurait-il des sites sur lesquels se brancher pour faire scanner son parefeu et avoir une idée de à quoi il résiste ou pas ?
Merci de vos lumières
Paul

Poste le Tuesday 22 January 2008 12:53:00
Répondre     Citer    
Re: Fonctionnement d'un parefeu iptables
Envoyé par: undeplus

Bonjour,
il me semble que les logs attérissent dans syslog. Si tu veux tes logs dans un fichier à part, installes ulogd. Tes règles iptables devront alors se finir par -j ULOG au lieu de -j LOG

Poste le Tuesday 22 January 2008 16:21:09
Répondre     Citer    
Re: Fonctionnement d'un parefeu iptables
Envoyé par: paulriluma

Merci
je vais voir ça
à suivre
paul

Poste le Tuesday 22 January 2008 16:39:54
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
Fonctionnement d'un parefeu iptables
Un problème avec une commande du shell ? Comment utiliser la crontab ? Vous avez des soucis pour la gestion réseau sous Linux ? Pour vous la gestion des utilisateurs/groupes est du chinois ? Etc... Posez donc vos questions ici.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons