Filtrage avec iptables (bash)

Bonjour
Pour commencer je n’ai pas trouvé de réponse sur le sujet (le champ recherche en haut du forum ne semble pas fonctionné, mais ne fourni aucun message d’erreur et m’affiche la page d’accueil du forum)

Pour mon problème, mon fournisseur internet étant très généreux avec la bande passante j’ai remarqué que si j’avais trop de débit/connexion cela me posé des problème de paquet perdu. De plus ma femme n’aime pas que je “mange toute la connexion internet”.

J’ai donc entrepris de ne télécharger que les site qui m’intéresse, pour cela je compte crée une liste d’ip autorisé dans iptable. Je pense crée le script en php/bash/iptable (php crée l’interface graphique + génére le bash, bash crée les iptable, et bien sur iptable me purge les paquets)

Actuellement je bloque sur la partie iptable.

Voici un code faux (car les règles sont auto bloquante entre-elle) qui montre pour un “hummain” se que je désire faire

iptables -A INPUT -p tcp --dport 80 -s ! google.com -j DROP iptables -A OUTPUT -p tcp --dport 80 -d ! google.com -j DROP iptables -A INPUT -p tcp --dport 80 -s ! debian-fr.org -j DROP iptables -A OUTPUT -p tcp --dport 80 -d ! debian-fr.org -j DROP
On se retrouve bloqué soit par les règles google soit par les règles debian => aucun site n’est donc accessible.

Voila l’état actuel de mes tests :

[code]#!/bin/bash

iptables -F
iptables -X

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT

iptables -A INPUT -p 53 -j ACCEPT
iptables -A OUTPUT -p 53 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -p all -s google.com -j ACCEPT
iptables -A OUTPUT -p all -d google.com -j ACCEPT
iptables -A INPUT -p all -s debian-fr.org -j ACCEPT
iptables -A OUTPUT -p all -d debian-fr.org -j ACCEPT

iptables -P INPUT DROP
iptables -P OUTPUT DROP

iptables -L
[/code]

Auriez-vous une idée ?

Autre informations :

Linux debian_test 2.6.32-5-686 #1 SMP Sun Sep 23 09:49:36 UTC 2012 i686 GNU/Linux iptables v1.4.8: no command specified

Résultat iptable :

[code]Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT 53 – anywhere anywhere
ACCEPT all – anywhere anywhere state RELATED,ESTABLISHED
ACCEPT all – 173.194.34.35 anywhere
ACCEPT all – 173.194.34.36 anywhere
ACCEPT all – 173.194.34.39 anywhere
ACCEPT all – 173.194.34.37 anywhere
ACCEPT all – 173.194.34.40 anywhere
ACCEPT all – 173.194.34.41 anywhere
ACCEPT all – 173.194.34.46 anywhere
ACCEPT all – 173.194.34.38 anywhere
ACCEPT all – 173.194.34.33 anywhere
ACCEPT all – 173.194.34.32 anywhere
ACCEPT all – 173.194.34.34 anywhere
ACCEPT all – 91.121.50.62 anywhere

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT 53 – anywhere anywhere
ACCEPT all – anywhere 173.194.34.35
ACCEPT all – anywhere 173.194.34.36
ACCEPT all – anywhere 173.194.34.39
ACCEPT all – anywhere 173.194.34.37
ACCEPT all – anywhere 173.194.34.40
ACCEPT all – anywhere 173.194.34.41
ACCEPT all – anywhere 173.194.34.46
ACCEPT all – anywhere 173.194.34.38
ACCEPT all – anywhere 173.194.34.33
ACCEPT all – anywhere 173.194.34.32
ACCEPT all – anywhere 173.194.34.34
ACCEPT all – anywhere 91.121.50.62[/code]

Merci d’avance

Ce n’est pas le rôle d’un proxy de filtrer tous ça d’habitude ?

Si oui alors tu devrais trouver ton bonheur en cherchant les sujets traitant de proxy filtrant et de cache :033

Je me suis déjà pencher sur le sujet en regardant Squid, Il ne m’as pas permit de gagner outre mesure de la rapidité.
(Trop lourd pour des pages trop variable => Surcharge IO de la machine ou je l’ai installé avec peu très peu de gain BP)
De plus un proxy filtre les entrées / les sorties mais je n’ai pas trouvé une liaison entre les deux.
Et dans mon cas le filtrage sera lié a chaque fois as une VM spécifique avec sa propre config iptable.

Une analyse de mon traffic me montre que j’utilise beaucoup de BP par les publicités, pour être exacte d’ouverture HTTP.
Et donc TCP/IP ce qui génère des Hic réseaux car ma box ne suit plus.

Du coup je cherche plus à Bloquer les inutiles qu’as Cacher les pages visitées.
En tous cas merci pour le tuyaux qui aidera les utilisateurs plus classic du web qui possède plus de 3 machines ou effectivement cette solution serai adapté.

Tu as des proxy filtrants et sinon une autre possibilité est d’utiliser un proxydns. Bien sûr c’est possible avec iptables mais faudrait que je m’y penche plus pour essayer de comprendre.

Je viens de jeter un oeil au 2 proxy filtrant proposé.
Je connaissais déjà squidgard de visu, et bien que je viens de découvrir qu’il possède des listes toutes faite, il fonctionne a l’inverse de se que je désire.(Il bloque des listes, je désire autoriser des listes)

Privoproxy que je ne connaissais pas (merci de me l’avoir fait découvrir) fonctionne luis aussi sur des listes bloquées.

Ta dernière proposition est une superbe idée que je vais travailler avec mes amis les moteurs de recherche.
Pour information j’ai déjà tenter une approche similaire en jouant avec les host.allow et host.deny, mais leur bloquage n’est effectif que sur les entrées et non sur les sorties (en mode paranoîaque et aussi en mode deny all)

UPDATE: [13 Déc 2012 03:08]
Je ne pense pas que le système de filtrage par DNS me conviennent, bien que OpenDNS utilise un système qui semble me correspondre (les règles change en fonction de l’IP) toutes mes VM sont en local et je n’ai pas trouvé de source public faisant pareil. Du coup il me frauderai donc installer se système chez moi, et avoir 2 serveurs DNS / VM.

Comme le problème persiste j’ai donc décider de déclaré explicitement le droits de FORWARD, et déclaré les URL avec www pour éviter les problème de redirection par iceweacel lorsqu’il ne trouve pas.

[code]iptables -F
iptables -X

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

iptables -A INPUT -p 53 -j ACCEPT
iptables -A FORWARD -p 53 -j ACCEPT
iptables -A OUTPUT -p 53 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -p all -s www.google.com -j ACCEPT
iptables -A FORWARD -p all -s www.google.com -j ACCEPT
iptables -A OUTPUT -p all -d www.google.com -j ACCEPT
iptables -A INPUT -p all -s www.debian-fr.org -j ACCEPT
iptables -A FORWARD -p all -s www.debian-fr.org -j ACCEPT
iptables -A OUTPUT -p all -d www.debian-fr.org -j ACCEPT

iptables -P INPUT DROP
iptables -P OUTPUT DROP

iptables -L[/code]

J’ai remarqué que les IP sont nombreuse pour google, et si j’entre directement une IP j’ai bien le site google.

[code]root@integration:/home/user# ./iptables_test.sh
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT 53 – anywhere anywhere
ACCEPT all – anywhere anywhere state RELATED,ESTABLISHED
ACCEPT all – 74.125.230.80 anywhere
ACCEPT all – 74.125.230.81 anywhere
ACCEPT all – 74.125.230.84 anywhere
ACCEPT all – 74.125.230.83 anywhere
ACCEPT all – 74.125.230.82 anywhere
ACCEPT all – 91.121.50.62 anywhere

Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT 53 – anywhere anywhere
ACCEPT all – 74.125.230.209 anywhere
ACCEPT all – 74.125.230.211 anywhere
ACCEPT all – 74.125.230.210 anywhere
ACCEPT all – 74.125.230.212 anywhere
ACCEPT all – 74.125.230.208 anywhere
ACCEPT all – 91.121.50.62 anywhere

Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT 53 – anywhere anywhere
ACCEPT all – anywhere 74.125.230.208
ACCEPT all – anywhere 74.125.230.210
ACCEPT all – anywhere 74.125.230.211
ACCEPT all – anywhere 74.125.230.209
ACCEPT all – anywhere 74.125.230.212
ACCEPT all – anywhere 91.121.50.62 [/code]

J’ai aussi remarqué que la resolution du NDD s’effectue mal :

root@integration:/home/user# host www.debian-fr.org ;; connection timed out; no servers could be reached

Je pense donc avoir un problème sur ma résolution de NDD, et après un problème moins gênant dans mon cas de listing d’IP. Que je pense réglé dans un second temps après avoir pu accéder à debian-fr…

Auriez-vous des idées ?

Bon j’ai fini par trouver la solution.
Le problème viens du -p qui ne signifie pas “port” mais “protocol"
Utiliser “-p all” bloque le “–dport” et on ne peut donc pas fixer un port.
Il faut donc faire 2 lignes '-p tcp” et “-p udp”.

[code]#!/bin/bash

iptables -F
iptables -X

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

#iptables -A INPUT -p 80 -j ACCEPT
#iptables -A FORWARD -p 80 -j ACCEPT
#iptables -A OUTPUT -p 80 -j ACCEPT

DNS :

iptables -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

DHCP :

iptables -A INPUT -p tcp --dport 67 -j ACCEPT
iptables -A FORWARD -p tcp --dport 67 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 67 -j ACCEPT
iptables -A INPUT -p udp --dport 67 -j ACCEPT
iptables -A FORWARD -p udp --dport 67 -j ACCEPT
iptables -A OUTPUT -p udp --dport 67 -j ACCEPT

iptables -A INPUT -p tcp --dport 68 -j ACCEPT
iptables -A FORWARD -p tcp --dport 68 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 68 -j ACCEPT
iptables -A INPUT -p udp --dport 68 -j ACCEPT
iptables -A FORWARD -p udp --dport 68 -j ACCEPT
iptables -A OUTPUT -p udp --dport 68 -j ACCEPT

J’autorise les sites que je désire accepter :

iptables -A INPUT -p all -s www.google.com -j ACCEPT
iptables -A FORWARD -p all -s www.google.com -j ACCEPT
iptables -A OUTPUT -p all -d www.google.com -j ACCEPT
iptables -A INPUT -p all -s www.debian-fr.org -j ACCEPT
iptables -A FORWARD -p all -s www.debian-fr.org -j ACCEPT
iptables -A OUTPUT -p all -d www.debian-fr.org -j ACCEPT

Je garde le déjà ouvert :

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

#iptables -P INPUT DROP
iptables -P OUTPUT DROP

iptables -L[/code]
Qui resulte en :

[code]./iptables_test.sh
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp – anywhere anywhere tcp dpt:domain
ACCEPT udp – anywhere anywhere udp dpt:domain
ACCEPT tcp – anywhere anywhere tcp dpt:bootps
ACCEPT udp – anywhere anywhere udp dpt:bootps
ACCEPT tcp – anywhere anywhere tcp dpt:bootpc
ACCEPT udp – anywhere anywhere udp dpt:bootpc
ACCEPT all – par03s01-in-f16.1e100.net anywhere
ACCEPT all – par03s01-in-f18.1e100.net anywhere
ACCEPT all – par03s01-in-f19.1e100.net anywhere
ACCEPT all – par03s01-in-f20.1e100.net anywhere
ACCEPT all – par03s01-in-f17.1e100.net anywhere
ACCEPT all – chp1.zehome.com anywhere
ACCEPT all – anywhere anywhere state RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT tcp – anywhere anywhere tcp dpt:domain
ACCEPT udp – anywhere anywhere udp dpt:domain
ACCEPT tcp – anywhere anywhere tcp dpt:bootps
ACCEPT udp – anywhere anywhere udp dpt:bootps
ACCEPT tcp – anywhere anywhere tcp dpt:bootpc
ACCEPT udp – anywhere anywhere udp dpt:bootpc
ACCEPT all – par03s02-in-f18.1e100.net anywhere
ACCEPT all – par03s02-in-f16.1e100.net anywhere
ACCEPT all – par03s02-in-f17.1e100.net anywhere
ACCEPT all – par03s02-in-f19.1e100.net anywhere
ACCEPT all – par03s02-in-f20.1e100.net anywhere
ACCEPT all – chp1.zehome.com anywhere
ACCEPT all – anywhere anywhere state RELATED,ESTABLISHED

Chain OUTPUT (policy DROP)
target prot opt source destination
ACCEPT tcp – anywhere anywhere tcp dpt:domain
ACCEPT udp – anywhere anywhere udp dpt:domain
ACCEPT tcp – anywhere anywhere tcp dpt:bootps
ACCEPT udp – anywhere anywhere udp dpt:bootps
ACCEPT tcp – anywhere anywhere tcp dpt:bootpc
ACCEPT udp – anywhere anywhere udp dpt:bootpc
ACCEPT all – anywhere par08s09-in-f16.1e100.net
ACCEPT all – anywhere par08s09-in-f19.1e100.net
ACCEPT all – anywhere par08s09-in-f18.1e100.net
ACCEPT all – anywhere par08s09-in-f20.1e100.net
ACCEPT all – anywhere par08s09-in-f17.1e100.net
ACCEPT all – anywhere chp1.zehome.com
ACCEPT all – anywhere anywhere state RELATED,ESTABLISHED[/code]

Pour la résolution du google, j’ai simplement opté pour une ligne dans le fichier hosts.
En espérant que ça en aide d’autre.

En tant que concentré d’exemples d’erreurs à ne pas faire ?

PS: Je ne vois pas ce que tout ça a à voir avec la programmation. Si la discussion avait été ouverte dans le forum Support Debian, des personnes comme moi qui connaissent iptables mais ne suivent pas forcément le forum Programmation l’auraient vue et y auraient répondu plus tôt, t’évitant bien des errements.

Je viens également de m’en apercevoir. Déplacé, même si c’est un peu tard. :unamused: