Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Firewall IP sous Linux : Restreindre l'acces d'un poste

9 réponses
Avatar
Gillot
Bonjour a tous.

Voila, j'ai une passerelle linux qui partage un accés internet par modem
ADSL avec IPtables. Bien entendu, il y a des règles de filtrage.

Chaque poste du réseau local a une adresse IP fixe.

Je désire pouvoir interdire certains sites pour certains postes, mais
j'arrive pas à trouver la règle iptables adéquate (quelque chose
m'échappe).

Par exemple, je voudrais empècher l'accés à google (216.239.33.99) pour le
poste du réseau local qui a l'adresse 192.168.1.2.

Comment faire ???

Un peu plus pointu : n'autoriser l'accés que sur certains sites pour un
poste ????

Merci d'avance

A+ Gillot ;o)

9 réponses

Avatar
Cedric Blancher
Dans sa prose, Gillot nous ecrivait :
Je désire pouvoir interdire certains sites pour certains postes, mais
j'arrive pas à trouver la règle iptables adéquate (quelque chose
m'échappe).


Je pense que ce qui t'échappes, c'est surtout la lecture de la
documentation...

Par exemple, je voudrais empècher l'accés à google (216.239.33.99) pour
le poste du réseau local qui a l'adresse 192.168.1.2.
Comment faire ???


iptables -A FORWARD -s 192.168.1.2. -d 216.239.33.99 -j DROP

Un peu plus pointu : n'autoriser l'accés que sur certains sites pour un
poste ????


iptables -A FORWARD -s <leposte> -d <lesite> -j ACCEPT

Sauf qu'il faut bien comprendre que Netfilter ne fonctionne qu'avec des
IPs, pas avec des noms de machines. Un nom, ça peut avoir plusieurs IP, et
une IP peut avoir plusieurs noms... Tu ne voudrais pas plutôt mettre en
place du filtrage d'URL ? Auquel cas un proxy HTTP comme Squid avec des
ACLs serait plus conseillé.

--
FTI: Internet est un nouveau média. Il n'est pas encore aussi fiable,
que le téléphone ou la télévision. Si un problème est détecté, Wanadoo
cherche toujours, à le résoudre dans les plus brefs délais.
-+- Wanadoo in GNU -+- Le support sans faille du FAI sans support -+-

Avatar
Stephane P.
Cedric Blancher wrote:

Dans sa prose, Gillot nous ecrivait :
Je désire pouvoir interdire certains sites pour certains postes, mais
j'arrive pas à trouver la règle iptables adéquate (quelque chose
m'échappe).


Je pense que ce qui t'échappes, c'est surtout la lecture de la
documentation...

a oui ? et tu connais une documentation d'iptables qui soit CLAIRE et

COMPREHENSIBLE toi ??


Avatar
Laurent Seguin
"Stephane P." , le 06 août 2003
22:22:53, écrivait ceci:

Dans sa prose, Gillot nous ecrivait :
Je désire pouvoir interdire certains sites pour certains postes, mais
j'arrive pas à trouver la règle iptables adéquate (quelque chose
m'échappe).


Je pense que ce qui t'échappes, c'est surtout la lecture de la
documentation...

a oui ? et tu connais une documentation d'iptables qui soit CLAIRE et

COMPREHENSIBLE toi ??


Moi oui.
Pour commencer : <url:http://lea-linux.org/reseau/iptables.php3>
Pour continuer : <url:http://www.iglooduhack.com/linux_iptables.php>
Pour finir : <url:http://www.netfilter.org/unreliable-guides/fr/packet-
filtering-HOWTO.html>

Et quelques liens intéréssant à lire :
<url:http://olivieraj.free.fr/fr/linux/information/firewall/>
<url:http://iptables-tutorial.frozentux.net/iptables-tutorial.html>



Avatar
Bertrand
Salut,

Je désire pouvoir interdire certains sites pour certains postes, mais
j'arrive pas à trouver la règle iptables adéquate (quelque chose
m'échappe).


Ne serait-t-il pas preferable d'utiliser un proxy filtrant a la place du
firewall pour realiser ce filtrage ? Squid peut le faire je crois.

Parce que NetFilter pour maintenir une ACL donnant ou non l'accés a une
liste de sites pour une liste de postes donnés, c'est pas commode et pas
souple, meme si ca permet d'apprendre le maniement des outils de config de
NetFilter.

@+
Bertrand

Avatar
Gillot
On Wed, 06 Aug 2003 12:39:18 +0000, Cedric Blancher wrote:

Dans sa prose, Gillot nous ecrivait :
Je désire pouvoir interdire certains sites pour certains postes, mais
j'arrive pas à trouver la règle iptables adéquate (quelque chose
m'échappe).


Je pense que ce qui t'échappes, c'est surtout la lecture de la
documentation...


Ben tiens, bien sûr, suis-je bête !!! ;o)

Par exemple, je voudrais empècher l'accés à google (216.239.33.99) pour
le poste du réseau local qui a l'adresse 192.168.1.2.
Comment faire ???


iptables -A FORWARD -s 192.168.1.2. -d 216.239.33.99 -j DROP


Ben non, ça marche pô !!!! J'avais déjà essayé la même chose mais avec -j
REJECT : marche pô non plus !!!

Un peu plus pointu : n'autoriser l'accés que sur certains sites pour un
poste ????


iptables -A FORWARD -s <leposte> -d <lesite> -j ACCEPT


Certes, mais même si tes rêgles fonctionnaient, il faudrait quand même tout
interdire avant d'autoriser le site voulu !
(Par ex : iptables -A FORWARD -s <leposte> -d 0.0.0.0 -j DROP)

Mais même ça, ça marche pas.

Comme netfilter fonctionne en NAT, je pense qu'il faudrait agir à partir
de la table de NAT en mémoire, car a mon avis, le problème viens de
l'identification de la source.

Sauf qu'il faut bien comprendre que Netfilter ne fonctionne qu'avec des
IPs, pas avec des noms de machines. Un nom, ça peut avoir plusieurs IP, et
une IP peut avoir plusieurs noms... Tu ne voudrais pas plutôt mettre en
place du filtrage d'URL ? Auquel cas un proxy HTTP comme Squid avec des
ACLs serait plus conseillé.


Oui mais non, j'utilise un VPN qui passe par netfilter, et je vois pas
trop comment gérer ça avec un proxy (je connais pas trop les proxy, mais
je sais qu'il faut ensuite que les applications le gèrent et ça, ça va pas
nous convenir !)

Et les sites que je veux autoriser ont des IP fixes (c'est le cas pour la
majorité des sites, me semble-t-il, non ??)

--- TOUJOURS EN QUETE D'UNE SOLUTION.

A+ Gillot ;o)


Avatar
Gillot
On Thu, 07 Aug 2003 14:16:10 +0000, Cedric Blancher wrote:

Ah ouais ? C'est parce que tu dois avoir une règle qui accepte les
paquets _avant_ celle-ci (j'ai bêtement supposé que tu partais d'un jeu
de règles vierge). Parce que sur ma modeste installation, ça marche...
Si tu fais ça par exemple :

iptables -I FORWARD -s 192.168.1.2. -d 216.239.33.99 -j DROP

Ça donne quoi ?


Effectivement, la, ça fonctionne. Mais je voudrais bien comprendre,
parceque d'aprés ce que j'ai compris, il applique les règles dans l'ordre
listé, donc, si je pose cette rêgle à la fin, les paquets concernés ne
devraient-ils pas être rejetés même si précédemment, ils étaient acceptés
???

D'ailleurs, j'essaye de tout interdire pour le poste 192.168.1.2, puis
d'autoriser l'adresse IP que je veux, mais ça marche pas !!!
Comment faire ? dans quel ordre ?


A propos, puisqu'on est dans les explications, pourquoi préfères-tu
utiliser DROP plutôt que REJECT ? Question de sécurité ?


Tu peux nous poster ton ruleset pour pouvoir se faire une idée ?
La Voici :

-----------------------------------------------
#!/bin/bash

# GESTION FIREWALL IP par Iptables : "on" pour le mettre en place

# Annulation du firewall
echo Arrêt du firewall

/sbin/iptables -F INPUT
/sbin/iptables -F OUTPUT
/sbin/iptables -F FORWARD

# Je remet les rêgles par défaut
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT

# Polices par défault
/sbin/iptables -t nat -P PREROUTING ACCEPT
/sbin/iptables -t nat -P POSTROUTING ACCEPT
/sbin/iptables -t nat -P OUTPUT ACCEPT

# On vide les rêgles qui restent
/sbin/iptables -F
/sbin/iptables -t nat -F

/sbin/iptables -X
/sbin/iptables -t nat -X

# Insertion des modules de gestion réseau, tunneling etc...
/sbin/modprobe ip_tables
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_nat
/sbin/modprobe ip_gre
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_pptp

if [ "$1" == "on" ]; then

echo Mise en route du firewall

# Pas de spoofing
if [ -e "/proc/sys/net/ipv4/conf/*/rp_filter" ]; then
for filtre in "/proc/sys/net/ipv4/conf/*/rp_filter" ; do
echo 1 > $filtre
done

fi

# Pas de ICMP
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

echo On rajoute deux règles pour les logs
/sbin/iptables -N LOG_DROP
/sbin/iptables -A LOG_DROP -j LOG --log-prefix '[IPTABLES DROP] : '
/sbin/iptables -A LOG_DROP -j DROP
/sbin/iptables -N LOG_ACCEPT
/sbin/iptables -A LOG_ACCEPT -j LOG --log-prefix '[IPTABLES ACCEPT] : '
/sbin/iptables -A LOG_ACCEPT -j ACCEPT

# Pour un filtrage efficace, d'abord, on refuse tout, et ensuite on laisse
# passer que ce qu'on veut.

echo D abord, on interdit tout
# ======================== /sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP

echo On accepte tout sur le loopback de la machine locale
# ====================================================== /sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -A OUTPUT -o lo -j ACCEPT

echo On accepte ce qui se passe sur le réseau local
# ================================================ /sbin/iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
/sbin/iptables -A OUTPUT -d 192.168.1.0/24 -j ACCEPT
/sbin/iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT

echo On accepte les résolutions de nom
# =================================== /sbin/iptables -A INPUT -i ppp0 --protocol udp --source-port 53 -j ACCEPT
/sbin/iptables -A OUTPUT -o ppp0 --protocol udp --destination-port 53 -j ACCEPT
/sbin/iptables -A INPUT -i ppp0 --protocol tcp --source-port 53 -j ACCEPT
/sbin/iptables -A OUTPUT -o ppp0 --protocol tcp --destination-port 53 -j ACCEPT

echo On accepte le traffic Web
# =========================== /sbin/iptables -A INPUT -i ppp0 --protocol tcp --source-port 80 -m state --state ESTABLISHED -j LOG_ACCEPT
/sbin/iptables -A OUTPUT -o ppp0 --protocol tcp --destination-port 80 -m state --state NEW,ESTABLISHED -j LOG_ACCEPT

echo On accepte la réception d emails
# ================================== /sbin/iptables -A INPUT -i ppp0 --protocol tcp --source-port 110 -j LOG_ACCEPT
/sbin/iptables -A OUTPUT -o ppp0 --protocol tcp --destination-port 110 -j LOG_ACCEPT

echo On accepte l'envoi d'emails
# ============================= /sbin/iptables -A INPUT -i ppp0 --protocol tcp --source-port 25 -j LOG_ACCEPT
/sbin/iptables -A OUTPUT -o ppp0 --protocol tcp --destination-port 25 -j LOG_ACCEPT

echo On accepte le passage des News
# ================================ /sbin/iptables -A INPUT -i ppp0 --protocol tcp --source-port 119 -j LOG_ACCEPT
/sbin/iptables -A OUTPUT -o ppp0 --protocol tcp --destination-port 119 -j LOG_ACCEPT

echo On accepte le ftp
# =================== /sbin/iptables -A INPUT -i ppp0 --protocol tcp --source-port 21 -j LOG_ACCEPT
/sbin/iptables -A OUTPUT -o ppp0 --protocol tcp --destination-port 21 -j LOG_ACCEPT
/sbin/iptables -A INPUT -i ppp0 --protocol tcp --source-port 20 -j LOG_ACCEPT
/sbin/iptables -A OUTPUT -o ppp0 --protocol tcp --destination-port 20 -j LOG_ACCEPT
/sbin/iptables -A INPUT -i ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A OUTPUT -o ppp0 -m state --state ESTABLISHED,RELATED -j ACCEPT
/sbin/iptables -A OUTPUT -o ppp0 -p tcp --dport 21 -m state --state NEW -j ACCEPT


echo On accepte le passage du VPN
# =========================== /sbin/iptables -A INPUT -i ppp0 --protocol tcp --source-port 1723 -j LOG_ACCEPT
/sbin/iptables -A OUTPUT -o ppp0 --protocol tcp --destination-port 1723 -j LOG_ACCEPT

echo On détermine un fichier de log des rejets
# ======================================== /sbin/iptables -A LOG_DROP -j LOG --log-prefix '[IPTABLES DROP] :'
/sbin/iptables -A LOG_DROP -j DROP

echo Autoriser le traffic internet du réseau local vers internet
# ========================================================== /sbin/iptables -A FORWARD -i eth0 -o ppp0 -j ACCEPT
/sbin/iptables -A FORWARD -i ppp0 -o eth0 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -j ACCEPT
/sbin/iptables -A OUTPUT -o eth0 -j ACCEPT

echo Tout ce qui n est pas accepté par le firewall est rejeté silencieusement et mis en logs
# ====================================================================================== /sbin/iptables -A FORWARD -j LOG_DROP
/sbin/iptables -A INPUT -j LOG_DROP
/sbin/iptables -A OUTPUT -j LOG_DROP

echo Le réseau est protégé

fi

# Le masquerading est activé : Partage de la connection Internet
/sbin/iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
/sbin/iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
-----------------------------------------------

Bien sûr qu'il faut tout interdire, c'est un peu la base du filtrage IP.
On ferme tout, et on autorise au compte-goutte. Mais il y a nettement plus
simple pour tout interdire...
iptables -P FORWARD DROP


Oui, mais je ne veux tout interdire que pour le poste en question, et
ensuite autoriser seulement un site précis.
Est-ce que la règle suivante fonctionnerai (ça a l'air) :
iptables -P FORWARD -s 192.168.1.2 -j DROP


Lorsqu'on fait du SNAT ou du MASQUERADE (ce qui doit, je pense être le
cas), on ne modifie la source qu'en POSTROUTING. De fait, on a encore la
véritable source en FORWARD.


Oui, effectivement vu comme ça...


Le problème vient plutôt, amha, de l'ordre
dans lequel tu rentres tes règles, qui est, comme chacun le sait,
important quand on fait du filtrage.


C'est la que je buggue un peu...


On parle bien de trafic HTTP là non ? _Tous_ les navigateurs savent
passer par un proxy. Et même, on sait faire des proxies HTTP
transparents. Même à travers un VPN, on peut encore passer par un proxy,
je ne vois pas où est le problème. Tu peux nous décrire ton architecture
que je te montre ?


Ben en fait, il y a aussi le pop3, les news, et surtout, on a un accés par
le protocole pptp qui est rendu possible par des modules ajoutés à
netfilter.
Mais comme je l'ai dit, j'ai rien contre les proxy, simplement je ne
connais pas, car je m'y suis pas encore interressé, que j'ai pas le temps
pour ça, et que jusqu'ici, rien ne m'oblige à passer par un proxy...
refaire ma config, ré-étudier la sécurite de mon serveur etc...


Et les sites que je veux autoriser ont des IP fixes (c'est le cas pour
la majorité des sites, me semble-t-il, non ??)


Le problème n'est pas là.

:~$ host www.yahoo.com
www.yahoo.com CNAME www.yahoo.akadns.net
www.yahoo.akadns.net A 66.218.71.95
www.yahoo.akadns.net A 66.218.71.90
www.yahoo.akadns.net A 66.218.71.80
www.yahoo.akadns.net A 66.218.71.84
www.yahoo.akadns.net A 66.218.71.89
www.yahoo.akadns.net A 66.218.71.87
www.yahoo.akadns.net A 66.218.71.93
www.yahoo.akadns.net A 66.218.71.94
Pour bloquer l'accès à www.yahoo.com, il faut bloquer _toutes_ ces
adresses. OK ?


Certes, pour ce genre de site et les sites "mutualisés", mais les sites
que je veux autoriser sont privés et sont seuls sur leur IP (ou du moins,
ne se trouvent pas sur une IP de free ou autre...


Merci pour ton aide.

A+ gillot ;o)


Avatar
Vincent Bernat
OoO Lors de la soirée naissante du jeudi 07 août 2003, vers 17:15,
"Gillot" disait:

iptables -I FORWARD -s 192.168.1.2. -d 216.239.33.99 -j DROP

Ça donne quoi ?


Effectivement, la, ça fonctionne. Mais je voudrais bien comprendre,
parceque d'aprés ce que j'ai compris, il applique les règles dans l'ordre
listé, donc, si je pose cette rêgle à la fin, les paquets concernés ne
devraient-ils pas être rejetés même si précédemment, ils étaient acceptés
???


Tu ne fais pas beaucoup d'efforts pour lire les docs :
-A ajoute en fin de chaîne
-I ajoute en début de chaîne
Il s'agit de l'ordre dans la chaîne qui importe, pas de l'ordre des
commandes. Et s'il y a une différence entre -A et -I, c'est que tu
avais déjà des règles.

Parmi les docs simples qui t'ont été citées, je prends la première :

,----[ <URL:http://lea-linux.org/reseau/iptables.php3> ]
| chaîne
| une chaîne est une suite de règles, qui sont prises dans l'ordre ;
| dès qu'une règle matche un paquet, elle est déclenchée, et la
| suite de la chaîne est ignorée.
`----

Cédric est bien gentil de lire à ta place les tutoriels disponibles en
français, mais tu vas finir par le lasser.
--
NO ONE WANTS TO HEAR FROM MY ARMPITS
NO ONE WANTS TO HEAR FROM MY ARMPITS
NO ONE WANTS TO HEAR FROM MY ARMPITS
-+- Bart Simpson on chalkboard in episode 3F01


Avatar
Gillot
On Fri, 08 Aug 2003 06:17:26 +0000, Vincent Bernat wrote:

Tu ne fais pas beaucoup d'efforts pour lire les docs :
-A ajoute en fin de chaîne
-I ajoute en début de chaîne
Il s'agit de l'ordre dans la chaîne qui importe, pas de l'ordre des
commandes. Et s'il y a une différence entre -A et -I, c'est que tu
avais déjà des règles.


ça, je le savais, c'est le passage ci-dessous qui m'a échappé dans la doc
et qui me posais des problèmes !!!

| chaîne
| une chaîne est une suite de règles, qui sont prises dans l'ordre ;
| dès qu'une règle matche un paquet, elle est déclenchée, et la
| suite de la chaîne est ignorée.


Avatar
Gillot
On Thu, 07 Aug 2003 15:42:41 +0000, Cedric Blancher wrote:

Merci pour ta patience, tes explications et tes conseils.

Ce que tu dois savoir, c'est que le filtre évalue les règles en séquences
en partant du début. Dès qu'il a trouvé une règle qui s'applique au
paquet, il s'arrête et passe au paquet suivant. En gros, la première
chaîne qui matche est la dernière qui sera évaluée.


Ok, j'ai mieux compris en relisant le how-to, mais je vais me le re-farcir
encore, car c'est pas tout à fait clair dans ma tête en ce qui concerne le
traitement des paquets et à quel moment exactement, les règle ne sont plus
évaluées.

Merci encore.

A+ Gillot ;o)