# [iptables] Squid et iptables

## zerros

Bonjour,

Je suis en train de mettre en place un proxy squid, et je bloque sur le côté iptables.

Ajourd'hui tout focntionne bien, mais j'ai un énorme trou de sécurité côté lan squid.

Mon archi: 2 cartes réseaux, une dans le réseau de la free** et l'autre dans le réseau squid.

Le routage entre les deux cartes en passant par la redirection http/s vers le squid fonctionne bien.

Mais si un pc est connecté dans le réseau squid et qu'il tente une connexion ssh sur l'ip de sa passerelle (donc le serveur squid),

sa tentative est un succès même s'il n'a pas les identifiant de connexion.

Ce que je voudrai, c'est bloquer tous les ports en entrée de la carte réseau squid sauf le http/s et le dns.

Si je modifie la règle

```
iptables -A INPUT -i $RISKS_IFACE -j ACCEPT
```

par

```
iptables -A INPUT -i $RISKS_IFACE -p tcp --dport 53 -j ACCEPT

iptables -A INPUT -i $RISKS_IFACE -p udp --dport 53 -j ACCEPT

iptables -A INPUT -i $RISKS_IFACE -p tcp --dport 80 -j ACCEPT

iptables -A INPUT -i $RISKS_IFACE -p tcp --dport 443 -j ACCEPT
```

Et bien plus de net sur les machines clientes.

Détails:

SECURE_IFACE => interface dans lan connecté à internet

RISKS_IFACE => interface dans le lan derrière le squid

SQUID_SECURE_SERVER => ip du squid dans le lan connecté à internet

SQUID_RISKS_SERVER => ip du squid dans le lan derrière le squid

Voilà mon iptables:

```
#!/bin/sh

# Variables

SQUID_SECURE_SERVER="192.168.2.43"      # serveur Squid connecté au réseau sécurisé

SQUID_RISKS_SERVER="192.168.1.2"        # serveur Squid au réseau à risques

SQUID_PORT="3128"                       # port du serveur squid

SECURE_LAN="192.168.2.0/24"             # LAN sécurisé

RISKS_LAN="192.168.1.0/24"              # LAN à risques

SECURE_IFACE="eth0"                     # interface connecté à internet

RISKS_IFACE="eth1"                      # interface connecté au réseau à risques

# Modules

/sbin/modprobe ip_conntrack

# Sysctl

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

#################################################

# Vider les tables actuelles

#################################################

iptables -F

iptables -X

iptables -t nat -F

iptables -t nat -X

iptables -t mangle -F

iptables -t mangle -X

#################################################

# default policy : DROP

#################################################

iptables -P INPUT DROP

iptables -P OUTPUT DROP

#iptables -N LOGDROP

#iptables -A LOGDROP -j LOG

#iptables -A LOGDROP -j DROP

#################################################

# accepte tout ce qui concerne l'interface loopback

#################################################

iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

#################################################

# on accepte les paquets relatifs aux connexions deja ouvertes

#################################################

# eth0

iptables -A INPUT -i $SECURE_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -o $SECURE_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT

# eth1

iptables -A INPUT -i $RISKS_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -o $RISKS_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT

#################################################

# on accepte les requetes icmp

#################################################

# eth0

iptables -A INPUT -i $SECURE_IFACE -p icmp -s $SECURE_LAN -d $SQUID_SECURE_SERVER --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

iptables -A INPUT -i $SECURE_IFACE -p icmp -s $SECURE_LAN -d $SQUID_SECURE_SERVER --icmp-type echo-request -j ACCEPT

# eth1

iptables -A INPUT -i $RISKS_IFACE -p icmp -s $RISKS_LAN -d $SQUID_RISKS_SERVER --icmp-type echo-request -j DROP

#################################################

# SSH

#################################################

# eth0

iptables -A INPUT -i $SECURE_IFACE -p tcp -s $SECURE_LAN -d $SQUID_SECURE_SERVER --dport 22 -j ACCEPT

#################################################

# DNS

#################################################

# iptables -A INPUT -i $RISKS_IFACE -p udp -s $RISKS_LAN --dport 53 -j ACCEPT

#################################################

# Routage

#################################################

iptables --table nat --append POSTROUTING -o $SECURE_IFACE -j MASQUERADE

#iptables -A FORWARD -i $RISKS_IFACE -j ACCEPT

iptables -A FORWARD --in-interface $RISKS_IFACE -j ACCEPT

iptables -A INPUT -i $RISKS_IFACE -j ACCEPT # <<<<<<<-------------------------------------- TOUT EST OUVERT !!!!!

iptables -t nat -A PREROUTING -i $RISKS_IFACE -p tcp --dport 80 -j DNAT --to $SQUID_SECURE_SERVER:$SQUID_PORT

iptables -t nat -A PREROUTING -i $SECURE_IFACE -p tcp --dport 80 -j REDIRECT --to-port $SQUID_PORT

#################################################

# on accepte ce qui sort vers l'exterieur

#################################################

# eth0

iptables -A OUTPUT -o $SECURE_IFACE -j ACCEPT

# eth1

iptables -A OUTPUT -o $RISKS_IFACE -j ACCEPT

#################################################

# LOG et DROP tout le reste

#################################################

iptables -A INPUT -j LOG

iptables -A INPUT -j DROP
```

Vous auriez une super idée ?

----------

## d2_racing

Je suis pas expert, mais il me semble que tu devrais ajouter des clauses forward, car si mon souvenir est bon, la clause output sert seulement si c'est vraiment cette interface qui initie un paquet...donc dans ton cas, ça sert de passerelle, d'où la raison d'utiliser la clause forward.

----------

## guilc

Visiblement non, si je comprends bien le but, c'est pas de forward (pas d'accès direct du lan vers l'extérieur, pas de nat, pas de masquerade, rien de tout ça), et sortie seulement par le proxy squid pour le web.

Du coup, les machines du LAN n'ont besoin que de se connecter au proxy et de faire du DNS.

La je vois pas dans les règles ce qui coince, mais lire les iptables de quelqu'un d'autre, c'est jamais évident. Ce qui serait bien, c'est de voir un petit tcpdump lors d'une requête web qui coince, voir quels paquets arrivent et partent. Et aussi, comment sont configurés les navigateurs ? proxy transparent uniquement ou configuration explicite ?

[EDIT]

D'ailleurs, si comme je l'ai compris la gateway et le proxy sont sur la même machine, la règle pour le redirect vers le squid transparent a un souci (pourquoi DNAT ici squid écoute bien sur les 2 interfaces non ?) :

```
iptables -t nat -A PREROUTING -i $RISKS_IFACE -p tcp --dport 80 -j DNAT --to $SQUID_SECURE_SERVER:$SQUID_PORT
```

devient :

```
iptables -t nat -A PREROUTING -i $RISKS_IFACE -p tcp --dport 80 -j REDIRECT --to-port $SQUID_PORT
```

ou mieux (pour éviter de pourrir le port 80 de la gateway) :

```
iptables -t nat -A PREROUTING -i $RISKS_IFACE -p tcp --dport 80 ! -d {SQUID_RISKS_SERVER} -j REDIRECT --to-port $SQUID_PORT
```

ou :

```
iptables -t nat -A PREROUTING -i $RISKS_IFACE -p tcp --dport 80 ! -d {RISKS_LAN} -j REDIRECT --to-port $SQUID_PORT
```

[EDIT2]

Je viens de repenser à l'histoire du forward... Tu as bien un DNS sur la gateway ? les clients sont bien configurés pour l'utiliser ? Sinon si tu utilises des DNS externe, il manque effectivement une règle de forward !

----------

