Iptables et filtrage mac /ip

Bonjour a tous,
Je suis sur un reseau ayant deux plage d’adresses :
192.168.0.0 pour tout ce qui est RJ45
10.3.2.0 pour tout ce qui est wifi.

Mon routeur (10.3.2.1/192.168.0.1

Ma machine debian : (192.168.0.254/10.3.2.254)
Un proxy squid en mode transparent (le routeur est derrière la patte 10.3.2.254)
Un serveur samba, accessible seulement par les machines RJ45.
Une base de donnée FIREBIRD accessible à tous.

Je lui fait aussi jouer le rôle de firewall :

Mes utilisateurs :
Utilisateur Wifi invités passant à travers le proxy pour l’acces WEB
Utilisateur referencé en wifi sans proxy pour le web uniquement
Utilisateur RJ45 pour le WEB uniquement
Utilisateur RJ45 pour un acces a tout (Web, samba, firebird, matériel …).

Mon soucis est de filtrer ces divers utilisateurs de facon transparente (pas d’authentification).
Pour les identifier je ne vois que les adresses mac.
J’ai donc fait un script iptables. Mais je bloque sur les adresses mac : j’arrive a crerr un tableau de ces adresses, a jouer le script, les adresses mac sont bien prisent en compte par iptables mais je ne parvient pas a bipasser le proxy.
J’en suis a marquer les paquets, et utiliser iprules (sympa, je ne connaissais pas, je decouvre).

Voila voila, je ne pense pas que cela soit bien violent, mais je viens d’y passer 3 heures et la je ne vois plus rien …

Voici mon script :
#on libere tout :
iptables -F
iptables -X

#VARIABLES POUR LES REGLES
MAC_ADRESSE=“00:12:F0:18:1A:E6 00:1A:73:86:AB:93”

on ferme d’abord tout en entrée

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

Nous faisons de même avec toutes les autres tables,

à savoir “nat” et “mangle”, mais en les faisant pointer

par défaut sur ACCEPT. Ca ne pose pas de problèmes

puisque tout est bloqué au niveau “filter”

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 INPUT ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT

#on accept les interfaces lo eth0 et eth1
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A OUTPUT -o eth0 -j ACCEPT
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT

on active le routage

echo 1 >/proc/sys/net/ipv4/ip_forward

#Translation d’adresse pour tout ce qui traverse la passerelle.
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.3.2.0/24 -o eth1 -j MASQUERADE

Toutes les connexions qui sortent du LAN vers la passerelle

#ou du LAN vers le LAN

sont acceptées

iptables -A FORWARD -i eth0 -o eth1 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Seules les connexions déjà établies ou en relation avec

des connexions établies sont acceptées venant de la passerelle vers le LAN

iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

#Se protéger des scan de port
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

#Se protéger contre le ping de la mort
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

#Requete ICMP passent :
iptables -A INPUT -p icmp -m state --state RELATED -j ACCEPT

Autorisation des requêtes DNS locales pour la mise a jour du serveur dns

iptables -A OUTPUT -o eth1 -p udp --sport 1024: --dport 53 -m state --state ! INVALID -j ACCEPT
iptables -A INPUT -i eth1 -p udp --sport 53 --dport 1024: -m state --state RELATED,ESTABLISHED -j ACCEPT

#ARRET DES REQUETE DE MSN ET LIVE MESSAGER
iptables -A FORWARD -p TCP --dport 1863 -j DROP
iptables -A FORWARD -o eth0 -d login.passport.net
iptables -A FORWARD -o eth0 -d loginnet.passport.com -j DROP
iptables -A FORWARD -o eth0 -d hotmail.com -j DROP

TEST MACHINES QUI ECHAPPENT A LA REGLE PROXY:

Traitement de la liste des adresses mac autorisée

for adr_mac in $MAC_ADRESSE ; do
	#TEST#iptables -A INPUT -m state --state ! INVALID -m mac --mac-source $adr_mac -p tcp -m multiport --dport 80,110,25,20,21,443 -j ACCEPT;
	#TEST#iptables -t nat -A PREROUTING -i eth1 -m mac --mac-source $adr_mac -p tcp -m multiport --dport 80,110,25,20,21,443 -j ROUTE --gw 10.3.2.1;
	iptables -t mangle -A PREROUTING -i eth1 -m mac --mac-source $adr_mac -p tcp -m multiport --dport 80,110,25,20,21,443 -j MARK --set-mark 1
echo $adr_mac;
done

#Requete des routeurs WiFi :
iptables -t nat -A PREROUTING -i eth1 -s 10.3.2.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i eth1 -s 10.3.2.0/24 -p tcp --dport 443 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i eth1 -s 10.3.2.0/24 -p udp --dport 443 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i eth1 -s 10.3.2.0/24 -p tcp --dport 110 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i eth1 -s 10.3.2.0/24 -p tcp --dport 25 -j REDIRECT --to-port 3128

#FireBird INFOLOG
iptables -A INPUT -m state --state ! INVALID -s 192.168.0.0/255.255.255.0 -p TCP --dport 3050 -j ACCEPT

#samba
iptables -A INPUT -m state --state ! INVALID -s 192.168.0.0/255.255.255.0 -p TCP --dport 137:139 -j ACCEPT
iptables -A INPUT -m state --state ! INVALID -s 192.168.0.0/255.255.255.0 -p UDP --dport 137:139 -j ACCEPT
iptables -A INPUT -m state --state ! INVALID -s 192.168.0.0/255.255.255.0 -p TCP --dport 445 -j ACCEPT
iptables -A INPUT -m state --state ! INVALID -s 192.168.0.0/255.255.255.0 -p UDP --dport 445 -j ACCEPT

#squid
iptables -A INPUT -m state --state ! INVALID -s 192.168.0.0/255.255.255.0 -p TCP --dport 3128 -j ACCEPT
iptables -A INPUT -m state --state ! INVALID -s 192.168.0.0/255.255.255.0 -p UDP --dport 3128 -j ACCEPT

#ssh
#iptables -A INPUT -m state --state NEW -p TCP --dport 22 -j ACCEPT

#Puis on rejette tout.
iptables -A INPUT -j DROP

##########################################################################################################
##########IPRULES

#*************************

Debut des definitions.

#-------------------------

clear
ip route flush cache

ip rule del fwmark 1

Regle de transmission aux bonnes tables de routages

ip rule add fwmark 1 table 1
ip route add default via 10.3.2.1 table 1

ip route flush ca

Je ne comprends pas un point. D’après le dessin, la machine Debian est entre le réseau local et le routeur, mais les deux ont les mêmes sous-réseaux. La machine Debian est-elle un pont ou un routeur ? Si c’est un routeur, je ne comprends pas le plan d’adressage.

Je vois une règle iptables commentée avec la cible ROUTE. Celle-ci n’est pas disponible dans les noyaux standards, et son usage est fortement déconseillé.

Je ne comprends pas non plus pourquoi tu aurais besoin de faire du routage avancé. Si tu veux que des paquets ne soient pas interceptés par le proxy transparent, il suffit de ne pas leur appliquer de règle REDIRECT.

Squid est un proxy HTTP seulement, intercepter des connexions d’autres protocoles (HTTPS, SMTP, POP3) ne marchera pas.

HTTPS n’utilise pas UDP. En revanche DNS utilise aussi TCP.

Les requêtes ICMP (essentiellement ping/echo) ne sont pas dans l’état RELATED mais NEW, et ESTABLISHED dans des cas particuliers. Les paquets ICMP dans l’état RELATED sont des messages d’erreurs liés à d’autres paquets (destination unreachable, time exceeded, parameter problem, redirect…).

EDIT : j’ai corrigé une coquille dans le paragraphe précédent.

Le ping de la mort n’est pas un ping flood, c’était un ping de grande taille qui faisait planter de vieilles versions de Windows.

Merci pour ta réponse.
Je ne suis pas un spécialiste de tcpip, j’essai … humblement.

Je ne comprends pas un point. D’après le dessin, la machine Debian est entre le réseau local et le routeur, mais les deux ont les mêmes sous-réseaux. La machine Debian est-elle un pont ou un routeur ? Si c’est un routeur, je ne comprends pas le plan d’adressage.

C’est plutôt un pont - il est la uniquement pour valider/filtrer/tuer et diriger les paquets


Je vois une règle iptables commentée avec la cible ROUTE. Celle-ci n’est pas disponible dans les noyaux standards, et son usage est fortement déconseillé.

J’ai vu cela dans la documentation ou je l’ai decouverte. Je ne l’utiliserais pas car il faut effectivement un noyau non standard.


Je ne comprends pas non plus pourquoi tu aurais besoin de faire du routage avancé. Si tu veux que des paquets ne soient pas interceptés par le proxy transparent, il suffit de ne pas leur appliquer de règle REDIRECT.

C’est bien mon soucis, tu vois mes différents essais, et aucun ne me permet de bipasser le proxy
#iptables -A INPUT -m state --state ! INVALID -m mac --mac-source $adr_mac -p tcp -m multiport --dport 80,110,25,20,21,443 -j ACCEPT;
cette ligne la ne marche pas - ma machine se retrouve sur le proxy car elle a une adresse en 10.3.2.0 je pense.


Squid est un proxy HTTP seulement, intercepter des connexions d’autres protocoles (HTTPS, SMTP, POP3) ne marchera pas.

Je ne savais pas … j’ai fait cela car j’ai mis dans mon script squid.conf cette ligne : acl Safe_ports port 80 21 22 25 110
Est il possible de n’ouvrir ces ports que a des heures convenues en utilisant iptables ?.


HTTPS n’utilise pas UDP. En revanche DNS utilise aussi TCP.

Oui, tu as raison, un copier collé … je corrige.


Les requêtes ICMP (essentiellement ping/echo) ne sont pas dans l’état RELATED mais NEW, et ESTABLISHED dans des cas particuliers. Les paquets ICMP dans l’état ESTABLISHED sont des messages d’erreurs liés à d’autres paquets (destination unreachable, time exceeded, parameter problem, redirect…).

Merci je ne savais pas. Je corrige cela …


Le ping de la mort n’est pas un ping flood, c’était un ping de grande taille qui faisait planter de vieilles versions de Windows.

Je parlais au FLOOD, merci de cette info et de tous ces points que je ne maitrise pas.
Je fais les différentes modifs et je reviens.

MERCI.

C’est plutôt un pont - il est la uniquement pour valider/filtrer/tuer et diriger les paquets

Comment ça “plutôt” ? C’est l’un ou l’autre, voire les deux en même temps, mais pas “plutôt”. As-tu créé un bridge entre les deux interfaces ethernet avec brctl ou bridge_ports ?

C’est bien mon souci, tu vois mes différents essais, et aucun ne me permet de by-passer le proxy
#iptables -A INPUT -m state --state ! INVALID -m mac --mac-source $adr_mac -p tcp -m multiport --dport 80,110,25,20,21,443 -j ACCEPT;
cette ligne la ne marche pas - ma machine se retrouve sur le proxy car elle a une adresse en 10.3.2.0 je pense.

Cette règle doit être créée dans la chaîne PREROUTING de la table nat afin de court-circuiter les règles REDIRECT qui suivent.

Les paquets ICMP dans l’état ESTABLISHED sont des messages d’erreurs

J’ai corrigé une coquille dans mon message précédent : les messages d’erreur ICMP valides sont classés dans l’état RELATED.

Mrci pour ton interet :

[color=#0000FF]C’est plutôt un pont - il est la uniquement pour valider/filtrer/tuer et diriger les paquets

Comment ça “plutôt” ? C’est l’un ou l’autre, voire les deux en même temps, mais pas “plutôt”. As-tu créé un bridge entre les deux interfaces ethernet avec brctl ou bridge_ports ?
[/color]

NON - donc c’est un routeur.

[color=#0000FF]C’est bien mon souci, tu vois mes différents essais, et aucun ne me permet de by-passer le proxy
#iptables -A INPUT -m state --state ! INVALID -m mac --mac-source $adr_mac -p tcp -m multiport --dport 80,110,25,20,21,443 -j ACCEPT;
cette ligne la ne marche pas - ma machine se retrouve sur le proxy car elle a une adresse en 10.3.2.0 je pense.

Cette règle doit être créée dans la chaîne PREROUTING de la table nat afin de court-circuiter les règles REDIRECT qui suivent.
[/color]

?? est ce que tu veux dire comme cela ? :
iptables -t nat -A PREROUTING -i eth1 -m mac --mac-source $adr_mac -p tcp -m multiport --dport 80,110,25,20,21,443 -j ACCEPT
dans la boucle do.

[color=#0000FF]Les paquets ICMP dans l’état ESTABLISHED sont des messages d’erreurs

J’ai corrigé une coquille dans mon message précédent : les messages d’erreur ICMP valides sont classés dans l’état RELATED.
[/color]

Ok - je ne vais pas te contredire …

MERCI.

est ce que tu veux dire comme cela ? :
iptables -t nat -A PREROUTING -i eth1 -m mac --mac-source $adr_mac -p tcp -m multiport --dport 80,110,25,20,21,443 -j ACCEPT
dans la boucle do.

Oui.

Si c’est un routeur, je ne comprends pas le plan d’adressage, car il semble y avoir les mêmes sous-réseaux de chaque côté, ce qui ne devrait pas fonctionner. Il fait du proxy ARP ?

iptables -t nat -A PREROUTING -i eth1 -m mac --mac-source $adr_mac -p tcp -m multiport --dport 80,110,25,20,21,443 -j ACCEPT
dans la boucle do.
Oui.

Ca ne marche pas avec cette chaine. Aucune reponse …

Si c’est un routeur, je ne comprends pas le plan d’adressage, car il semble y avoir les mêmes sous-réseaux de chaque côté, ce qui ne devrait pas fonctionner. Il fait du proxy ARP ?

Non.
Effectivement j’ai le RJ en 192.168. et le WIFI en 10.3.2., mon routeur est en 10.3.2.1.
Mon serveur est en 192.168.0.254 et 10.3.2.254, sa route par defaut est 10.3.2.1.

J’ai changer l’adresse de mon routeur :
10.254.254.1
j’ai ajouter une interface virtuelle eth1:1 10.254.254.254
et en ai fait la route par default.

Pour info eth1:1 n’est pas une interface virtuelle, c’est un alias IP.

Mais si tu ajoutes simplement un autre sous-réseau à eth1 tout en laissant les mêmes sous-réseaux sur eth0 et eth1, tu risques d’avoir quand même des problèmes de routage. Si j’ai un conseil à te donner, c’est de faire un plan d’adressage carré avant de t’attaquer aux règles iptables. Qu’affiche “route -n” ?

Autre chose, si eth1 est l’interface côté routeur, alors les règles de redirection vers le proxy (et de by-pass) doivent porter sur les paquets qui entrent par eth0 et non eth1 comme dans ton script.