Demande D'avis sur IPtables

Bonjoru à tous, j’ai un serveur que je voudrait en service en tant que firewall avec IPtables.

Voici le schéma:

Mon Lan ===> Serveur Linux===> Internet

Voici les regles:


//Vide intégralement la table filter
iptables -t filter -F

//Regles par défaut
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

//Regles DNS du client vers serveur
iptables -t filter -A INPUT --protocol tcp --destination-port 53 -j ACCEPT
iptables -t filter -A INPUT --protocol udp --destination-port 53 -j ACCEPT
iptables -t filter -A OUTPUT --protocol tcp --source-port 53 -j ACCEPT
iptables -t filter -A OUTPUT --protocol udp --source-port 53 -j ACCEPT

//Regles DNS du serveur vers Internet
iptables -t filter -A OUTPUT --protocol tcp --destination-port 53 -j ACCEPT
iptables -t filter -A OUTPUT --protocol udp --destination-port 53 -j ACCEPT
iptables -t filter -A INPUT --protocol tcp --source-port 53 -j ACCEPT
iptables -t filter -A INPUT --protocol udp --source-port 53 -j ACCEPT

//Regles HTTP du client vers le serveur

iptables -t filter -A INPUT --protocol tcp --destination-port 80 -j ACCEPT
iptables -t filter -A OUTPUT --protocol tcp --source-port 80 -j ACCEPT

//Regles HTTP du serveur vers Internet
iptables -t filter -A OUTPUT --protocol tcp --destination-port 80 -j ACCEPT
iptables -t filter -A INPUT --protocol tcp --source-port 80 -j ACCEPT

Mes regles sont-elles Bonne ou pas ??

Merci

guigui69

hello,

Tu les comprend les règles ?

Ben tu ne pourras pas faire grand chose avec ça: du Web strict point à la ligne. Ça me parait un peu restrictif…

[quote]guigui69
Bonjoru à tous, j’ai un serveur que je voudrait en service en tant que firewall avec IPtables. [/quote]

si tu veux faire un firewall sous linux il y’a IPCophttp://www.ipcop.org/index.phpqui est une distribution faite exprès pour ca.

[quote=“stonfi”]hello,

Tu les comprend les règles ?[/quote]+1

Pour répondre à ta question suivant ton schema, non:
elles ne partagent pas du tout la connection sur ton lan. elles ouvrent juste certains ports jusqu’au et depuis le serveur et ne traitent pas du tout sa traversée.

Salut a tous, Oui je comprend les regles ( mon proff ma expliquer comme ceci, et il a dit que s’etait bon) mais ca ne fonctionnait pas.

Mattotop avec ces regles la les utilisateur ne pourront tjr pas avoir le net ?

Non, juste la machine routeur et que sur du port 80…

Va voir du coté de FORWARD et de MASQUERADE dans le manuel d’iptables. Au hasard pars de

iptables -F INPUT
iptables -t nat -F
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
echo "1" > /proc/sys/net/ipv4/ip_forward

en admettant que l’interface vers internet est eth1. Evidemment c’est une passoire mais comprends cette règle et ça ira mieux après.

Fran.B

Ta regle si je l’es compris veut dire.

Que tu accepte tout les connexions et que tu fait du nat a destionation de ETH1 (internet) et que tu sort avec l’ip du serveur linux. c’est ca ??

Merci d’avance pour l’aide

guigui69

Oui, ce qui permet à ce qui déclare cette machine en passerelle d’aller sur Internet.
Il s’agit maintenant de définir ce que tu veux laisser passer, ce que tu veux interdire, et et de faire les règles de parefeu. Là, c’est à toi de voir tes besoins, de les préciser exactement. Les règles suivront.

Une fois que tu as le partage du net qui marche sans protection, tu commences par mettre une policy DROP par defaut en INPUT et en FORWARD (et eventuellement en output, mais c’est plus pour suivre ce qui ce passe que par risque réel).
Mais avant de mettre cette policy par defaut , tu commences par une règle permettant d’accèder en ssh à l’admin de ton serveur (important sinon, tu ne pourra plus l’administrer:

ensuite tu actives les policy DROP pour tout bloquer:

iptables -P INPUT DROP iptables -P FORWARD DROP puis aprés, tu autorise ce qui vient du noyau (c’est normal):

puis tu réautorise au client de ton lan (sur l’interface eth0 pour le lan, et par la suite, j’ai pris ppp0 comme interface d’exemple pour internet) de commencer une connection et aux paquets revenant d’un serveur (ESTABLISHED,RELATED) 'atteindre le client qui l’a appelé:

iptables -A FORWARD -i eth0 -m state --state NEW -j ACCEPT iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
et aussi les retours de requètes de ton routeur lui même:

avec ce minimum, tout devrait marcher.
Pour résumer, tu mmets ça dans un fichier, et tu fais iptables-restore <lefichier:

*filter :INPUT DROP [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i eth0 -m state --state NEW -j ACCEPT -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT COMMIT *nat :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A POSTROUTING -o ppp0 -j MASQUERADE COMMIT

ok merci, la j’etudie mon script


//Vide intégralement la table filter 
iptables -t filter -F 

//Regles par défaut 
iptables -P INPUT DROP 
iptables -P OUTPUT DROP 
iptables -P FORWARD DROP 

//Regles DNS du client vers serveur 
(en trop)iptables -t filter -A INPUT --protocol tcp --destination-port 53 -j ACCEPT 
(en trop)iptables -t filter -A INPUT --protocol udp --destination-port 53 -j ACCEPT 
(en trop)iptables -t filter -A OUTPUT --protocol tcp --source-port 53 -j ACCEPT 
(en trop)iptables -t filter -A OUTPUT --protocol udp --source-port 53 -j ACCEPT 

//Regles DNS du serveur vers Internet 
iptables -t filter -A OUTPUT --protocol tcp --destination-port 53 -j ACCEPT 
iptables -t filter -A OUTPUT --protocol udp --destination-port 53 -j ACCEPT 
iptables -t filter -A INPUT --protocol tcp --source-port 53 -j ACCEPT 
iptables -t filter -A INPUT --protocol udp --source-port 53 -j ACCEPT 

//Regles HTTP du client vers le serveur 

(en trop)iptables -t filter -A INPUT --protocol tcp --destination-port 80 -j ACCEPT 
(en trop)iptables -t filter -A OUTPUT --protocol tcp --source-port 80 -j ACCEPT 

//Regles HTTP du serveur vers Internet 
iptables -t filter -A OUTPUT --protocol tcp --destination-port 80 -j ACCEPT 
iptables -t filter -A INPUT --protocol tcp --source-port 80 -j ACCEPT 

qu’est qui il y a en trop (en trop) pour que juste mon serveur se connecte a internet donc DNS+HTTP ???

Merci

tu as rien lu et compris mon dernier post ?
Tes règles fonctionnent peut être, mais j’y vois déjà deux failles de sécu: qui te dit que les paquets qui viennent d’un port 53 ou 80 sont bien des réponses à une requète de ton serveur ?

sisi, OK je voit bien ou tu veut en venir

donc comme ceci:


//Vide intégralement la table filter 
iptables -t filter -F 

//Regles par défaut 
iptables -P INPUT DROP 
iptables -P OUTPUT DROP 
iptables -P FORWARD DROP 


//Regles DNS du serveur vers Internet 
iptables -t filter -A OUTPUT --protocol tcp --destination-port 53 --state ESTABLISHED,RELATED -j ACCEPT 
iptables -t filter -A OUTPUT --protocol udp --destination-port 53 --state ESTABLISHED,RELATED -j ACCEPT 
iptables -t filter -A INPUT --protocol tcp --source-port 53 --state ESTABLISHED,RELATED -j ACCEPT 
iptables -t filter -A INPUT --protocol udp --source-port 53 --state ESTABLISHED,RELATED -j ACCEPT 

//Regles HTTP du serveur vers Internet 
iptables -t filter -A OUTPUT --protocol tcp --destination-port 80 --state ESTABLISHED,RELATED -j ACCEPT 
iptables -t filter -A INPUT --protocol tcp --source-port 80 --state ESTABLISHED,RELATED -j ACCEPT 

Avec ce sript n’accede qu’a internet (dns http) avec la protection que ca soit mon serveur qui fait la requete dns et http ? non ??

Merci d’avance pour l’aide que vous m’apporter

guigui69

Voici mon fichier


# Vide les tables IPtables
#ETH0 = Internet
#ETH1= LAN
iptables -t filter -F

#Regles par défaut
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

#Le noyau
iptables -A INPUT -i lo -j ACCEPT
#connexion SSH au serveur
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

#Regles DNS du serveur vers Internet
iptables -t filter -A OUTPUT --protocol tcp --destination-port 53 -j ACCEPT
iptables -t filter -A OUTPUT --protocol udp --destination-port 53 -j ACCEPT
iptables -t filter -A INPUT --protocol tcp --source-port 53 -j ACCEPT
iptables -t filter -A INPUT --protocol udp --source-port 53 -j ACCEPT

#Règles HTTP du serveur vers Internet
iptables -t filter -A OUTPUT --protocol tcp --destination-port 80 -j ACCEPT
iptables -t filter -A INPUT --protocol tcp --source-port 80 -j ACCEPT

#Regle du Ping du le Serveur Vers Lan
iptables -t filter -A input -icmp -i eth1 -j ACCEPT
iptables -t filter -A output -icmp -o eth1 -j ACCEPT

#Partage connexion Internet.
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 

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

j’ai fait pour que je puisse me connecter en SSH (il me manque pas une ligne ?)

Mon fichier est -il correct?

Les utilisateur du lan auront-ils acces au NET ?
Le ping du lan vers le serveur fonctionnat-il?

J’ai regarder ce site pour comprendre IPTABLES (c-sait.net/cours/iptables.php) mais dans les exemples qu’il indique



Ensuite on indiquera plutôt en premier tout ce que l'on accepte, pour ensuite refuser tout le reste. On commencera donc par des règles ressemblant à la suivante : 
> iptables -t filter -A INPUT --protocol tcp --destination-port 80 --jump ACCEPT 

Cette règle permet de laisser passer tout le trafic TCP entrant sur le port 80. Ce sera utile par exemple si un serveur web (par défaut sur le port 80) est présent sur la machine. Mais il faut ensuite que les réponses envoyées puissent l'être. Dans ce cas, la règle précédente autorise des personnes extérieures à demander une page. Pour que le serveur puisse la transmettre, il faudra une règle comme suit : 
> iptables -t filter -A OUTPUT --protocol tcp --source-port 80 --jump ACCEPT 

Pour laisser les utilisateurs internes accéder aux sites Internet, on peut définir cette règle : 
> iptables -t filter -A OUTPUT --protocol tcp --destination-port 80 --jump ACCEPT 

Celle-ci permet donc de laisser passer les paquets à destination du port 80 d'une machine extérieure. Et pour que les utilisateurs puissent recevoir les pages envoyées par ces machines, il faudra ajouter : 
> iptables -t filter -A INPUT --protocol tcp --source-port 80 --jump ACCEPT 

Pour ne pas confondre ce que font les quatre règles précédentes, voici un résumé de ce qu'elles font : 

    * La première laisse entrer ce qui est pour le port 80 de la machine. 
    * La deuxième laisse sortir les paquets par le port 80 de la machine. 
    * La troisième laisse sortir ce qui est pour le port 80 d'une autre machine. 
    * La quatrième laisse entre ce qui vient du port 80 d'une autre machine. 

Je n’arrive pas bien a comprend la méthodologie, pour bien cerner comment faire fonctionner output/input avec les chaines source port destination port.

Autres question je voudrait mettre en place dans ma boite iptables pour vraiment séparer Internet/Lan.

Donc situation réseau:

  • 4 sites distant qui se connecte par un réseau privé jusqu’a nous.
  • 1 acces internet centralisé

5 serveurs (AD+exchange+DATA+WSUS+etc)

Ma machine Debian va comprendre:

  • ssh
  • DNS bind
  • Squid
  • Dansguardian

Voici un fichier de config pense tu qu’il est correct ?


# Vide les tables IPtables 
#ETH0 = Internet 
#ETH1= LAN 
iptables -t filter -F 

#Le noyau 
iptables -A INPUT -i lo -j ACCEPT 

#connexion SSH au serveur 
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT 

#Regles DNS du serveur vers Internet 
iptables -t filter -A OUTPUT --protocol tcp --destination-port 53 -j ACCEPT 
iptables -t filter -A OUTPUT --protocol udp --destination-port 53 -j ACCEPT 
iptables -t filter -A INPUT --protocol tcp --source-port 53 -j ACCEPT 
iptables -t filter -A INPUT --protocol udp --source-port 53 -j ACCEPT 

#Règles HTTP du serveur vers Internet 
iptables -t filter -A OUTPUT --protocol tcp --destination-port 80 -j ACCEPT 
iptables -t filter -A INPUT --protocol tcp --source-port 80 -j ACCEPT 

#Regle du Ping du le Serveur Vers Lan 
iptables -t filter -A input -icmp -i eth1 -j ACCEPT 
iptables -t filter -A output -icmp -o eth1 -j ACCEPT 

#regles acces a internet transparant. Cette regle redirige tu le flux internet 80 sur le port de squid 3128 
iptables -t nat -A PREROUTING -j DNAT -i eth1 -p TCP --dport 80 --to-destination eth1:3128 

#regle lan==>Squid 
iptables -t filter -A OUTPUT --protocol tcp --destination-port 3128 -j ACCEPT 
iptables -t filter -A INPUT --protocol tcp --source-port 3128 -j ACCEPT 

#Acces au serveur au net  les machine autoriser dans le NAT doivent avoir acces a internet en direct. 
iptables -t nat -A POSTROUTING -s 172.16.0.19 -o eth0 -j MASQUERADE 
iptables -t nat -A POSTROUTING -s 172.16.0.252 -o eth0 -j MASQUERADE 
iptables -t nat -A POSTROUTING -s 172.16.0.4 -o eth0 -j MASQUERADE 
iptables -t nat -A POSTROUTING -s 172.16.0.156 -o eth0 -j MASQUERADE 
iptables -t nat -A POSTROUTING -s 172.16.0.91 -o eth0 -j MASQUERADE 

#Regles par défaut 
iptables -P INPUT DROP 
iptables -P OUTPUT DROP 
iptables -P FORWARD DROP 

Merci d’avance pour l’aide que tu pourra m’apporter

guigui69

PS: Si tu a un bon Site pour comprend mieux IPtables je suis preneur. MERCI

Bonsoir,

Je peux proposer ce lien (en français)
linux-france.org/prj/inetdoc … -tutorial/

Sinon un truc qui me semble efficace pour comprendre comment ça marche et ce qui ne va pas consiste à logguer en debut et/ou fin de chaque table en utilisant --log-prefix .
Ainsi, on suit la traversée des tables par les paquets, on voit s’ils passent ou pas.

–log-prefix s’emploie avec -j LOG et permet de faire précéder la ligne de log par ce qui est déclaré par --log-prefix.

J’espère avoir été clair.

Merci pour ta réponses.

La je voudrait faire sur le serveur linux mettre BIND9 , squid et dansguardian. Ces 3 services sont installer et fonctionne. Je voudrait utiliser Squid de maniere transparent c’est adire de redirigées les requete sur le port 80 sur celui de dansguardian 8080 qui lui passera par squid.

Je suis arrivée a mettre Squid en proxy transparent
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

mais je n’arrive pas a rediriger les requete 80 sur le port 8080 (j’ai tester avec des site X, ca passe)

voici mon fichier:


#vider les tables
iptables -F
iptables -X

#interface reseau
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

#ssh
iptables -A INPUT -i eth1 -s 172.16.0.91 -m state --state NEW,ESTABLISHED -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth1 -d 172.16.0.91 -m state --state ESTABLISHED -p tcp --sport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

#rajout de route pour pourvoir sortir sur le NET
route del default
route del default
route add default gw 172.16.0.254

#Firewall Linux acces en HTTP (80&53)

iptables -A INPUT -i eth1 --protocol tcp --source-port 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth1 --protocol tcp --destination-port 80 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -i eth1 --protocol udp --source-port 53 -j ACCEPT
iptables -A OUTPUT -o eth1 --protocol udp --destination-port 53 -j ACCEPT
iptables -A INPUT -i eth1 --protocol tcp --source-port 53 -j ACCEPT
iptables -A OUTPUT -o eth1 --protocol tcp --destination-port 53 -j ACCEPT


#LAN==>Dansguardian==>SQUID ==> NET
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.1.0/255.255.255.0 --dport 80 -j REDIRECT --to-ports 8080
iptables -A POSTROUTING -t nat -o eth1 -j MASQUERADE







iptables -A INPUT -s 192.168.1.0/24 -j DROP
iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
iptables -A FORWARD -s 192.168.1.0/24 -j DROP




iptables -A FORWARD -j ACCEPT
iptables -A INPUT -j ACCEPT
iptables -A OUTPUT -j ACCEPT
~

QUe me manque-il pour que les requete sur le port 80 soit bien rediriger sur le port de Dasnguardian ??.

Autres question j’ai des serveur qui auront besoin d’avoir acces a internet pour envoyer des mail les mise a jours DNS etc…, je voudrait que mes serveurs (5 au total) est acces au net direct avec des connexion sécurisé quel est la meilleur méthode?? FROWARD ? Du NAT ???

Merci

guigui69

1/ta regle de redirect est correcte, mais ta regle de levee du filtrage en INPUT est inversée pour ce qui est du port.
Celle en OUTPUT, tu oublies que c’est ce qui ressort par dansguardian, et pas ce que le serveur web a émis.
Par ailleurs pour ouvrir un port, commences par faire un boulevard pour tous, puis restreints les critères de match, si ça marche par ex:

iptables -A INPUT -p tcp -m tcp -dport 80 -j ACCEPT
(pour accepter tout ce qui va vers un port 80, aprés tu restreinds à l’interface ou à certaines adresses en modifiant la règle)

et
iptables -A OUTPUT -p tcp -m tcp -sport 8080 -j ACCEPT
(pour accepter tout ce qui sort du port dg)

ou mieux
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
(pour accepter tout ce qui passe et qui est corrèlé à une connection que tu a déjà accepté quel que soit l’operation que tu avais commencée)

que tu complètes, si tu veux autoriser les clients la à faire ce qu’il veulent quel que soit le port par un
iptables -A -i eth1 -s 192.168.1.0/24 -m state --state NEW -j ACCEPT
(que tu peux ensuite n’utiliser pour n’autoriser un debut de transaction depuis le lan que sur certains ports).

2/si ce n’est que de l’envoi, rien à faire de plus que de les mettre comme clients. si tu veux accepter les mails entrants, il faudra faire du nat.

AMA, tu es super loin d’avoir compris, et tu fais trop de choses en même temps. Reprends à zero un parefeu qui bloque tout par défaut (-P DROP partout en filter), masquerade tout ce qui traverse pour sortir par eth0 (iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ), et la règle d’acceptation des retours pour ce qui est ESTABLISHED, RELATED, puis ensuite, ouvres et testes un à un les ports que tu veux ouvrir en adaptant la règle de NEW que je t’ai donnée dans le 1/
une fois que tout marche sans proxy, tu fais ta transparence, puis tes redirections eventuelles vers des serveurs si tu as à laisser entrer du mail.