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.ipk
Si 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_REDIRECT
Rq1 : pour créer rapidement le fichier suivante, vous pouvez taper la commande :
# echo "ipt_REDIRECT" > /etc/modules.d/20-iptables-redirect
Rq2 : 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
# reboot
Rq1 : 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/S10boot
Modifier 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 start
Sur 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
done
puis 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 0
puis 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/local
Modifier 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 restart
Dans 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
1. vendredi 30 juin 2006 à 14:20,
2. jeudi 28 septembre 2006 à 08:21, par FSInetworks
3. dimanche 1er octobre 2006 à 12:16, par Phil :: WiTou
4. samedi 14 octobre 2006 à 14:44, par Dom
Ajouter un commentaire