Kanet + Squid

Kanet + Squid

Le serveur Kanet se comporte comme un routeur et comme un portail captif.

Il bloque le trafic entre le réseau captif et l'extérieur en attendant d'avoir authentifié l'utilisateur avec CAS, par exemple. Pour ceci, il intercepte la première requête http émise par l'utilisateur avec IPtable puis marque le trafic de cet utilisateur afin de l'autoriser une fois que celui-ci est authentifié.

Si l'on souhaite surveiller et filtrer le trafic web de l'utilisateur, il peut être judicieux d'utiliser Squid. Or nous possédons déjà un serveur Squid central (qui écoute sur le port 8080), couplé à SquidGuard sur lequel est défini la politique de filtrage. L'idée est donc de forcer le trafic web sortant du routeur Kanet à passer par ce Squid central.

Les machines du réseau captif, qui sont souvent des PC portables personnels, ne connaissent pas par définition la configuration de réseau de l'établissement. On va donc rediriger leur trafic web vers une instance d'un squid en mode transparent. Ce Squid peut être directement installé sur le serveur Kanet. Dans notre cas, il ne fera rien (ni cache, ni filtrage) que collecter les requêtes http émises par les clients du réseau captif et les rediriger vers le Squid central sur lequel est appliqué la politique de filtrage.

Installation et configuration de Squid

Sur le serveur Kanet :
apt-get install squid3

Puis on déclare :
  • que ce squid a pour parent le squid central : cache.iut-rodez.fr,
  • qu'il accepte les connexions du réseau captif en mode transparent,
  • qu'il ne cache rien.
/etc/squid3/squid.conf

acl manager proto cache_object
acl localhost src 127.0.0.1/32
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32
acl reseau_captif src w.x.y.z/16
acl kanet src a.b.c.d

acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow kanet
cache_peer squid.central.fr parent 8080 0 no-query  proxy-only  no-digest
never_direct allow all

http_access allow reseau_captif
cache deny all


http_access deny all
icp_access deny all
htcp_access deny all
http_port 3128 transparent


#hierarchy_stoplist cgi-bin ?
access_log /var/log/squid3/access.log squid
#refresh_pattern ^ftp:          1440    20%     10080
#refresh_pattern ^gopher:       1440    0%      1440
#refresh_pattern (cgi-bin|\?)   0       0%      0
#refresh_pattern .              0       20%     4320
icp_port 3130
coredump_dir /var/spool/squid3

Modification de la configuration du serveur Kanet

On indique enfin au routeur Kanet de rediriger le trafic web sortant vers le Squid local :

nano /etc/init.d/kanet-rules


#!/bin/sh

IPT="/sbin/iptables"

IP_PRIVATE="ip.kanet.côté.captif"
NTINT="eth1"

test -f $IPT || exit 0

case "$1" in
        start)
    echo -n "Loading kanet firewall's rules: "
    echo 1 > /proc/sys/net/ipv4/ip_forward

    # Flush table
    $IPT -t nat -F
    $IPT -t mangle -F
    $IPT -t filter -F


    $IPT -t mangle -A PREROUTING -i $NTINT -j CONNMARK --restore-mark
    $IPT -t mangle -A PREROUTING -p TCP -i $NTINT -d $IP_PRIVATE -j ACCEPT
    $IPT -t mangle -A PREROUTING -p TCP -i $NTINT -m state --state NEW -j QUEUE



    $IPT -t nat -A PREROUTING -p TCP -i $NTINT -j CONNMARK --save-mark


    # MARK 0xFFFFFFFF = Openacls
    $IPT -t nat -A PREROUTING -p TCP -i $NTINT -m mark --mark 0xFFFFFFFF -j ACCEPT

    # MARK 0xFFFFFFFE = use http-to-https redirection (Not implemented)
    #$IPT -t nat -A PREROUTING -p TCP -i $NTINT -m mark --mark 0xFFFFFFFE -j DNAT --to-destination $IP_PRIVATE

    # MARK 0x0 = unauthenticated - 80 is redirected to authentication page
    $IPT -t nat -A PREROUTING -p TCP --dport 80 -i $NTINT -m mark --mark 0 -j DNAT --to-destination $IP_PRIVATE:8080
    # Le traffic http est ensuite redirigé sur le squid local
    $IPT -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128



    # MARK 0x1 blacklistacls
    $IPT -t filter -A FORWARD -m mark --mark 0x1 -j REJECT

    $IPT -t nat -A POSTROUTING -m mark ! --mark 0 -j MASQUERADE

    echo "Done."
    ;;
  stop)
    echo -n "Flushing kanet firewall's rules: "
        echo 0  > /proc/sys/net/ipv4/ip_forward

    ###########################
    # FLUSH TABLES
    ###########################
    $IPT -t filter -F
    $IPT -t nat -F
    $IPT -t mangle -F
    echo "Done."
    ;;

  status)
    # List tables
    echo
    echo "---------- FILTER TABLE -----------"
    echo
    $IPT -t filter -L -v
    echo
    echo "----------   NAT TABLE  -----------"
    echo
    $IPT -t nat -L -v
    echo
    echo "----------   MANGLE TABLE  -----------"
    echo
    $IPT -t mangle -L -v
    echo
    ;;
        restart|force-reload)
                $0 stop
                $0 start
                echo "Done."
                ;;

        *)
    echo "Usage: /etc/init.d/kanet {start|stop|status|restart}"
    exit 1
    ;;
esac

exit 0

Et on recharge les iptables :
/etc/init.d/kanet-rules stop
/etc/init.d/kanet-rules start

Enfin, on relance Kanet :
/etc/init.d/kanet restart
Comments