Pages : 1
#1 Le 27/11/2009, à 09:07
- Pep31
iptables : Autoriser https pour un lan
Bonjour,
Je suis en train de configurer une passerelle sous ubuntu pour partager une connexion Internet pour mon lan. La passerelle fait egalement office de serveur proxy.
Mon but est de forcer les ordi du reseau a passer par mon proxy (squid) pour acceder a Internet (mise en place d'un proxy transparent) et de bloquer skype.
Actuellement, tout marche plutot bien si ce n'est l'acces aux sites en https. En clair, tout mes ordi accedent a Internet, passent par le proxy (qui filtre bien les sites voulu) et skype est bloque. Par contre, impossible d'acceder aux sites en https.
Voici le fichier iptables que j'utilise (fichier provenant de http://doc.ubuntu-fr.org/tutoriel/comment_configurer_son_reseau_local et que j'ai un peu modifie) :
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
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 OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.1:3128
iptables -A FORWARD -p tcp -i eth0 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -i eth0 --dport 443 -j ACCEPT
iptables -N MAregle
iptables -A MAregle -m state --state NEW -i! eth1 -j ACCEPT
iptables -A MAregle -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -j MAregle
iptables -A FORWARD -p tcp --dport 80 -j MAregle
iptables -A FORWARD -p tcp --dport 443 -j MAregle
echo 1 >/proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j MASQUERADE
Si quelqu'un pouvait m'aider ce serait vraiment sympa car je cherche depuis plusieurs jours et je ne trouve pas.
merci
Hors ligne
#2 Le 27/11/2009, à 09:25
- desmogone
Re : iptables : Autoriser https pour un lan
Salut !
Je suis pas spécialiste iptables mais dans ces lignes :
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.1:3128
iptables -A FORWARD -p tcp -i eth0 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -i eth0 --dport 443 -j ACCEPT
tu fais passer le port 80 par ton proxy si j'ai bien compris, mais pas le port 443 ...
Donc soit tes clients accèdent au https en direct ? Soit ils sont bloqués vu que pas redirigés vers le proxy ?
Il faudrait donc peut-être rajouter une ligne de PREROUTING également pour le 443 en plus du 80 ?
Desmogone, qui essaie d'être logique ...
Phenom II X4 940 - RAM 4Go - 9600GT - HDD Sata 500Go - ubuntu 14.04 LTS 64 bits
Portable LDLC 13" - Pentium 2020M - RAM 4G - SSD Sata 120Go - xubuntu 15.04 64 bits
MSI Wind Atom N270 - RAM 2Go - i945 - SSD Sata 80Go - ubuntu 14.04 LTS 64 bits
Hors ligne
#3 Le 27/11/2009, à 09:29
- _Raum_
Re : iptables : Autoriser https pour un lan
Alors tu es logique et tu as probablement raison...
Je vais tout de même ajouter quelques questions par rapport à ceci :
iptables -A FORWARD -p tcp -i eth0 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -i eth0 --dport 443 -j ACCEPT
(..)
iptables -A FORWARD -p tcp --dport 80 -j MAregle
iptables -A FORWARD -p tcp --dport 443 -j MAregle
D'après toi, lesquelles sont reconnues ? les plus restrictives ou les autres ? Tu peux utiliser une des options iptables pour voir des compteurs sur le nombre de fois qu'une règle est utilisée.... cela t'aidera à voir celles qui ne servent à rien...
Hors ligne
#4 Le 27/11/2009, à 09:52
- Pep31
Re : iptables : Autoriser https pour un lan
Il faudrait donc peut-être rajouter une ligne de PREROUTING également pour le 443 en plus du 80 ?
Deja essaye et ca ne marche pas mieux. Je ne suis pas sur que faire passer une connexion https par un proxy soit une bonne idee, je pense aux probleme d'authentification.
Les plus restrictives sont je pense :
iptables -A FORWARD -p tcp --dport 80 -j MAregle
iptables -A FORWARD -p tcp --dport 443 -j MAregle
car elles ne s'appliquent que pour les connexions deja etablies ou nouvelles mais ne venant pas d'internet.
en fait eth1 est ma connexion a internet et eth0 celle a mon lan.
Quoiqu'il en soit si j'enleve l'une ou l'autre ca ne marche pas mieux.
Ce que je ne comprend pas c'est que ma connexion Internet fonctionne bien donc tout est bon pour le port 80. Et en configurant le port 443 de la meme maniere ca ne marche pas.
Hors ligne
#5 Le 27/11/2009, à 11:39
- _Raum_
Re : iptables : Autoriser https pour un lan
Aaah mais j'ai pas dit que cela marchait mieux hein... j'ai dit que c'était au mieux redondant, au pire inutile...
Si tu veux un truc du genre :
# iptagbles -nvL MAregle
Tu verras si tes règles "matchent" ou pas
Ensuite, revenons en à ton problème.... ehm non d'abord à une inexactitude.
Je ne suis pas sur que faire passer une connexion https par un proxy soit une bonne idee, je pense aux probleme d'authentification.
Tu parles de quelle authentification ? L'https est juste un cryptage, pas une authentification... Ton pécé va émettre une demande de connexion à ton proxy pas en "GET", comme en HTTP, mais en "CONNECT" et le proxy établira une connexion SSL de bout en bout.
L'authentification est toujours réalisée entre le client, ton navigateur, et le serveur distant.
Ensuite, tu n'utilises pas de mangle donc tu peux supprimer toutes les références dans ton script....
Enfin par rapport à ton NAT, ehm, tu peux supprimer la première partie... tu ne définis pas de police par défaut pour le NAT, il ne s'agit pas de filtrage.... vois tu la différence avec les chaînes INPUT, OUTPUT et FORWARD où justement tu définis une police par défaut ? Je pense aussi que tu fais une confusion entre les chaînes OUTPUT / INPUT et la chaîne FORWARD....
En résumé :
iptables -F
iptables -X
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -F
iptables -F -t nat
iptables -F -t mangle
iptables -X
iptables -X -t nat
iptables -X -t mangle
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.1:3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 192.168.10.1:3128
Et tu configures ton proxy pour qu'il accepte les connexions SSL (donc les méthodes CONNECT)
(attention, je suppose que ton architecture ressemble à ça :
[routeur] <--- 192.168.0.1 |PROXY|192.16.10.1 ---> [LAN] )
Dernière modification par _Raum_ (Le 27/11/2009, à 11:47)
Hors ligne
#6 Le 27/11/2009, à 12:16
- Pep31
Re : iptables : Autoriser https pour un lan
Tout d'abord merci de t'interesser a mon probleme.
Il n'y a pas besoin que le client et le serveur soit clairement authentifies pour une connexion https? Alors ok, autant pour moi, je croyais.
Pour les references au mangle je sais que ca ne me sert pas, mais comme ca ne mange pas de pain je l'ai laisse.
Concernant ton script je ne comprend pas comment mes machines vont pouvoir se connecter a mon serveur avec une police input DROP et aucune regle qui accepte quoique ce soit.
Par contre, il est vrai que je n'ai absulument pas configure mon proxy pour qu'il accepte les connexions SSL. Je vais donc voir de ce cote, bien que je ne comprend pas pourquoi ca ne marche pas lorsque je ne redirige pas le port 443 vers le proxy.
Hors ligne
#7 Le 27/11/2009, à 12:44
- NooP
Re : iptables : Autoriser https pour un lan
Bonjour,
Alors, première chose : Les règles iptables sont appliquées dans l'ordre où elle sont trouvées. Ce qui fait que dans
iptables -A FORWARD -p tcp -i eth0 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -i eth0 --dport 443 -j ACCEPT
(..)
iptables -A FORWARD -p tcp --dport 80 -j MAregle
iptables -A FORWARD -p tcp --dport 443 -j MAregle
La seconde partie (MAregle) ne sert à rien, car les paquets seront toujours ACCEPTées par le première.
Ta règle 'FORWARD --dport 80' ne sert à rien non plus, vu que tu passes par ton proxy. Dans ce cas, ton paquet fait un INPUT eth0 80 -> Proxy:3128 -> Output eth1:80
Enfin, dans la doc de squid, tu trouveras qu'un Squid transparent ne sait gérer correctement QUE le HTTP. Si tu veux tout rediriger dans Squid, il faut le configurer en proxy normal (non transparent) et configurer ton navigateur en fonction.
Dernière modification par NooP (Le 27/11/2009, à 12:49)
Votez Macron, vous l'aurez dans le fion !
Hors ligne
#8 Le 27/11/2009, à 13:47
- Pep31
Re : iptables : Autoriser https pour un lan
La seconde partie (MAregle) ne sert à rien, car les paquets seront toujours ACCEPTées par le première.
Effectivement, je ne m'en étais pas aperçu, j'ai donc supprimer la première partie.
Mais, n'y a t il pas un moyen de rediriger ce qui passe par le port 80 vers le proxy et laisser un accès direct pour ce qui passe par le port 443? C'est en fait ce que j'essaye de faire à la base.
Hors ligne
#9 Le 27/11/2009, à 14:56
- NooP
Re : iptables : Autoriser https pour un lan
Je pense que ton soucis vient du fait que tu fasses ton NAT après toutes tes autres règles. Je le fais toujours en premier.
Tiens, je poste ici un script que j'ai développé pour faire un 'firewall' avec iptables.
Je te laisse regarder dedans.
#!/bin/bash
#########################################################
# Script iptables pour un firewall a deux interfaces #
# #
# Les variables de ce script, que vous devez configurer #
# pour correspondre a votre systeme sont : #
# #
# NETIF, LANIF et SSH #
# #
# D'autres regles sont définies dans le script mais #
# desactivees par defaut. #
#########################################################
#
# Definition des interfaces
#
# Internet
NETIF="eth0"
# Reseau local
LANIF="eth1"
#
# Acces SSH *toujours* autorise depuis cette ip
#
SSH="192.168.0.1"
#
# Calcul des differentes valeurs dont le script a besoin
#
LANG="C"
function calcsubnet {
# Calcul de l'adresse du reseau
ip=$1
nm=$2
ip4="${ip##*.}" ; x="${ip%.*}"
ip3="${x##*.}" ; x="${x%.*}"
ip2="${x##*.}" ; x="${x%.*}"
ip1="${x##*.}"
nm4="${nm##*.}" ; x="${nm%.*}"
nm3="${x##*.}" ; x="${x%.*}"
nm2="${x##*.}" ; x="${x%.*}"
nm1="${x##*.}"
let sn1="$ip1&$nm1"
let sn2="$ip2&$nm2"
let sn3="$ip3&$nm3"
let sn4="$ip1&$nm4"
subnet=$sn1.$sn2.$sn3.$sn4
echo $subnet
}
#
# Extraction des adresses IP
#
NETIP=`ifconfig ${NETIF} | grep "inet addr" | awk '{print $2}' | sed 's/addr://'`
NETMK=`ifconfig ${NETIF} | grep "inet addr" | awk '{print $4}' | sed 's/Mask://'`
NETSN=`calcsubnet ${NETIP} ${NETMK}`
LANIP=`ifconfig ${LANIF} | grep "inet addr" | awk '{print $2}' | sed 's/addr://'`
LANMK=`ifconfig ${LANIF} | grep "inet addr" | awk '{print $4}' | sed 's/Mask://'`
LANSN=`calcsubnet ${LANIP} ${LANMK}`
#
# Affichage des parametres
#
echo "[Firewall] Enumeration des parametres"
echo ""
echo " Internet :"
echo " Interface : ${NETIF}"
echo " Ip : ${NETIP}"
echo " Subnet : ${NETSN}"
echo " Mask : ${NETMK}"
echo ""
echo " Reseau :"
echo " Interface : ${LANIF}"
echo " Ip : ${LANIP}"
echo " Subnet : ${LANSN}"
echo " Mask : ${LANMK}"
echo ""
echo " Adresse d'administration SSH :"
echo " Ip : ${SSH}"
echo ""
echo "--------------------------------------"
echo ""
#
# Autorise le forwarding des paquets
#
echo "[Firewall] Activation du forwarding dans le noyau"
echo 1 > /proc/sys/net/ipv4/ip_forward
# Initialisation de la table FILTER
echo "[Firewall] Nettoyage de la table FILTER"
iptables -t filter -F
iptables -t filter -X
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -P FORWARD DROP
# Initialisation de la table NAT
echo "[Firewall] Nettoyage de la table NAT"
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
# Initialisation de la table MANGLE
echo "[Firewall] Nettoyage de la table MANGLE"
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
# Log paquets acceptes
echo "[Firewall] Creation des regles pour logguer les paquets ACCEPTES"
iptables -N INPACCP
iptables -A INPACCP -j LOG --log-prefix "[INPUT_ACCEPT ] "
iptables -A INPACCP -j ACCEPT
iptables -N FWDACCP
iptables -A FWDACCP -j LOG --log-prefix "[FORWARD_ACCEPT] "
iptables -A FWDACCP -j ACCEPT
iptables -N OUTACCP
iptables -A OUTACCP -j LOG --log-prefix "[OUTPUT_ACCEPT ] "
iptables -A OUTACCP -j ACCEPT
# Log paquets refuses
echo "[Firewall] Creation des regles pour logguer les paquets DROPPES"
iptables -N INPDROP
iptables -A INPDROP -j LOG --log-prefix "[INPUT_DROP ] "
iptables -A INPDROP -j DROP
iptables -N FWDDROP
iptables -A FWDDROP -j LOG --log-prefix "[FORWARD_DROP ] "
iptables -A FWDDROP -j DROP
iptables -N OUTDROP
iptables -A OUTDROP -j LOG --log-prefix "[OUTPUT_DROP ] "
iptables -A OUTDROP -j DROP
# Initialisation de la boucle locale
echo "[Firewall] Configuration de la boucle locale (lo)"
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Accepte les connection relatives et etablies
echo "[Firewall] Configuration des connexions RELATIVES et ETABLIES"
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
# NAT Reseau
echo "[Firewall] Configuration de la translation d'adresses (NAT) vers (${NETIP})"
iptables -t nat -A POSTROUTING -o ${NETIF} -s ${LANSN}/${LANMK} -j SNAT --to-source ${NETIP}
# Redirection pour proxy transparent
#echo "[Firewall] Configuration du proxy transparent"
#iptables -t nat -A PREROUTING -i ${LANIF} -p tcp --dport 80 -j REDIRECT --to-port 3128
# Autorise les connexions sortantes du serveur
echo "[Firewall] Autorisation des paquets sortants"
iptables -A OUTPUT -m state --state NEW -j OUTACCP
# Autorise les connexions SSH de partout
#echo "[Firewall] Autorisation globale du SSH"
#iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j INPACCP
# Autorise les connexions SSH depuis le reseau local
echo "[Firewall] Autorisation du SSH depuis le reseau local (${LANIF}, ${LANSN}/${LANMK})"
iptables -A INPUT -i ${LANIF} -s ${LANSN}/${LANMK} -p tcp --dport 22 -m state --state NEW -j INPACCP
# Autorise les connexions SSH depuis l'hote specifie (Machine d'administration)
echo "[Firewall] Autorisation du SSH depuis la machine d'administration (${NETIF}, ${SSH})"
iptables -A INPUT -i ${NETIF} -s ${SSH} -p tcp --dport 22 -m state --state NEW -j INPACCP
# Autorisation des nouvelles connexions
echo "[Firewall] Autorisation des paquets entrants depuis le reseau local (${LANIF}, ${LANSN}/${LANMK})"
iptables -A INPUT -i ${LANIF} -s ${LANSN}/${LANMK} -m state --state NEW -j INPACCP
# Log des connexions refusees en FORWARD
#echo "[Firewall] Bloquage des protocoles devant passer par le proxy"
#iptables -A FORWARD -i ${LANIF} -p tcp --dport 21 -j FWDDROP # FTP
#iptables -A FORWARD -i ${LANIF} -p tcp --dport 80 -j FWDDROP # HTTP
#iptables -A FORWARD -i ${LANIF} -p tcp --dport 443 -j FWDDROP # HTTPS
# Autorise le forwarding de eth1 vers eth0
echo "[Firewall] Autorisation du forwarding depuis le reseau local (${LANIF}, ${LANSN}/${LANMK}) vers l'internet (${NETIF})"
iptables -A FORWARD -i ${LANIF} -s ${LANSN}/${LANMK} -o ${NETIF} -m state --state NEW -j FWDACCP
# Log des connexions refusees en INPUT
echo "[Firewall] Log et bloquage de tout le reste"
iptables -A INPUT -j INPDROP
iptables -A FORWARD -j FWDDROP
iptables -A OUTPUT -j OUTDROP
echo ""
Dernière modification par NooP (Le 27/11/2009, à 16:08)
Votez Macron, vous l'aurez dans le fion !
Hors ligne
#10 Le 27/11/2009, à 15:58
- Pep31
Re : iptables : Autoriser https pour un lan
Merci pour ce fichier, je vais essayer de l'étudier et voir si j'arrive à résoudre mon problème.
Hors ligne
#11 Le 27/11/2009, à 16:22
- NooP
Re : iptables : Autoriser https pour un lan
Dans le NAT, j'avais mis en dur l'interface de sortie (-o eth0)
# NAT Reseau
echo "[Firewall] Configuration de la translation d'adresses (NAT) vers (${NETIP})"
iptables -t nat -A POSTROUTING -o eth0 -s ${LANSN}/${LANMK} -j SNAT --to-source ${NETIP}
Hors, il faudrait le modifier pour qu'il utilise la variable.
# NAT Reseau
echo "[Firewall] Configuration de la translation d'adresses (NAT) vers (${NETIP})"
iptables -t nat -A POSTROUTING -o ${NETIF} -s ${LANSN}/${LANMK} -j SNAT --to-source ${NETIP}
PS : J'ai corrigé dans mon post précédent.
Dernière modification par NooP (Le 27/11/2009, à 16:23)
Votez Macron, vous l'aurez dans le fion !
Hors ligne
#12 Le 27/11/2009, à 16:32
- Pep31
Re : iptables : Autoriser https pour un lan
OK.
Par contre, juste une question sur ton script. Histoire de m'aider à bien comprendre.
Est ce qu'en l'utilisant tu as accès aux sites en https?
En considerant que
#iptables -A FORWARD -i ${LANIF} -p tcp --dport 443 -j FWDDROP # HTTPS
reste en commentaire.
Hors ligne
#13 Le 27/11/2009, à 16:34
- NooP
Re : iptables : Autoriser https pour un lan
Oui, tu dois avoir tous les accès.
Les 3 lignes (HTTP, HTTPS et FTP) qui sont désactivées (#) ne servent qu'a empêcher ces trois protocoles de passer directement, dans le cas où tu veuilles forcer l'utilisation du proxy.
En gros, tout fonctionne directement (Sans configurer de proxy dans le navigateur). Mais si tu veux que tes utilisateurs soient obligés de passer par le proxy, ces 3 lignes bloquent les protocoles courrants (Pas de FORWARD pour ces 3 là)
Si tu as des questions sur son fonctionnement, hésites pas.
Dernière modification par NooP (Le 27/11/2009, à 16:37)
Votez Macron, vous l'aurez dans le fion !
Hors ligne
#14 Le 27/11/2009, à 16:41
- Pep31
Re : iptables : Autoriser https pour un lan
Et donc, si j'active
#iptables -t nat -A PREROUTING -i ${LANIF} -p tcp --dport 80 -j REDIRECT --to-port 3128
et
#iptables -A FORWARD -i ${LANIF} -p tcp --dport 80 -j FWDDROP # HTTP
je dois pouvoir forcer les utilisateurs à utiliser le proxy pour le http et laisser l'accès direct pour le https.
Je me trompe?
Hors ligne
#15 Le 27/11/2009, à 16:54
- NooP
Re : iptables : Autoriser https pour un lan
Si tu actives le proxy transparent, pas besoin d'activer le 'FWDDROP' sur le port 80, étant donné que le port 80 sera déja et obligatoirement redirigé dans le proxy (Port 3128)
Les 3 règles 'FWDDROP HTTP, HTTPS et FTP' ne sont que pour forcer le passage par un proxy NON transparent (Donc forcer de configurer le proxy dans le navigateur, sinon pas d'accès au HTTP, HTTPS et FTP).
Dernière modification par NooP (Le 27/11/2009, à 16:58)
Votez Macron, vous l'aurez dans le fion !
Hors ligne
#16 Le 27/11/2009, à 16:57
- Pep31
Re : iptables : Autoriser https pour un lan
Ok, j'ai compris. Merci beaucoup pour toutes ces explications et le temps consacré.
Hors ligne
#17 Le 23/11/2015, à 23:32
- Totof08170
Re : iptables : Autoriser https pour un lan
Salut tout le monde,
Je penses que j'arrive super en retard vu la date de ce topic, m'enfin qui ne tente rien à rien.
Je suis en train de regarder ton script @NooP et je me pose une question.
Au niveau du forward entre eth0 et eth1, tout passe avec :
# NAT Reseau
echo "[Firewall] Configuration de la translation d'adresses (NAT) vers (${NETIP})"
iptables -t nat -A POSTROUTING -o ${NETIF} -s ${LANSN}/${LANMK} -j SNAT --to-source ${NETIP}
Si par exemple, on ne veux rien laisser passer autre que le HTTP/HTTPS ?
En faite j'aimerais bien faire un nat, mais ne laisser passer uniquement les protocoles que je veux et bloquer tous les autres. Je pensais à quelque chose du style :
# Autorise le forwarding de eth1 vers eth0
echo "[Firewall] Autorisation du forwarding depuis le reseau local (${LANIF}, ${LANSN}/${LANMK}) vers l'internet (${NETIF})"
iptables -A FORWARD -i ${LANIF} -s ${LANSN}/${LANMK} -o ${NETIF} -p tcp --dport 80-m state --state NEW -j FWDACCP
iptables -A FORWARD -i ${LANIF} -s ${LANSN}/${LANMK} -o ${NETIF} -p tcp --dport 443-m state --state NEW -j FWDACCP
Mais visiblement ce n'est pas ça ^^
Si quelqu'un aurait une idée
Hors ligne