Bon, désolé d'avoir semblé un peu abrupt, même si tu l'as noté, ce n'était que de premier abord. Encore désolé.
M'enfin bon, il fallait bien le décortiquer un peu, ton script, en relevant ligne par ligne, parce que c'est comme ça qu'il faut faire la première fois.
Souvent, les valeureux débutants de l'iptables trafiquent les lignes de leur script comme autant d'incantations khabalistiques, autant de formules magiques leur apportant gloire et sécurité. Je me suis lancé sur le terrain du raseur constructif (j'aime bien cette définition, elle colle bien au BOFH proactif que je suis à mes heures).
Bref, lire les scripts des autres permet de découvrir pleins de fonctions d'iptables que l'on ne soupçonnerais pas. Une fois le concept touché du doigt, on pose la bonne idée sur une liste. Une fois les bonnes idées réunies, on les classe par groupe, pour ne rien oublier.
Ensuite, on pose à plat toutes les interfaces disponibles sur le firewall, à savoir l'interface externe, puis l'interface interne principale. Eventuellement, on pose une ou plusieurs interfaces internes, pour le cas où le firewall devrait gérer plusieurs zones.
Ensuite, on crée l'architecture de base de ses tables, ainsi que leur articulation.
#on prend soin de définir la variable IPTABLES="/usr/sbin/iptables"
#On Flushe tout, on recommence à partir de rien
$IPTABLES -F
$IPTABLES -F -t mangle
$IPTABLES -F -t nat
$IPTABLES -X
$IPTABLES -X -t mangle
$IPTABLES -X -t nat
#Politique par défaut à DROP, et oui, en bas de chaque table,
# il y a DROP, si une ligne n'autorise pas, on tombe sur le
# DROP (refus sans report d'erreur, à la différence de REJECT,
# qui refuse explicitement la conenxiopn)
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
On peut créer une table en plus, comme pour logguer les paquets DROPpés:
$IPTABLES -N LDROP
Et on y rajoute quoi faire avec les paquets en question, ici on loggue et on droppe, mais on peut faire d'autres choses. Ici on loggue les paquets TCP, au maximum 2 fois par seconde.
Il va de soi qu'on peut coller " -p udp" ou "-p icmp" en plus.
On vient de créer une tatable à nous, LDROP, vers laquelle on peut jumper quand on veut. on peut en faire pleins comme ça, pour faciliter la lecture du script. Chaque tatable fait bien un truc, que l'on peut appeller souvent.
Une bonne pratique cool, limiter l'acceptation de paquets d'ouverture de session
#Logging of possible TCP-SYN-Floods
$IPTABLES -N LSYNFLOOD
$IPTABLES -A LSYNFLOOD -m limit --limit 2/s --limit-burst 10 -j LOG --log-prefix "fp=SYNFLOOD:1 a=DROP "
$IPTABLES -A LSYNFLOOD -j DROP
#on note le log-prefix qui permet de modifier la ligne
#s'affichant dans les logs.
On peut créer une table pour faire des choses particulières, puis rendre la main, un peu comme un sous programme, ici pour virer le verbage des partages windows:
#SMB-Traffic
$IPTABLES -N SMB
$IPTABLES -A SMB -p tcp --dport 137 -j DROP
$IPTABLES -A SMB -p tcp --dport 138 -j DROP
$IPTABLES -A SMB -p tcp --dport 139 -j DROP
$IPTABLES -A SMB -p tcp --dport 445 -j DROP
$IPTABLES -A SMB -p udp --dport 137 -j DROP
$IPTABLES -A SMB -p udp --dport 138 -j DROP
$IPTABLES -A SMB -p udp --dport 139 -j DROP
$IPTABLES -A SMB -p udp --dport 445 -j DROP
$IPTABLES -A SMB -p tcp --sport 137 -j DROP
$IPTABLES -A SMB -p tcp --sport 138 -j DROP
$IPTABLES -A SMB -p tcp --sport 139 -j DROP
$IPTABLES -A SMB -p tcp --sport 445 -j DROP
$IPTABLES -A SMB -p udp --sport 137 -j DROP
$IPTABLES -A SMB -p udp --sport 138 -j DROP
$IPTABLES -A SMB -p udp --sport 139 -j DROP
$IPTABLES -A SMB -p udp --sport 445 -j DROP
Pour résumer, on a fait LDROP, TCPACCEPT, LSYNFLOOD et SMB pour nos besoins.
Ensuite, on peut peut commencer la table INPUT de base
#Local IF
$IPTABLES -A INPUT -i lo -j ACCEPT
#Kill connections to the local interface from the outside world (--> Should be already catched by kernel/rp_filter)
$IPTABLES -A INPUT -d 127.0.0.0/8 -j REJECT
## On note l'interface sous forme de variable après le -i, de même l'adresse source après le -s
##Allow unlimited traffic from internal network using legit addresses to firewall-box
##If protection from the internal interface is needed, alter it
$IPTABLES -A INPUT -i $INTIF -s $INTLAN -j ACCEPT
#Kill anything from outside claiming to be from internal network (Address-Spoofing --> Should be already catched by rp_filter)
$IPTABLES -A INPUT -s $INTLAN -j REJECT
Ensuite, on peut commencer à rajouter les lignes de tables provenant de l'extérieur
#On commence à virer silencieusement tout le verbage samba
#Drop all SMB-Traffic
$IPTABLES -A INPUT -i $EXTIF -j SMB
On poursuit les autorisations de services tournant sur la linux box
##Public services running ON FIREWALL-BOX (comment out to activate):
# Le protocole FTP a été pensé par des individus toxocophiles
# abusant de substances mentalocomplexifiantes
# ftp-data
#$IPTABLES -A INPUT -i $EXTIF -p tcp --dport 20 -j TCPACCEPT
# ftp
#$IPTABLES -A INPUT -i $EXTIF -p tcp --dport 21 -j TCPACCEPT
Et la réponse est OUI, c'est chiant à gérer sur un firewall si on ne veut pas avoir tout ouvert en grand. Rassurez vous, il y a pire, H323 par exemple.
On continue avec les services de base, ssh, mail, DNS, web serveur.
On permet aussi les connexions établies, ce qui permet de redémarrer le firewall sans couper toutes les sessions.
##Allow ESTABLISHED/RELATED connections in
$IPTABLES -A INPUT -i $EXTIF -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A INPUT -i $EXTIF -p tcp -m state --state RELATED -j TCPACCEPT
$IPTABLES -A INPUT -i $EXTIF -p udp -m state --state RELATED -j ACCEPT
##Catch all rule
# On finit par jetter tout le reste
$IPTABLES -A INPUT -j LDROP
Là on a finit avec la table INPUT, on poursuit avec la table OUTPUT
##Packets TO FIREWALL-BOX ITSELF
#Local IF
$IPTABLES -A OUTPUT -o lo -j ACCEPT
##Packets TO INTERNAL NET
#Allow unlimited traffic to internal network using legit addresses
$IPTABLES -A OUTPUT -o $INTIF -d $INTLAN -j ACCEPT
##Packets TO EXTERNAL NET
##Silent Drops/Rejects (Things we don't want in our logs)
#SMB
$IPTABLES -A OUTPUT -o $EXTIF -j SMB
##Public services running ON FIREWALL-BOX (comment out to activate):
# ssh
$IPTABLES -A OUTPUT -o $EXTIF -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
# smtp
$IPTABLES -A OUTPUT -o $EXTIF -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
# DNS
$IPTABLES -A OUTPUT -o $EXTIF -p tcp --sport 53 -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTIF -p udp --sport 53 -j ACCEPT
# http
#$IPTABLES -A OUTPUT -o $EXTIF -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
Pour finir, on interdit le reste qui ne soit pas explicitement autorisé
##Catch all rule
$IPTABLES -A OUTPUT -j LDROP
Enfin, on s'occupe de la table de forward
##Filtering FROM INTERNAL NET
##Silent Drops/Rejects (Things we don't want in our logs)
#SMB
$IPTABLES -A FORWARD -o $EXTIF -j SMB
#On traloque les ports que l'on veut, ici le http, caché derrière le fw sur une autre machine, par exmeple.
#Port-Forwarding from Ports < 1024 [outbound] (--> Also see chain PREROUTING)
#HTTP-Forwarding
#$IPTABLES -A FORWARD -o $EXTIF -s $HTTPIP -p tcp --sport 80 -j ACCEPT
##Filtering FROM EXTERNAL NET
##Silent Drops/Rejects (Things we don't want in our logs)
#SMB
$IPTABLES -A FORWARD -i $EXTIF -j SMB
##Allow replies coming in
$IPTABLES -A FORWARD -i $EXTIF -m state --state ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -i $EXTIF -p icmp -m state --state RELATED -j ACCEPT
##Port-Forwarding [inbound] (--> Also see chain PREROUTING)
##Port-Forwarding (--> Also see chain FORWARD)
# On aura pris soin de définir les variables, comme l'interface EXTIF externe, avec son ip publique EXTIP, ainsi que l'adresse inerne du serveur wouaibe HTTPIP
##HTTP
#$IPTABLES -A PREROUTING -t nat -i $EXTIF -p tcp -d $EXTIP --dport 80 -j DNAT --to $HTTPIP
Et mainenant, la ligne qui permet la magie du NAT, le partage de connexion
[^] # Re: Une soluce
Posté par Rafael (site web personnel) . En réponse au message iptables + naviguation sur internet + port 80. Évalué à 2.
M'enfin bon, il fallait bien le décortiquer un peu, ton script, en relevant ligne par ligne, parce que c'est comme ça qu'il faut faire la première fois.
Souvent, les valeureux débutants de l'iptables trafiquent les lignes de leur script comme autant d'incantations khabalistiques, autant de formules magiques leur apportant gloire et sécurité. Je me suis lancé sur le terrain du raseur constructif (j'aime bien cette définition, elle colle bien au BOFH proactif que je suis à mes heures).
Bref, lire les scripts des autres permet de découvrir pleins de fonctions d'iptables que l'on ne soupçonnerais pas. Une fois le concept touché du doigt, on pose la bonne idée sur une liste. Une fois les bonnes idées réunies, on les classe par groupe, pour ne rien oublier.
Ensuite, on pose à plat toutes les interfaces disponibles sur le firewall, à savoir l'interface externe, puis l'interface interne principale. Eventuellement, on pose une ou plusieurs interfaces internes, pour le cas où le firewall devrait gérer plusieurs zones.
Ensuite, on crée l'architecture de base de ses tables, ainsi que leur articulation.
Le shéma INPUT-OUTPUT, avec PREROUTING, FORWARD et POSTROUTING se trouve partout. (http://www.c-sait.net/cours/iptables.php)
On peut créer une table en plus, comme pour logguer les paquets DROPpés:
Et on y rajoute quoi faire avec les paquets en question, ici on loggue et on droppe, mais on peut faire d'autres choses. Ici on loggue les paquets TCP, au maximum 2 fois par seconde.
Il va de soi qu'on peut coller " -p udp" ou "-p icmp" en plus.
On vient de créer une tatable à nous, LDROP, vers laquelle on peut jumper quand on veut. on peut en faire pleins comme ça, pour faciliter la lecture du script. Chaque tatable fait bien un truc, que l'on peut appeller souvent.
Une bonne pratique cool, limiter l'acceptation de paquets d'ouverture de session
On peut créer une table pour faire des choses particulières, puis rendre la main, un peu comme un sous programme, ici pour virer le verbage des partages windows:
Pour résumer, on a fait LDROP, TCPACCEPT, LSYNFLOOD et SMB pour nos besoins.
Ensuite, on peut peut commencer la table INPUT de base
Ensuite, on peut commencer à rajouter les lignes de tables provenant de l'extérieur
On poursuit les autorisations de services tournant sur la linux box
FTP est vraiment un protocole qui a trop fumé, pour info, cf:
http://christian.caleca.free.fr/ftp/les_bases.htm
http://pintday.org/whitepapers/ftp-review.shtml
http://www-igm.univ-mlv.fr/~roussel/RESEAUJAVA/tcp.html
Et la réponse est OUI, c'est chiant à gérer sur un firewall si on ne veut pas avoir tout ouvert en grand. Rassurez vous, il y a pire, H323 par exemple.
On continue avec les services de base, ssh, mail, DNS, web serveur.
On permet aussi les connexions établies, ce qui permet de redémarrer le firewall sans couper toutes les sessions.
Là on a finit avec la table INPUT, on poursuit avec la table OUTPUT
Pour finir, on interdit le reste qui ne soit pas explicitement autorisé
Enfin, on s'occupe de la table de forward
Et mainenant, la ligne qui permet la magie du NAT, le partage de connexion
Voilà, si vous avez suivi jusqu'ici, vous pouvez adapter http://www.linuxguruz.com/iptables/scripts/rc.firewall_023.t(...) à vos besoins. L'architecture en est simple et élégante.
Rafael