Proxy transparent sur Openwrt
Par Thus0, samedi 28 janvier 2006 à 01:16 :: Wi-Fi ::#96
Tutorial , How-To, HowTo ...
Ce tutorial vous indique comment installer un proxy transparent (tinyproxy) sur un routeur Linksys WRT54G utilisant le firmware openwrt. Le proxy transparent intercepte le traffic web HTTP (port 80) et garde une trace du traffic utilisateur ; ceci permet d’éviter les abus... ou plutôt de retrouver des traces en cas d’abus. En raison des faibles capacités de stockage sur le routeur WRT54G, les logs sont centralisés sur un serveur syslog distant (syslog-ng) couplé à une base MySQL (installés sur un serveur GNU/Linux tournant sous Debian). Enfin, une interface web (php-syslog-ng) permet de consulter et faire des requêtes sur les archives des logs.
Sur le WRT54G (version WhiteRussian >=RC3)
Installer les packages nécessaires :
# ipkg install http://openwrt.alphacore.net/tinyproxy_1.6.3_mipsel.ipkSi vous n’avez pas le module ipt_REDIRECT (vous pouvez tester en tapant la commande : # insmod ipt_REDIRECT), installez-le :
# ipkg update
# ipkg install iptables-mod-nat
Modifier le fichier /etc/tinyproxy/tinyproxy.conf :
[...]
User root
Group root
[...]
Port 8888
[...]
#Listen 192.168.0.1
#Listen 127.0.0.1
[...]
#Logfile "/var/log/tinyproxy.log"
Syslog On
[...]
LogLevel Connect
[...]
#Allow 127.0.0.1
#Allow 192.168.0.0/25
[...]
Modifier le fichier de règles iptables /etc/firewall.user ou /etc/init.d/S45firewall :
iptables -A INPUT -i $WIFIDEV -p tcp -m tcp --dport 8888 --syn -j ACCEPT
iptables -t nat -A PREROUTING -i $WIFIDEV -s $WIFINET/$WIFIPRE -p tcp -m tcp --dport 80 -j REDIRECT --to-port 8888
Charger automatiquement le modules ipt_REDIRECT :
Créer un nouveau fichier /etc/modules.d/20-iptables-redirect contenant la ligne suivante :
ipt_REDIRECTRq1 : pour créer rapidement le fichier suivante, vous pouvez taper la commande :
# echo "ipt_REDIRECT" > /etc/modules.d/20-iptables-redirectRq2 : si vous n’avez pas de répertoire /etc/modules.d/, il vous faudra créer un script de démarrage pour charger le module ipt_REDIRECT, par exemple dans /etc/init.d/S45firewall ou /etc/init.d/S51tinyproxy, et rajouter la ligne :
insmod ipt_REDIRECT
Indiquer l’adresse du serveur syslog distant (par exemple 192.168.0.100) :
# nvram set log_ipaddr=192.168.0.100
# nvram commit
# rebootRq1 : la variable nvram log_ipaddr est utilisée par le script de démarrage /etc/init.d/rc à partir de WhiteRussian RC3
Rq2 : le traffic syslog est en UDP sur le port 514 : mettez à jour vos règles de firewall au besoin.
Rq3 : sur le firmware freifunk ne prenant pas en charge la variable log_ipaddr (à la date de cet article), il faut modifier le script /etc/init.d/S10boot :
# rm /etc/init.d/S10boot
# cp /rom/etc/init.d/S10boot /etc/init.d/S10bootModifier le fichier :
test -e /sbin/syslogd && syslogd -C 16 -R $(nvram get log_ipaddr)
Démarrer tinyproxy (en mode transparent) :
Après le reboot précédent, si tinyproxy n’a pas démarré automatiquement, lancez-le manuellement :
# /etc/init.d/S51tinyproxy startSur le serveur central GNU/Linux
Installer le serveur syslog-ng et la base de données MySQL :
# apt-get install syslog-ng
# apt-get install mysql-server mysql-client
Configurer MySQL
$ echo "create database syslog;" | mysql -u root -p
$ echo "grant all on syslog.* to syslog_user@'localhost' identified by 'motdepasse_syslog'; flush privileges;" | mysql -u root -p
$ echo "create table logs (
host varchar(32) default NULL,
facility varchar(10) default NULL,
priority varchar(10) default NULL,
level varchar(10) default NULL,
tag varchar(10) default NULL,
date date default NULL,
time time default NULL,
program varchar(15) default NULL,
msg text,
seq int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (seq),
KEY host (host),
KEY seq (seq),
KEY program (program),
KEY time (time),
KEY date (date),
KEY priority (priority),
KEY facility (facility)
) TYPE=MyISAM;" | mysql -u root -p syslog
Configurer syslog-ng :
Rajouter les lignes suivantes dans le fichier /etc/syslog-ng/syslog-ng.conf :
source s_network {
udp();
};
destination dp_mysql {
pipe("/tmp/mysql.pipe" template ("INSERT INTO \
logs(host, facility, priority, level, tag, date, time, program, msg) \
VALUES ('$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', \
'$TAG', '$YEAR-$MONTH-$DAY', '$HOUR:$MIN:$SEC', \
'$PROGRAM', '$MSG');\n") template-escape(yes) );
file("/var/log/hosts/$YEAR.$MONTH/$HOST/tinyproxy.log" owner(root) group(adm) \
perm(0600) dir_perm(0700) create_dirs(yes));
};
filter f_tinyproxy { program(tinyproxy); };
filter f_messages {
level(info, notice, warn)
and not facility(auth,authpriv,cron,daemon,mail,news)
and not program(tinyproxy);
};
log {
source(s_network);
filter(f_tinyproxy);
destination(dp_mysql);
};
Créer une fifo pour les communications entre syslog-ng et mysql :
# mkfifo /tmp/mysql.pipe
Créer un script pour injecter les logs dans la base MySQL :
Créer le script /etc/syslog-ng/syslog-ng-mysql.sh :
#!/bin/bash
#
# script to pipe syslog-ng to mysql
#
if [ ! -e /tmp/mysql.pipe ]; then
mkfifo /tmp/mysql.pipe
fi
while [ -e /tmp/mysql.pipe ]
do
if [ ! -e /var/run/syslog-ng.pid ] ; then
exit 1;
fi
mysql -u syslog_user --password=motdepasse_syslog syslog < /tmp/mysql.pipe
donepuis changer les droits d’execution
# chmod u+x /etc/syslog-ng/syslog-ng-mysql.sh
Créer un script de démarrage pour lancer automatiquement le précédent script syslog-ng-mysql.sh :
Créer le fichier /etc/init.d/syslog-ng-mysql :
#! /bin/sh
#
PATH=/sbin:/bin:/usr/sbin:/usr/bin
test -f /etc/syslog-ng/syslog-ng-mysql.sh || exit 0
#we source /etc/default/syslog-ng if exists
[ -r /etc/default/syslog-ng ] && . /etc/default/syslog-ng
# stop syslog-ng-mysql.sh before changing its PID file!
PIDFILE="/var/run/syslog-ng-mysql.pid"
SYSLOGNGMYSQL="/etc/syslog-ng/syslog-ng-mysql.sh"
NAME="syslog-ng-mysql"
syslogngmysql_start() {
echo -n "Starting system logging: $NAME"
$SYSLOGNGMYSQL &
PID=$!
echo "."
rm -f "$PIDFILE"
echo $PID > $PIDFILE
return 0
}
syslogngmysql_stop() {
echo -n "Stopping system logging: $NAME"
killall syslog-ng-mysql.sh
echo "."
rm -f "$PIDFILE"
return 0
}
case "$1" in
start)
syslogngmysql_start || exit 1
;;
stop)
syslogngmysql_stop || exit 1
;;
*)
echo "Usage: /etc/init.d/$NAME {start|stop}" >&2
exit 1
;;
esac
exit 0puis changer les droits d’execution et rajouter le script au démarrage du système
# chmod u+x /etc/init.d/syslog-ng-mysql
# update-rc.d syslog-ng-mysql defaults
Relancer le serveur syslog-ng et le script syslog-ng-mysql
# /etc/init.d/syslog-ng restart
# /etc/init.d/syslog-ng-mysql start
Installer php-syslog-ng
... à compléter ...
# tar -xvzf php-syslog-ng-2.5.1.tar.gz -C /usr/localModifier le fichier /etc/apache2/sites-available/ssl.conf :
Alias /php-syslog-ng/ "/usr/local/php-syslog-ng-2.5.1/web/"
<Directory /usr/local/php-syslog-ng-2.5.1/web/>
AllowOverride All
</Directory>et relancer apache2
# /etc/init.d/apache2 restartDans le répertoire /usr/local/php-syslog-ng-2.5.1/web/, modifier le fichier includes/db_fns.php :
$result = mysql_pconnect("localhost", "syslog_user", "motdepasse_syslog");Dans le répertoire /usr/local/php-syslog-ng-2.5.1/web/, modifier les fichiers cache_index.php, index.php, results.php, includes/header_inc.php en remplaçant les lignes :
include $_SERVER['DOCUMENT_ROOT'].'/includes/XXX.php';par :
include './includes/XXX.php';De même, dans le fichier includes/header_inc.php, remplacer les chaines de caractères "/includes" par "./includes"
Utilisation
- Les logs sont classés par année et mois dans le répertoire /var/log/hosts/$ANNEE.$MOIS/$HOST/tinyproxy.log
- L’interface web pour consulter les logs est accessible à l’adresse : https://adresse_ip/php-syslog-ng/

- php-syslog-ng
Documentation
openwrt + tinyproxy :
- http://forum.openwrt.org/viewtopic.php?id=1370
- http://forum.openwrt.org/viewtopic.php?id=2069
- http://forum.openwrt.org/viewtopic.php?id=3873
syslog-ng :
php-syslog-ng
- http://www.supinfo-projects.com/fr/2005/syslogng_2005/
- http://gentoo-wiki.com/HOWTO_setup_PHP-Syslog-NG
- http://www.technicalarticles.org/article.php?article_id=36
Commentaires
Dans le fichier /etc/init.d/S45firewall, ou met-on la règle ?
Merci d’avance,
Bonjour, Etes vous certain qu’en cas de controle que les logs fournis par tinyproxy et syslog sastisferont les controleurs. Avez-vous eu un cas concret ou est ce que vous les avez fait validés par un avocat( pas fiable à 100%). Le mieux serait une validation officielle par le ministere de l’interieur ou des telecoms. Par contre vous etes un des premiers à ce soucier de cette loi, j’ai demandé des éclairessissements sur le forum de zone cd le 12 avril 2006 resté sans response http://www.publicip.net/phpBB2/view... pourtant utilisé par la communauté Montpellier Wireless. Finallement avec l’aide d’utilisateur de zone cd j’ai integré SARG mais la config de ce produit fait que tous les utilisateurs connectés passent pour SARG pour le même utilisateur avec l’adresse 127.0.0.1, voici la manip pas satisfaisante(http://www.publicip.net/phpBB2/view...)
Cordialement.
Fabien.
Je ne pense pas que cela soit suffisant pour respecter la loi... Est-ce-que dans les logs on a l’adresse IP de la personnes connecter ou c’est celle du routeur ? J’ai installer un proxy sur mon PC, mais c’est l’adresse du routeur qui apparaît dans les logs. Est-ce la même chose si le proxy est installé directement sur le WRT ? Il faudrai des logs comme pour le QuickSpot de la la société Wave-Storm. Dommage que ce firmware n’est pas libre (violation de la licence GPL ?) et est réservé au utilisateur de Windows.
Il y a plus simple pour avoir les logs que d’installer un proxy, c’est d’utiliser la fonction LOG (ou ULOG) d’iptables :
iptables -I FORWARD -i tun0 -m state —state NEW -j LOG —log-prefix="LOG ACCEPT : "
Et en plus on a tout les logs pas seulement http, mais aussi https, pop3...