Digression Installation parefeu (iptables & ip6tables) "pour les nuls"

Le minimum c’est ça :

iptables -t filter -P INPUT DROP iptables -t filter -P FORWARD DROP iptables -t filter -P OUTPUT ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Pour ce qui est de mes rêgles je n’ai rien inventé j’ai pris ça d’un howto. D’après celui-ci ces deux rêgles suplémentaires bloquerait le scan de port furtif.

[quote=“MisterFreez”]Le minimum c’est ça :

iptables -t filter -P INPUT DROP iptables -t filter -P FORWARD DROP iptables -t filter -P OUTPUT ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

Pour ce qui est de mes rêgles je n’ai rien inventé j’ai pris ça d’un howto. D’après celui-ci ces deux rêgles suplémentaires bloquerait le scan de port furtif.[/quote]
Vs avez raison ts les deux pour le minimum mais pour ton scan de port, si ta règle générale interdit tte entrée, je ne vois pas pourquoi une règle secondaire spécifique ferait mieux.
pour la règle reject, OK mais pas pour drop, il me semble.

Pour ceux qui utilisent la TV sur leur ordi via Free, il peut être indispensable d’ajouter la règle suivante :

Vs aurez compris qu’il faut remplacer “xx.yyy.zz.www” par votre IP
Merci à Kna de m’avoir indiqué cette règle.

Reste plus qu’a connaitre son adresse IP.

Cette commande permet de le savoir :

Je ne sais pas s’il y a plus simple… :unamused:

et en couplant le tout, ça doit donner un truc du genre:

/sbin/ifconfig | perl -anE 'if (/adr:/) {$F[1]=~ s/adr://g ; say grep {!/^127/} $F[1]}' | xargs iptables -A INPUT -s mafreebox.freebox.fr -p udp -m state --state ! INVALID -j ACCEPT -d(pas testé)

[quote=“MisterFreez”]Reste plus qu’a connaitre son adresse IP.

Cette commande permet de le savoir :

Je ne sais pas s’il y a plus simple… :unamused:[/quote]
sur le web, il y a plusieurs sites qui te la donne, en voilà un :
whatsmyip.org/

Pour celles et ceux qui se posent des questions sur les chaînes input, output, forward, j’avais créé il y a quelques temps les pages suivantes, que je viens d’actualiser :
Fonctionnement du parefeu sous Linux
Configuration globale du parefeu

C’est plutôt une introduction, c’est très schématique.

Une critique sur le script de Ricardo, au lieu de du mot clé “clean”, je mettrais plutôt “passthrough”, ensuite tu pourrais rajouter un mode “panic” qui ne laisse qu’un accès très restreint :wink:

Perso, je suis plus orienté script et fonctions avec chargement d’addons… mes derniers scripts donnaient un truc du genre :

#! /bin/sh

LOOPBACK_INTERFACE="lo"   
LOOPBACK_NETWORK="127.0.0.0/8" 
IPTABLES="/usr/sbin/$IPTABLES"
FW_CONF="/etc/firewall/firewall.conf"

PWD=`pwd`

cd /etc/firewall

. /etc/firewall/fw-functions # ma bibliotheque de fonctions

/etc/firewall/clean.sh # je supprime toutes les chaines et règles existantes
/etc/firewall/chains.sh # je crée mes chaines personnelles

# définition de la police par défaut, tout est en drop
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT

#partage de la connexion Internet car ma machine est une passerelle
$IPTABLES -t nat -A POSTROUTING -s $INTERNAL_NETWORK -o $EXTERNAL_INTERFACE -j S
NAT  --to $EXTERNAL_IP
echo 1 >/proc/sys/net/ipv4/ip_forward

$IPTABLES -A INPUT -i $INTERNAL_INTERFACE -s $INTERNAL_NETWORK -j ACCEPT
$IPTABLES -A OUTPUT -o $INTERNAL_INTERFACE -d $INTERNAL_NETWORK -j ACCEPT

# tout ce qui vient sur les chaines INPUT ou OUTPUT pour les protos TCP ou UDP
# je l'envoie sur les chaines LnD (D pour Drop) ou LnR (R pour Reject)
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p TCP -s $ANYWHERE -j LnD
$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p TCP -s $ANYWHERE -j LnR
$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p UDP -s $ANYWHERE -j LnD
$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p UDP -s $ANYWHERE -j LnR

$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -p ICMP -s $ANYWHERE -j ACCEPT
$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -p ICMP -s $ANYWHERE -j ACCEPT

# et je charge des "addons"
addons/dns.sh
addons/http_client.sh
addons/news.sh
addons/mail.sh
addons/mail_server.sh
addons/ntp.sh
addons/free_services.sh
addons/peertv.sh

echo "[ Termine ]"

cd $PWD

Et les addons ressemblent à :

#! /bin/sh

. /etc/firewall/fw-functions

protection off

echo addon dns

client_rule add UDP 53

protection on

Toute la complexité vient de la définition des variables dans le fichier “firewall.conf” et des addons…

En gros, je suis pour l’exploitabilité du pare-feu… plus on développe de services sur son réseau, plus ça peut devenir compliqué à gérer des règles “iptables”…

Je ferais deux remarques :
[ol]
[li]ce tuto est un “pour les nuls” d’où la non gestion de serveur sur la machine ;[/li]
[li]quitte à être modulaire tu pourrais avoir une interface pour les utiliser facilement par exemple gérer la liste des addons à la volée (sans avoir à remodifier ton script à chaque fois).
Tu gère un argument “-v” pour la liste des addons, "-a " pour activer l’addon et "-d " pour retirer l’addon (d’ailleurs tu na rien pour désactiver un addon).[/li][/ol]

Tout à fait, le but est la “simplification” pour la création de nouvelle règle pour le pare-feu (le côté “pour les nuls”). Ensuite pour la gestion, en effet il faut développer le script. Pour être tout à fait complet, dans le répertoire /etc/firewall, j’ai d’autres scripts dont un panic.sh par exemple. Ensuite, j’ai un /etc/init.d/firewall avec les variables start | stop, etc qui font appel à ces scripts.

Les fonctions qui sont déclarées dans le fichier “/etc/firewall/fw-functions” gèrent les paramètres “-a” et “-d” car j’avais prévu l’ajout et le retrait des addons (d’où le “client add” dans l’addon)… mais bon… j’ai fini par partir sur un autre projet.

Pour ma part, c’est plus simple à administrer qu’un fichier de 32k remplit de règles IPTables…

La fonction client_rule :

client_rule() {
        command=$1
        protocole=$2
        port=$3

        DO="-A"
        if [ "$command" = "del" ]
        then
           DO="-D"
        fi

        $IPTABLES $DO OUTPUT -o $EXTERNAL_INTERFACE -p $protocole \
          --sport $UNPRIVPORTS --dport $port -s $EXTERNAL_IP -d $ANYWHERE -j ACCEPT

        $IPTABLES $DO INPUT -i $EXTERNAL_INTERFACE -p $protocole -m state --state ESTABLISHED,RELATED \
          --sport $port --dport $UNPRIVPORTS -s $ANYWHERE -d $EXTERNAL_IP -j ACCEPT
}

Mais il t’a déjà été répondu que ce tuto ne se veut pas complet mais minimal et simplissime.
On sait très bien qu’il y a des lacunes et qu’il peut être complété mais ce n,'est pas le but ici.
C’est un tuto pour un débutant qui veut quand même avoir un minimum de protection sans trop se creuser la tête.
Ensuite, quand ledit débutant devient plus “pointu”, il s’adresse à toi, OK ? :smt003

Je crois qu’il y a un malentendu :slight_smile:

Si j’apporte une critique, j’espère qu’elle est simplement constructive et elle est purement sur la forme. Je ne suis pas un ‘pro’ de iptables, c’est pour cela que j’ai préféré créer des scripts qui créent les règles automatiquement.

Donc je répète, j’ai critiqué la forme.

Maintenant sur le fond, il aurait été peut être plus judicieux de nommer le post “comprendre IPTables pour les nuls” et à ce moment là, je ne me serais pas permis de dire qu’il y avait peut être moyen de rendre les choses plus ‘transparentes’.

En aucun cas je ne me pose en “sauveur du monde” et on a tous à apprendre et à améliorer notre compréhension. J’ai peut être été hors sujet et si vous avez mal pris mon intervention alors je vous prie de m’excuser.

Aucunement vexé, je te l’assure et ton intervention est louable.
Je ne fais que trouver un supplément de complication qui risque de rebuter le débutant.
La discussion est ouverte dans ce fil et tes messages y ont leur place.

En fait en lisant tout ça je me suis dit qu’il était facile de faire un script simple pour faire un parefeu pour monsieur tout le monde. Ci dessous est le premier jet. J’ai pensé à la situation de M. tout le monde avec une box. J’ai essayé de penser au plus courant dont notamment

  • le freeplayer
  • les requêtes DHCP vers le routeur à l’autre bout de la box (si on fait dans la parano)
    Il y a la doc pour chaque fonction (c’est ça qui a été long à faire, c’est juste avant les directives après les fonctions) ainsi qu’un exemple
    complet à la fin. Le résultat est donné en citation après le code. Ça marche chez moi sans pbm pour une configuration plus compliquée mais il y a peut être des erreurs. Les personnes intéressées peuvent voir à la fin de ce post le jeu de règles obtenues à partir des directives données (en fin du code) que je reproduis ici.
    Rq:
  • On ne peut pas tout faire avec les fonctions indiquées mais ça suffit pour un système qui me parait raisonnable
  • Je n’ai pas approfondi une version parano avec la chaines OUTPUT en DROP par défaut, a priori tout est prévu pour avec les fonctions outputok and Co, elles fonctionnent mais bon, c’est sommaire. Cela étant pour une version perso, avec la possibilité de bloquer des ports en sortie, ça suffit dans la version standard.
  • c’est plus une extension de la version de Ricardo avec des fonctions ad hoc qui permettent de faire facilement quelques opérations courantes qu’une nième version de parefeu.

[code]# pas de parano, OUTPUT et FORWARD en ACCEPT
initialisation OUTPUT FORWARD
passerelle

on autorise les accès aux serveurs pop3, pop3ssl, ftp, smtp web et ssh.

inputok tcp pop3s pop3 ftp smtp www ssh https

permet de renouveller le bail si on possède une box qui se configure en DHCP

inputok udp bootpc bootps ntp domain

limiter les accès à ssh, ftp et pop3

limiteport ssh 5 90
limiteport ftp 10 90
limiteport pop3 5 90

Tant pis pour HADOPI, un petit coup de Edonkey sur la machine 192.168.1.2

redirige tcp 4662 2
redirige udp 4672 2
redirige udp 4665 2

on veut jouer à Starcraft sur cette machine 192.168.1.2

redirige 6112 tcp 2
redirige 6112 udp 2
redirige 4000 tcp 2
redirige 4000 udp 2

et à CS

redirigeserveur 27016 udp 2

je veux regarder la tele sur mon ordinateur en profitant de freeplayer

freeplayer (freeplayer.freebox.fr=212.27.38.253)

mais je ne connais pas les ports. Tant pis on fait confiance:

potes 212.27.38.253
fromto 212.27.38.253 tcp 2
fromto 212.27.38.253 udp 2

maintenant soyons sérieux, le serveur Web est sur 192.168.1.3

redirigeserveur www tcp 3

enfin il y a des gens qui sont sous Windows, eux je ne veux pas qu’ils

accèdent au port SMTP. Seul moi (192.168.1.2) je peux et aussi ma

femme qui peut accéder à son compte sur laposte.net (elle a 192.168.1.3)

sortie tcp smtp 2 3 d 193.251.214.114[/code]

[code]#!/bin/sh

FBoisson Mars 2009

interfaces extérieure et Lan

IF_EXT=eth1
IF_LAN=eth0

réseau local et IP public

LAN=192.168.1
IP=82.66.248.156
MOI=1
IP_LAN=$LAN.$MOI

IPTABLES=“iptables”

restrictif

RESTRICT="-m state --state NEW,ESTABLISHED,RELATED "

#############################################################

Utilitaires

#############################################################
#############################################################

obtient le port

port () {
unset PRT
PRT=grep -E "^$1[^a-zA-Z]" /etc/services | sed -e '1,$s|^.*[\t| ]\([0-9]*\)/.*$|\1|' | head -n 1
if [ ! -z $PRT ] ; then
RES=$PRT
else
RES=$1
fi
}

#############################################################

Redirection

#############################################################
#############################################################

service local sur port $1 protocole $2 redirigé sur $LAN.$3:$4 ou $LAN.$3:$1 sinon

redirigeserveur () {
port $1
PORT=$RES
if [ -z $4 ] ; then
PDEST=$PORT
else
port $4
PDEST=$RES
fi
$IPTABLES -t nat -A PREROUTING $RESTRICT -p $2 --dport $PORT -j DNAT -i $IF_LAN -d $IP --to $LAN.$3:$PDEST
$IPTABLES -t nat -A PREROUTING $RESTRICT -p $2 --dport $PORT -j DNAT -i $IF_EXT --to $LAN.$3:$PDEST
$IPTABLES -t nat -A POSTROUTING -o $IF_LAN -p $2 --dport $PORT -s $LAN.0/24 -j MASQUERADE
}

#############################################################

redirection simple du port $1 protocole $2 redirigé sur $LAN.$3:$4 ou $LAN.$3:$1 sinon

en se limitant au paquet venant de $5 si $5 existe

redirige port protocole ou port origine

redirige () {
port $1
PORT=$RES
if [ -z $4 ] ; then
PDEST=$PORT
else
port $4
PDEST=$RES
fi
unset ORIGINE
if [ ! -z $5 ] ; then
ORIGINE="-s $5"
fi
$IPTABLES -t nat -A PREROUTING $RESTRICT -p $2 --dport $PORT -j DNAT -i $IF_EXT $ORIGINE --to $LAN.$3:$PDEST
}
#############################################################

redirection de tout ce qui vient de $1 protocole $2 redirigé sur $LAN.$3

fromto ou protocole vers

fromto () {
$IPTABLES -t nat -A PREROUTING -p $2 -i $IF_EXT -s $1 -j DNAT --to $LAN.$3
}

#############################################################

Gestion des entrées

#############################################################
#############################################################

limite les connexions tcp sur le port $1 pour $2 connexions par $3 secondes

limiteport () {
port $1
PORT=$RES
$IPTABLES -I INPUT -i $IF_EXT -p tcp --dport $PORT -m state --state NEW -m recent --set
$IPTABLES -I INPUT -i $IF_EXT -p tcp --dport $PORT -m state --state NEW -m recent --update --seconds $3 --hitcount $2 -j DROP
}

#############################################################

interdit le port $1 protocole $2 à tous excepté la liste $3 $4 etc

interdit () {
PROT=$2
port $1
PORT=$RES
shift
shift
for m in $* ; do
$IPTABLES -A INPUT -p $PROT $RESTRICT --dport $PORT -i $IF_EXT -s $m -j ACCEPT
done
$IPTABLES -A INPUT -p $PROT --dport $PORT -i $IF_EXT -j DROP
}

#############################################################

autorise le port $1 protocole $2 à tous excepté la liste $3 $4 etc

accepte () {
PROT=$2
port $1
PORT=$RES
shift
shift
for m in $* ; do
$IPTABLES -A INPUT -p $PROT --dport $PORT -i $IF_EXT -s $m -j DROP
done
$IPTABLES -A INPUT -p $PROT $RESTRICT --dport $PORT -i $IF_EXT -j ACCEPT
}
#############################################################

Entrée OK en protocole $1 pour les ports suivants éventuellement limité

à une source donnée si suivi par s

exemple: inputok tcp smtp ssh telnet s 12.34.55.66 s 12.44.233.22 www

inputok () {
PROT=$1
shift
while [ ! -z $1 ] ; do
port $1
PORT=$RES
shift
if [ ! -z $1 ] && [ $1 = “s” ] ; then
while [ ! -z $1 ] && [ $1 = “s” ] ; do
shift
DEST="-s $1"
shift
$IPTABLES -A INPUT $RESTRICT -p $PROT $DEST --dport $PORT -j ACCEPT
done
else
$IPTABLES -A INPUT $RESTRICT -p $PROT --dport $PORT -j ACCEPT
fi
done
}
#############################################################

Liste de machines de confiance, tout ce qui vient de ces machines

est acceptée

potes () {
while [ ! -z $1 ] ; do
$IPTABLES -A INPUT $RESTRICT -s $1 -j ACCEPT
shift
done
}
#############################################################

Gestion des sorties

#############################################################
#############################################################

SortieOK en protocole $1 pour les ports suivants éventuellement limité

à une destination donnée si suivi par d

exemple: outputok tcp smtp ssh telnet d 12.34.55.66 d 12.44.233.22 www

si forward est donné en premier argument, cela porte sur la chaine FORWARD

sinon sur la chaine OUTPUT

exemple: outputok forward tcp smtp ssh telnet d 12.34.55.66 d 12.44.233.22 www

outputok () {
unset $TABLE
if [ $1 = “forward” ] ; then
TABLE=FORWARD
shift
else
TABLE=OUTPUT
fi
PROT=$1
shift
while [ ! -z $1 ] ; do
port $1
PORT=$RES
shift
if [ ! -z $1 ] && [ $1 = “d” ] ; then
while [ ! -z $1 ] && [ $1 = “d” ] ; do
shift
DEST="-d $1"
shift

	$IPTABLES -A $TABLE $RESTRICT -p $PROT $DEST --dport $PORT -j ACCEPT
    done
else
    $IPTABLES -A $TABLE $RESTRICT -p $PROT --dport $PORT -j ACCEPT
fi
done

}
#############################################################

Liste de machines de confiance, tout ce qui vient de ces machines

est acceptée, et tout ce qui est à destination de ces machines est accepté

machinesures () {
while [ ! -z $1 ] ; do
$IPTABLES -A FORWARD $RESTRICT -s $1 -j ACCEPT
shift
done
}
destinationsures () {
while [ ! -z $1 ] ; do
$IPTABLES -A OUTPUT $RESTRICT -d $1 -j ACCEPT
shift
done
}
#############################################################

Interdiction de sortie pour des machines données exceptés

des ports précis, attention la syntaxe est un peu différente

sortielimite 240 tcp www 443 110 d 195.154.98.97 25 8080 udp 53

limite la machine au port 80, 443 et 110 en tcp, 53 en udp

et 25 et8080 en tcp vers 195.154.98.97

sortielimite () {
MACHINE=$LAN.$1
DEST="“
shift
PROT=$1
shift
PROT=tcp
while [ ! -z $1 ] ; do
if [ $1 = “tcp” ] || [ $1 = “udp” ] ; then
PROT=$1
DEST=”“
shift
elif [ $1 = “d” ] ; then
shift
DEST=”-d $1"
shift
else
port $1
PORT=$RES
shift
$IPTABLES -A FORWARD -s $MACHINE $DEST -p $PROT --dport $PORT -j ACCEPT
fi
done
$IPTABLES -A FORWARD -s $MACHINE -m state --state RELATED,ESTABLISHED -j ACCEPT
$IPTABLES -A FORWARD -s $MACHINE -j DROP
}
#############################################################

Gestion de passerelle

#############################################################
#############################################################

passerelle

passerelle () {
$IPTABLES -t nat -A POSTROUTING -o $IF_EXT -j MASQUERADE
}
#############################################################

sortie vers port $1 interdit sauf pour les indications après de la forme

fin_IP_source [d IP destination]

exemple: sortie tcp smtp 251 240 d 12.45.245.23 252

OK pour $IP_LAN.251 et 252 et OK pour $LAN.240 -> 12.45.245.23

sortie () {
PROT=$1
shift
port $1
PORT=$RES
shift
while [ ! -z $1 ] ; do
SOURCE=$LAN.$1
shift
if [ ! -z $1 ] && [ $1 = “d” ] ; then
shift
DEST="-d $1"
shift
else
unset DEST
fi
$IPTABLES -t nat -A PREROUTING $RESTRICT -p $PROT -s $SOURCE $DEST -i $IF_LAN --dport $PORT -j ACCEPT
done
$IPTABLES -t nat -A PREROUTING -p $PROT --dport $PORT -i $IF_LAN -d $IP_LAN -j ACCEPT
$IPTABLES -t nat -A PREROUTING -p $PROT --dport $PORT -i $IF_LAN -d $IP -j ACCEPT
$IPTABLES -t nat -A PREROUTING -p $PROT --dport $PORT -i $IF_LAN -j DROP
}

#############################################################

Initialisation

#############################################################
#############################################################

initialisation restrictive par défaut mais cool sur les chaines données en argument

initialisation OUTPUT FORWARD

met ACCEPT sur OUTPUT et FORWARD

initialisation () {

raz

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "16384" > /proc/sys/net/ipv4/ip_conntrack_max    OUTPUT=DROP
INPUT=DROP
FORWARD=DROP
while [ ! -z $1 ] ; do
if [ $1 = OUTPUT ] ; then
    OUTPUT=ACCEPT
fi
if [ $1 = INTPUT ] ; then
    INTPUT=ACCEPT
fi
if [ $1 = FORWARD ] ; then
    FORWARD=ACCEPT
fi
shift
done
$IPTABLES -F INPUT
$IPTABLES -F OUTPUT
$IPTABLES -F FORWARD
$IPTABLES -F INPUT
$IPTABLES -t nat -F
$IPTABLES -P INPUT $INPUT
$IPTABLES -P OUTPUT $OUTPUT
$IPTABLES -P FORWARD $FORWARD

if [ $INPUT = DROP ] ; then

sur le LAN c’est des potes

$IPTABLES -A INPUT -i $IF_LAN -j ACCEPT

les connexions liées ou ouvertes c’est OK.

$IPTABLES -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

loopback: don’t be schizo

$IPTABLES -A INPUT -i lo -j ACCEPT

icmp: pas de parano tout de même sinon on ne fait rien

$IPTABLES -A INPUT -p icmp -j ACCEPT
fi
if [ $OUTPUT = DROP ] ; then

sur le LAN c’est des potes

$IPTABLES -A OUTPUT -o $IF_LAN -j ACCEPT

les connexions liées ou ouvertes c’est OK.

$IPTABLES -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

loopback: don’t be schizo

$IPTABLES -A OUTPUT -o lo -j ACCEPT

icmp: pas de parano tout de même sinon on ne fait rien

$IPTABLES -A OUTPUT -p icmp -j ACCEPT
fi
if [ $FORWARD = DROP ] ; then

les connexions liées ou ouvertes c’est OK.

$IPTABLES -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

icmp: pas de parano tout de même sinon on ne fait rien

$IPTABLES -A FORWARD -p icmp -j ACCEPT
fi

}

#############################################################

Règles

#############################################################

Le parefeu se suppose en fait deux interfaces à régler dans le début du script

IF_EXT est l’interface vers l’extérieur (Internet), IF_LAN est celle

vers le LAN

LAN est le prefix du réseau (supposé /24, tout ça est a améliorer).

Le parefeu se fait par appel à plusieurs routines

* initialisation initialise le parefeu, les arguments sont INPUT OUTPUT FORWARD

ordre indifférent, qui sont les chaines où la politique par défaut est

ACCEPT. Si on veut tout paramétrer, on met

initialisation

L’utlisateur normal met

initialisation OUTPUT FORWARD

#############################################################

* passerelle est une fonction sans argument qui indique que la machine

est une passerelle

Suivent des fonctions gérant les entrées, les redirections et les sorties.

Les ports peuvent être indiqués par leur nom (ssh) ou leur numéro (23).

protocole définit le protocle (tcp ou udp essentiellement)

Pour gérer les entrées on a comme fonctions

#############################################################

* inputok qui prend comme argument

- le protocole

- une suite de ports qui seront autorisés en entrée avec éventuellement

une source imposée. Ainsi

inputok tcp pop3 smtp domain telnet s 122.23.23.1 s 144.22.3.0/24 www https

ouvre les ports pop3, smtp, www et https pour tous et le port telnet

pour la machine 122.23.23.1 et le réseau 144.22.3.0/24

#############################################################

* accepte qui prend comme argument

- le protocole

- un numéro de port

- une liste de machine ou de réseau

ouvre le port à tous excepté les machines indiquées dans la liste.

accepte tcp www 66.249.93.104

accepte tout le monde sur le port www excepté 66.249.93.104

#############################################################

* interdit qui prend comme argument

- le protocole

- un numéro de port

- une liste de machine ou de réseau

interdit le port à tous excepté les machines indiquées dans la liste.

interdit tcp ssh 66.249.93.104 82.66.248.0/24

accepte tout le monde sur le port ssh excepté 66.249.93.104 et

le réseau 82.66.248.0/24

#############################################################

* potes prenant comme arguments une liste de machines/réseau définit

les machines de confiance. Tout est accepté venant d’eux.

potes 82.66.248.156

me permet d’aller sur tous les ports chez vous.

#############################################################

* limiteport prenant comme argument

- un numéro de port

- un décompte

- un temps en secondes

bloque toute machine ayant effectuée trop de connexions durant le temps donné

sur le port indiqué.

limiteport ssh 3 90

bloque toute personne ayant fait plus de 3 connexions ssh en 90s, cela pendant

90 secondes.

#############################################################

* redirigeserveur

permet de rediriger les connexions vers un serveur, cela est vrai pour

l’extérieur comme pour le LAN. En clair

redirigeserveur www tcp 251 81

redirige les connexions venant de l’internet sur 192.168.1.251:81 (en

admettant que LAN=192.168.1) et également celle venant du LAN (ce qui est

important et nécessite du MASQUERADING).

#############################################################

* redirige prenant comme argument

- un numéro de port

- un protocole

- le numéro définissant une machine dans le LAN (23 pour 192.168.1.23)

- un numéro de port (optionnel)

redirige le port donné en premier argument sur la machine donnée en 3ième

argument (port identique ou défini par le 4ième argument)

Si un 5ième argument est donné, cela limite la règle uniquement à la

machine donné en argument.

redirige 2222 tcp 123 22 82.66.248.156

permet à la machine 82.66.248.156 et elle seulement (merci :)) d’aller sur le

port ssh de 192.168.1.123 (si LAN=192.168.1)

#############################################################

* fromto est une redirection basique

Il redirige le port donné en premier argument (protocole donné en 2ième

argument) sur la machine définie par le 3ième argument (éventuellement

port donné en 4ième argument). Pour jouer à Starcraft, sur la machine

192.168.1.234, ce serait

fromto 6112 tcp 234

fromto 6112 udp 234

fromto 4000 tcp 234

fromto 4000 udp 234

(je ne sais plus si c’est UDP ou TCP à rediriger, je met les 2)

#############################################################

* outputok gère les sorties ou si forward est donné en premier argument,

le forwarding (on ne comptera cet éventuel premier argument dans

ce qui suit). L’argument suivant est le protocle (tcp ou udp) puis

suivent une liste de ports avec éventuellement une destination imposée.

outputok forward tcp telnet ssh smtp d 12.34.55.66 d 12.44.233.22 www

autorise le relais tcp vers les ports telnet, ssh, smtp uniquement vers

12.34.55.66 et 12.44.233.22 et vers le port www.

#############################################################

* machinesures définit une liste de machines sûres autorisées à tout faire

échappant aux restrictions ci dessus (pour le relais). destinationsures

désigne les machines sur pour la sortie.

#############################################################

* sortie port protocole liste de machines

interdit les accès vers l’extérieur pour les machines venant du LAN excepté

pour les machines indiquées avec éventuellement des destinations limitées.

sortie smtp tcp 251 249 d 195.154.98.97 249 d 212.27.48.4

interdit le port 25 sauf à la machine 192.168.1.251 et, pour les destinations

195.154.98.97 et 212.27.48.4 à la machine 192.168.1.249 (remarquez que 249

a été répété).

un parefeu typique serait

initialisation OUTPUT FORWARD
passerelle

on autorise les accès aux serveurs pop3, pop3ssl, ftp, smtp web et ssh.

inputok tcp pop3s pop3 ftp smtp www ssh https

permet de renouveller le bail si on possède une box qui se configure en DHCP

inputok udp bootpc bootps ntp domain

limiter les accès à ssh, ftp et pop3

limiteport ssh 5 90
limiteport ftp 10 90
limiteport pop3 5 90

Tant pis pour HADOPI, un petit coup de Edonkey sur la machine 192.168.1.2

redirige tcp 4662 2
redirige udp 4672 2
redirige udp 4665 2

on veut jouer à Starcraft sur cette machine 192.168.1.2

redirige 6112 tcp 2
redirige 6112 udp 2
redirige 4000 tcp 2
redirige 4000 udp 2

et à CS

redirigeserveur 27016 udp 2

je veux regarder la tele sur mon ordinateur en profitant de freeplayer

freeplayer (freeplayer.freebox.fr=212.27.38.253)

mais je ne connais pas les ports. Tant pis on fait confiance:

potes 212.27.38.253
fromto 212.27.38.253 tcp 2
fromto 212.27.38.253 udp 2

maintenant soyons sérieux, le serveur Web est sur 192.168.1.3

redirigeserveur www tcp 3

enfin il y a des gens qui sont sous Windows, eux je ne veux pas qu’ils

accèdent au port SMTP. Seul moi (192.168.1.2) je peux et aussi ma

femme qui peut accéder à son compte sur laposte.net (elle a 192.168.1.3)

sortie tcp smtp 2 3 d 193.251.214.114
[/code]

Les règles obtenues:

[quote]iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -F INPUT
iptables -t nat -F
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 995 -j ACCEPT
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p udp --dport 68 -j ACCEPT
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p udp --dport 67 -j ACCEPT
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p udp --dport 123 -j ACCEPT
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -p udp --dport 53 -j ACCEPT
iptables -I INPUT -i eth1 -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -I INPUT -i eth1 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 90 --hitcount 5 -j DROP
iptables -I INPUT -i eth1 -p tcp --dport 21 -m state --state NEW -m recent --set
iptables -I INPUT -i eth1 -p tcp --dport 21 -m state --state NEW -m recent --update --seconds 90 --hitcount 10 -j DROP
iptables -I INPUT -i eth1 -p tcp --dport 110 -m state --state NEW -m recent --set
iptables -I INPUT -i eth1 -p tcp --dport 110 -m state --state NEW -m recent --update --seconds 90 --hitcount 5 -j DROP
iptables -t nat -A PREROUTING -m state --state NEW,ESTABLISHED,RELATED -p 4662 --dport tcp -j DNAT -i eth1 --to 192.168.1.2:tcp
iptables -t nat -A PREROUTING -m state --state NEW,ESTABLISHED,RELATED -p 4672 --dport udp -j DNAT -i eth1 --to 192.168.1.2:udp
iptables -t nat -A PREROUTING -m state --state NEW,ESTABLISHED,RELATED -p 4665 --dport udp -j DNAT -i eth1 --to 192.168.1.2:udp
iptables -t nat -A PREROUTING -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 6112 -j DNAT -i eth1 --to 192.168.1.2:6112
iptables -t nat -A PREROUTING -m state --state NEW,ESTABLISHED,RELATED -p udp --dport 6112 -j DNAT -i eth1 --to 192.168.1.2:6112
iptables -t nat -A PREROUTING -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 4000 -j DNAT -i eth1 --to 192.168.1.2:4000
iptables -t nat -A PREROUTING -m state --state NEW,ESTABLISHED,RELATED -p udp --dport 4000 -j DNAT -i eth1 --to 192.168.1.2:4000
iptables -t nat -A PREROUTING -m state --state NEW,ESTABLISHED,RELATED -p udp --dport 27016 -j DNAT -i eth0 -d 82.66.248.156 --to 192.168.1.2:27016
iptables -t nat -A PREROUTING -m state --state NEW,ESTABLISHED,RELATED -p udp --dport 27016 -j DNAT -i eth1 --to 192.168.1.2:27016
iptables -t nat -A POSTROUTING -o eth0 -p udp --dport 27016 -s 192.168.1.0/24 -j MASQUERADE
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -s 212.27.38.253 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -i eth1 -s 212.27.38.253 -j DNAT --to 192.168.1.2
iptables -t nat -A PREROUTING -p udp -i eth1 -s 212.27.38.253 -j DNAT --to 192.168.1.2
iptables -t nat -A PREROUTING -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 80 -j DNAT -i eth0 -d 82.66.248.156 --to 192.168.1.3:80
iptables -t nat -A PREROUTING -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 80 -j DNAT -i eth1 --to 192.168.1.3:80
iptables -t nat -A POSTROUTING -o eth0 -p tcp --dport 80 -s 192.168.1.0/24 -j MASQUERADE
iptables -t nat -A PREROUTING -m state --state NEW,ESTABLISHED,RELATED -p tcp -s 192.168.1.2 -i eth0 --dport 25 -j ACCEPT
iptables -t nat -A PREROUTING -m state --state NEW,ESTABLISHED,RELATED -p tcp -s 192.168.1.3 -d 193.251.214.114 -i eth0 --dport 25 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 25 -d 192.168.1.1 -i eth0 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 25 -d 82.66.248.156 -i eth0 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 25 -i eth0 -j DROP
[/quote]

faut que je réflesse un peu :slightly_smiling:
ouais donc en fait ce que je voulais dire… c’est qu’il vaut mieux éviter de mettre comme politique par défaut “ACCEPT” dans la chaîne FORWARD, c’est mal.

du coup tes règles en input ne sont pas utiles (tu devrais le voir avec un iptables -nvL, les compteurs devraient être à 0).
Schéma NetFilter

Tu fais du DNAT, dans le noeud de PREROUTING :

iptables -t nat -A PREROUTING -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 80 -j DNAT -i eth0 -d 82.66.248.156 --to 192.168.1.3:80

De fait, l’adresse 82.66.248.156 est changée en 192.168.1.3 avant de passer dans la chaîne “INPUT” (regardes bien le schéma). Ensuite, eh bien le noyau applique le processus de routage et envoie dans le noeud “FORWARD” car cela ne va pas à destination de ses processus locaux. Or tu ne filtres RIEN dans ta chaîne FORWARD !

iptables -P FORWARD ACCEPT

Même s’il semble que tu ne puisses passer dans la chaîne FORWARD que les nouvelles sessions, les établies, etc… :confused: Il y a d’autres règles qui me perturbent.

Disons simplement que sur le principe, c’est pas bien, car de plus tu autorises tout ton LAN à sortir par n’importe quel protocole, sans aucun filtrage, rien…

[quote=“Raum”] faut que je réflesse un peu :slightly_smiling:
ouais donc en fait ce que je voulais dire… c’est qu’il vaut mieux éviter de mettre comme politique par défaut “ACCEPT” dans la chaîne FORWARD, c’est mal.
[/quote]
Ça dépend le contexte, pourquoi diable quand il s’agit d’un LAN où chaque machine est de confiance (en gros ta maison…). Cf plus bas.

[quote]
du coup tes règles en input ne sont pas utiles (tu devrais le voir avec un iptables -nvL, les compteurs devraient être à 0).[/quote]
Ben non, ça marche bien, et ces règles sont utiles

Là tu n’as pas compris la règle, il s’agit d’une machine (mettons 192.168.1.25) du LAN qui interroge le serveur via son IP publique. La connexion va passer à la passerelle, si cela renvoit sur 192.168.1.3, ce dernier va répondre froidement à 192.168.1.25 qui verra donc revenir un paquet de 192.168.1.3 alors qu’il veut établir une connexion avec 82.66.248.156, la connexion ne se fera pas. Il est donc impératif de faire du masquerading afin 192.168.1.3 repasse par la passerelle et que 192.168.1.25 recoivent bien une réponse venant de la machine 82.66.248.156.

Pour le reste, vu que c’est une machine du LAN, ça n’est pas filtré, tout va bien.

[quote]
Même s’il semble que tu ne puisses passer dans la chaîne FORWARD que les nouvelles sessions, les établies, etc… :confused: Il y a d’autres règles qui me perturbent.

Disons simplement que sur le principe, c’est pas bien, car de plus tu autorises tout ton LAN à sortir par n’importe quel protocole, sans aucun filtrage, rien…[/quote]
Là encore il faut relire le titre du fil.
Sinon, il y a une fonction (sortielimite) que j’ai rajouté pour ceux qui ont FON chez eux derrière leur parefeu (mon cas).
Pour limiter un peu sans être draconien les ports, j’ai mis ceci comme règles:

# FON: tout de 1 à 1023 sauf SMTP, 1937 = port FONERA sortielimite 240 tcp 1:24 26:1023 \ 8080 aol svn openvpn cvspserver mysql vnetd msnp 6891 4000 1937 \ udp 1:1023 aol svn openvpn cvspserver mysql msnp 6891 6112 1812 1813 Attention à autoriser le port 1937 en TCP et les ports 1812,1813 en UDP sinon la fonera ne pourra pas se signaler et le point d’accès ne sera pas répertorié.

salut tout le monde,
je suis nouveau sur ce forum et je suis passé récemment de ubuntu à debian
je voudrais savoir si ce qui est dit page 1 (à savoir que le pare feu n’est pas configuré par défaut) est valable sur debian 5.0
merci d’avance

[quote=“Ashgenesis”]Je me suis amusé à faire un petit script qui initialise les règles iptables et qui utilise iptables-save

Le script est à lancer une seule fois et sous root :slightly_smiling:

[code]#!/bin/sh

Script de démarrage iptables by Ashgenesis

Utilisation

Mettre le script executable et le lancer

sous l’utilisateur root ou avec les droits

administrateur

Rajouter les règles spécifiques a votre

config le cas écheant

#########################

#cp ./firewall.sh /etc/init.d/firewall.sh
echo -e "#!/bin/sh

chargement/dechargement d’iptables

case “$1” in
’start’)
/sbin/iptables-restore < /etc/firewall.conf
RETVAL=$?
;;
‘stop’)
/sbin/iptables-save > /etc/firewall.conf
RETVAL=$?
;;
‘clean’)

clean le parefeu pendant que la machine tourne

ca peut être une faille de securite si on l’execute lors de l’extinction avant l’arret des interfaces

pensez à refaire un start apres sinon la sauvegarde se fera automatiquement à l’extinction

/sbin/iptables -t filter -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -t raw -F
/sbin/iptables -t filter -P INPUT ACCEPT
/sbin/iptables -t filter -P OUTPUT ACCEPT
/sbin/iptables -t filter -P FORWARD ACCEPT
/sbin/iptables -t nat -P PREROUTING ACCEPT
/sbin/iptables -t nat -P POSTROUTING ACCEPT
/sbin/iptables -t nat -P OUTPUT ACCEPT
/sbin/iptables -t mangle -P PREROUTING ACCEPT
/sbin/iptables -t mangle -P OUTPUT ACCEPT
/sbin/iptables -t mangle -P POSTROUTING ACCEPT
/sbin/iptables -t mangle -P FORWARD ACCEPT
/sbin/iptables -t mangle -P INPUT ACCEPT
/sbin/iptables -t raw -P OUTPUT ACCEPT
/sbin/iptables -t raw -P PREROUTING ACCEPT
RETVAL=$?
;;
‘restart’)
$0 stop && $0 start
RETVAL=$?
;;
‘status’)
/sbin/iptables-save
RETVAL=$?
;;
*)
echo "Usage: $0 { start | stop | restart | clean | status }“
RETVAL=1
;;
esac
exit $RETVAL
” > /etc/init.d/firewall.sh

#####################################

Initialisation

iptables -t filter -F
iptables -t nat -F
iptables -t mangle -F
iptables -t raw -F

Règles par défault

iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT ACCEPT

Autorisation de loopback (logique)

iptables -t filter -A INPUT -i lo -j ACCEPT

Autorisation des connections déjà établies

iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

#####################################

Rajouter ici les regles spécifiques à votre utilisation

#####################################

iptables-save > /etc/firewall.conf

chmod +x /etc/init.d/firewall.sh

update-rc.d firewall.sh defaults 19 21
[/code][/quote]
j’ai suivi le tuto et je suis un peu bloqué là
comment on lance ce script svp

[quote=“titi_le_boss”]salut tout le monde,
je suis nouveau sur ce forum et je suis passé récemment de ubuntu à debian
je voudrais savoir si ce qui est dit page 1 (à savoir que le pare feu n’est pas configuré par défaut) est valable sur debian 5.0
merci d’avance[/quote]
Valable pour etch, lenny, squeez et la Sid actuelle.
Ils sont entrain de changer tout ça dans le noyau mais ce ne seras pas en place avant deux ans je pense. Donc encore deux ans de validité.

erf ok…
dommage

[quote=“titi_le_boss”]erf ok…
dommage[/quote]
:question: :neutral_face: