Comment investiguer un problème applicatif quand on ne maitrise pas le code source d'une application ou quand on ne l'a tout simplement pas ?
Cette présentation à destination des administrateurs système propose quelques techniques pour faire parler les applications récalcitrantes.
4. Pourquoi faire ?
Parce que les fichiers de logs ne sont pas toujours
suffisants
Parce qu’on a pas toujours de support
Parce que le support n’est pas toujours bon
Pour apporter des éléments objectifs au débat « c’est
la faute au système – réseau / c’est la faute à l’application »
5. 1. Connaître l’ennemi
Qui connait son ennemi […],
en cents combats ne sera point défait.
Sun Tzu – L
’art de la guerre
7. Connaître l’ennemi
Quelques outils utiles
ps: toutes les informations de base sur les processus
lsof: pour connaître tous les échanges avec l’extérieur
(fichiers, réseau, socket, pipe…)
8. Connaître l’ennemi
Quelques outils utiles
ps: toutes les informations de base sur les processus
lsof: pour connaître tous les échanges avec l’extérieur
(fichiers, réseau, socket, pipe…)
netstat: pour connaître toutes les connexions réseaux
en cours et ou en écoute
9. Connaître l’ennemi
Quelques outils utiles
ps: toutes les informations de base sur les processus
lsof: pour connaître tous les échanges avec l’extérieur
(fichiers, réseau, socket, pipe…)
netstat: pour connaître toutes les connexions réseaux
en cours et ou en écoute
top: pour voir la consommation de ressources par le
processus
10. Connaître l’ennemi
Quelques outils utiles
ps: toutes les informations de base sur les processus
lsof: pour connaître tous les échanges avec l’extérieur
(fichiers, réseau, socket, pipe…)
netstat: pour connaître toutes les connexions réseaux
en cours et ou en écoute
top: pour voir la consommation de ressources par le
processus
/proc/PID/…: exhaustif … mais moins lisible
ipcs: tout ce qui concerne la communication
inter-processus (mémoire partagée, file de message…)
11. Connaître l’ennemi
La commande ps
Un commande très connue mais qui reste incontournable
La commande de base pour en savoir plus sur un processus
(%cpu, %mem, status, heure de démarrage…):
ps u -p PID
12. Connaître l’ennemi
La commande ps
Un commande très connue mais qui reste incontournable
La commande de base pour en savoir plus sur un processus
(%cpu, %mem, status, heure de démarrage…):
ps u -p PID
Quelques utilisations moins connues mais utiles:
13. Connaître l’ennemi
La commande ps
Un commande très connue mais qui reste incontournable
La commande de base pour en savoir plus sur un processus
(%cpu, %mem, status, heure de démarrage…):
ps u -p PID
Quelques utilisations moins connues mais utiles:
Connaître les variables d’environnement d’un processus:
ps eww -p PID
14. Connaître l’ennemi
La commande ps
Un commande très connue mais qui reste incontournable
La commande de base pour en savoir plus sur un processus
(%cpu, %mem, status, heure de démarrage…):
ps u -p PID
Quelques utilisations moins connues mais utiles:
Connaître les variables d’environnement d’un processus:
ps eww -p PID
Connaître les groupes additionnels d’un processus:
ps -o supgid -p PID
15. Connaître l’ennemi
La commande ps
Un commande très connue mais qui reste incontournable
La commande de base pour en savoir plus sur un processus
(%cpu, %mem, status, heure de démarrage…):
ps u -p PID
Quelques utilisations moins connues mais utiles:
Connaître les variables d’environnement d’un processus:
ps eww -p PID
Connaître les groupes additionnels d’un processus:
ps -o supgid -p PID
Vue en arbre des processus:
ps auxf
16. Connaître l’ennemi
La commande lsof
Une véritable couteau suisse
Quelques usages classiques:
Connaître les fichiers/sockets ouverts par un processus
lsof -n -p PID
17. Connaître l’ennemi
La commande lsof
Une véritable couteau suisse
Quelques usages classiques:
Connaître les fichiers/sockets ouverts par un processus
lsof -n -p PID
Uniquement les connexions réseau d’un processus
lsof -n -p PID -a -i
18. Connaître l’ennemi
La commande lsof
Une véritable couteau suisse
Quelques usages classiques:
Connaître les fichiers/sockets ouverts par un processus
lsof -n -p PID
Uniquement les connexions réseau d’un processus
lsof -n -p PID -a -i
Exemple de sortie de la commande lsof:
COMMAND
chromium
chromium
chromium
chromium
chromium
chromium
chromium
[…]
PID
3164
3642
3642
3164
3164
3164
3164
USER
yrouillard
yrouillard
yrouillard
yrouillard
yrouillard
yrouillard
yrouillard
FD
0r
1u
2u
68u
51r
84u
74u
TYPE
CHR
REG
REG
REG
FIFO
unix
IPv4
DEVICE
1,3
254,2
254,2
254,2
0,8
0x7280
152346
SIZE/OFF NODE NAME
0t0
2050 /dev/null
21801 786846 /home/yrouillard/.xsession-errors
21801 786846 /home/yrouillard/.xsession-errors
1016832 78869 /home/[…]/Cookies
0t0
17007 pipe
0t0
18484 socket
0t0
TCP atlas.local:34979
->138.102.119.3:https (ESTABLISHED)
31. 2. Epier ses faits et gestes
Espionne tous les gestes de ton adversaire […],
et tu trouveras le meilleur moment pour causer sa
perte.
L
’art du Ninja – Vol. 2
32. Epier ses faits et gestes
Quelques outils utiles
strace: pour connaître tous les appels système
effectués par le processus
un outil clé pour comprendre ce que font les
processus
33. Epier ses faits et gestes
Quelques outils utiles
strace: pour connaître tous les appels système
effectués par le processus
un outil clé pour comprendre ce que font les
processus
ltrace: pour connaître tous les appels à des librairies
effectués par le processus
utile mais demande une connaissance des
librairies utilisées
34. Epier ses faits et gestes
Quelques outils utiles
strace: pour connaître tous les appels système
effectués par le processus
un outil clé pour comprendre ce que font les
processus
ltrace: pour connaître tous les appels à des librairies
effectués par le processus
utile mais demande une connaissance des
librairies utilisées
gdb: le debugger du projet GNU
complexe mais utilisable dans quelques cas
35. Epier ses faits et gestes
L
’outil strace
Un outil très puissant
Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
36. Epier ses faits et gestes
L
’outil strace
Un outil très puissant
Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
strace -f -p PID
37. Epier ses faits et gestes
L
’outil strace
Un outil très puissant
Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
strace -f -p PID
Avoir l’affichage des temps:
strace -tt -f -p PID
38. Epier ses faits et gestes
L
’outil strace
Un outil très puissant
Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
strace -f -p PID
Avoir l’affichage des temps:
strace -tt -f -p PID
Exemple de sortie:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
14:18:38.209716 time(NULL)
= 1317903518
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
39. Epier ses faits et gestes
L
’outil strace
Un outil très puissant
Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
strace -f -p PID
14:18:38.209716 time(NULL)
= 1317903518
Avoir l’affichage des temps:
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) =
0
strace -tt -f -p PID
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Exemple de sortie:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
14:18:38.209716 time(NULL)
= 1317903518
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
40. Epier ses faits et gestes
L
’outil strace
L’heure de l’appel
système
Un outil très puissant
Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
strace -f -p PID
14:18:38.209716 time(NULL)
= 1317903518
Avoir l’affichage des temps:
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) =
0
strace -tt -f -p PID
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Exemple de sortie:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
14:18:38.209716 time(NULL)
= 1317903518
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
41. Epier ses faits et gestes
L
’outil strace
Le nom de l’appel
système
Un outil très puissant
Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
strace -f -p PID
14:18:38.209716 time(NULL)
= 1317903518
Avoir l’affichage des temps:
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) =
0
strace -tt -f -p PID
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Exemple de sortie:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
14:18:38.209716 time(NULL)
= 1317903518
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
42. Epier ses faits et gestes
L
’outil strace
Un outil très
Les arguments
puissant
Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
strace -f -p PID
14:18:38.209716 time(NULL)
= 1317903518
Avoir l’affichage des temps:
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) =
0
strace -tt -f -p PID
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Exemple de sortie:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
14:18:38.209716 time(NULL)
= 1317903518
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
43. Epier ses faits et gestes
L
’outil strace
Un outil très puissant
Le code retour
Afficher tous les appels système dès le démarrage:
strace -f /chemin/vers/executable
Afficher les appels système d’un processus en cours:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
strace -f -p PID
14:18:38.209716 time(NULL)
= 1317903518
Avoir l’affichage des temps:
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) =
0
strace -tt -f -p PID
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
Exemple de sortie:
14:18:36.848746 read(5, "GET /design/es/stylesheets/style"..., 4096) = 581
14:18:38.209716 time(NULL)
= 1317903518
14:18:38.209930 stat64("/srv/ezinstitut/…", {st_mode=S_IFREG|0770, st_size=44431, ...}) = 0
14:18:38.210026 open("/srv/ezinstitut/…", O_RDONLY|O_LARGEFILE) = 8
44. Epier ses faits et gestes
L
’outil strace
Les appels système à connaître pour survivre
stat / lstat: connaître le status d’un fichier
stat("fichier_present", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
stat("fichier_absent", 0x1bab190)
= -1 ENOENT
(No such file or directory)
open / close: ouvrir / fermer un fichier
open("/var/www/toto.inra.fr/.htaccess", O_RDONLY|O_LARGEFILE) = 138
close(138)
read / write: lire / écrire dans un fichier
write(54, "138.102.XX.XX - - [07/Oct/2011:1"..., 348) = 348
read(5, "GET /design/plain/images/accueil"..., 4096) = 626
flock / fcntl (SET_LK): verrouiller ou déverrouiller un fichier
flock(19, LOCK_EX)
= 0
fcntl(4, F_SETLK, {type=F_RDLCK, whence=SEEK_SET, start=0, len=0}) = 0
45. Epier ses faits et gestes
L
’outil strace
poll / select: attendre une activité sur un fichier ou
une connexion réseau
select(34, [26 27 28 29 30 31 32 33], NULL, NULL, NULL) = 1 (in [32])
poll([{fd=6, events=POLLOUT, revents=POLLOUT}], 1, 0) = 1
connect / socket: se connecter à un port réseau
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 6
connect(6, {sa_family=AF_INET, sin_port=htons(53),
sin_addr=inet_addr("138.102.119.226")}, 28) = 0
send / recv / recvfrom: lire et écrire sur le réseau
send(6, "324x100100000020moteur-recherche"..., 42, 0) = 42
recv(6, "HTTP/1.0 200 OKrnConnection: Clo"..., 8192, 0) = 174
execve: exécuter un processus
execve("/bin/ls", ["/bin/ls", "-l"], [/* 40 vars */]) = 0
46. Epier ses faits et gestes
L
’outil strace
La règle la plus importante:
47. Epier ses faits et gestes
L
’outil strace
La règle la plus importante:
Accepter de ne pas tout comprendre
dans la floppée de lignes de strace !!
48. Epier ses faits et gestes
L
’outil gdb
Connaître la pile d’appel d’un processus en cours:
$ gdb –p PID ou gdb core
thread apply all bt
Exemple de sortie:
#0
#1
#2
0x00000035d1acb2af in poll () from /lib64/libc.so.6
0x00000035d522fa3d in ?? () from /lib64/libglib-2.0.so.0
0x00000035d522ff1a in g_main_loop_run () from
/lib64/libglib-2.0.so.0
#3 0x00002b1fc9f695d5 in ?? () from
/usr/lib64/python2.4/site-packages/gtk-2.0/gobject/_gobject.so
#4 0x0000003e81e96167 in PyEval_EvalFrame () from
/usr/lib64/libpython2.4.so.1.0
[…]
#12 0x00000035d1a1d994 in __libc_start_main () from /lib64/libc.so.6
#13 0x0000000000400629 in _start ()
49. Epier ses faits et gestes
La pratique
Cas 1: Mais pourquoi le login dans GLPI est-il lent ?
18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l",
"www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0
[…]
18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT
18:16:29.305480 time(NULL) = 1308154589
[…]
18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS
50. Epier ses faits et gestes
La pratique
Cas 1: Mais pourquoi le login dans GLPI est-il lent ?
18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l",
"www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0
[…]
18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT
18:16:29.305480 time(NULL) = 1308154589
[…]
18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS
GLPI lance un processus
rsh pour se connecter sur
tours.inra.fr ?!
51. Epier ses faits et gestes
La pratique
Cas 1: Mais pourquoi le login dans GLPI est-il lent ?
18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l",
"www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0
[…]
18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT
18:16:29.305480 time(NULL) = 1308154589
[…]
18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS
On a perdu 15 secondes
entre ces deux appels
52. Epier ses faits et gestes
La pratique
Cas 1: Mais pourquoi le login dans GLPI est-il lent ?
18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l",
"www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0
[…]
18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT
18:16:29.305480 time(NULL) = 1308154589
[…]
18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS
On a perdu 15 secondes
entre ces deux appels
A cause d’une tentative de
connexion ssh qui finit en
timeout
(port non ouvert)
53. Epier ses faits et gestes
La pratique
Cas 1: Mais pourquoi le login dans GLPI est-il lent ?
18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l",
"www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0
[…]
18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT
18:16:29.305480 time(NULL) = 1308154589
[…]
18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS
GLPI essaie ensuite de connecter
en imap sur tours.inra.fr
54. Epier ses faits et gestes
La pratique
Cas 1: Mais pourquoi le login dans GLPI est-il lent ?
18:16:14.272226 execve("/usr/bin/rsh", ["/usr/bin/rsh", "tours.inra.fr", "-l",
"www-data", "exec", "/usr/sbin/rimapd"], [/* 8 vars */]) = 0
[…]
18:16:14.309918 socket(PF_INET, SOCK_STREAM, IPPROTO_TCP) = 3
18:16:14.309990 connect(3, {sa_family=AF_INET, sin_port=htons(22),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 ETIMEDOUT
18:16:29.305480 time(NULL) = 1308154589
[…]
18:16:29.321394 connect(23, {sa_family=AF_INET, sin_port=htons(143),
sin_addr=inet_addr("194.167.77.30")}, 16) = -1 EINPROGRESS
glpi exécute des tâches périodiques quand quelqu’un se connecte
La tâche de récupération des tickets mail essayait d’abord de faire
une connexion IMAP par ssh avant de faire une connexion IMAP
standard
55. Epier ses faits et gestes
La pratique
Cas 2: Problème de compilation
Vu
su
foru r le
m
PEP
I
# R CMD INSTALL Rmpi_0.5-9.tar.gz
[…]
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':
libmpi.so.0: cannot open shared object file: No such file or directory
56. Epier ses faits et gestes
La pratique
Cas 2: Problème de compilation
Vu
su
foru r le
m
PEP
I
# R CMD INSTALL Rmpi_0.5-9.tar.gz
[…]
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':
libmpi.so.0: cannot open shared object file: No such file or directory
# ls /usr/local/lib/libmpi.so.0
/usr/local/lib/libmpi.so.0
Pourtant la librairie
est bien là !?
57. Epier ses faits et gestes
La pratique
Cas 2: Problème de compilation
Vu
su
foru r le
m
PEP
I
# R CMD INSTALL Rmpi_0.5-9.tar.gz
[…]
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':
libmpi.so.0: cannot open shared object file: No such file or directory
# ls /usr/local/lib/libmpi.so.0
/usr/local/lib/libmpi.so.0
# strace -f R CMD INSTALL Rmpi_0.5-9.tar.gz 2>&1 | grep libmpi.so
open("/usr/local/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT
open("/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT
open("/usr/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT
[…]
La librairie est recherchée
dans des répertoires /lib64/
58. Epier ses faits et gestes
La pratique
Cas 2: Problème de compilation
Vu
su
foru r le
m
PEP
I
# R CMD INSTALL Rmpi_0.5-9.tar.gz
[…]
Error in dyn.load(file, DLLpath = DLLpath, ...) :
unable to load shared object '/usr/lib64/R/library/Rmpi/libs/Rmpi.so':
libmpi.so.0: cannot open shared object file: No such file or directory
# ls /usr/local/lib/libmpi.so.0
/usr/local/lib/libmpi.so.0
# strace -f R CMD INSTALL Rmpi_0.5-9.tar.gz 2>&1 | grep libmpi.so
open("/usr/local/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT
open("/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT
open("/usr/lib64/libmpi.so.0", O_RDONLY) = -1 ENOENT
[…]
/usr/local/lib/ n’est pas dans le chemin de recherche des
librairies 64 bits !
59. Epier ses faits et gestes
La pratique
Cas 3: Plantage d’un webmail lors de la consultation
# gdb –p PID_Process_Apache ou gdb fichier_core
0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian
1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so
2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so
[…]
13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so
15 0x08074607 in ap_run_handler ()
[…]
23 0x0806224f in main ()
60. Epier ses faits et gestes
La pratique
Cas 3: Plantage d’un webmail lors de la consultation
# gdb –p PID_Process_Apache ou gdb fichier_core
0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian
1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so
2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so
[…]
13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so
15 0x08074607 in ap_run_handler ()
[…]
23 0x0806224f in main ()
Le plantage semble survenir dans
cette librairie
61. Epier ses faits et gestes
La pratique
Cas 3: Plantage d’un webmail lors de la consultation
# gdb –p PID_Process_Apache ou gdb fichier_core
0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian
1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so
2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so
[…]
13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so
15 0x08074607 in ap_run_handler ()
A quel paquet appartient
[…]
cette librairie ?
23 0x0806224f in main ()
# dpkg -S /usr/lib/libc-client.so.2002edebian
libc-client2002edebian: /usr/lib/libc-client.so.2002edebian
62. Epier ses faits et gestes
La pratique
Cas 3: Plantage d’un webmail lors de la consultation
# gdb –p PID_Process_Apache ou gdb fichier_core
0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian
1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so
2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so
[…]
13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so
15 0x08074607 in ap_run_handler ()
Y a-t-il des bugs connus
[…]
pour ce paquet ?
23 0x0806224f in main ()
# dpkg -S /usr/lib/libc-client.so.2002edebian
libc-client2002edebian: /usr/lib/libc-client.so.2002edebian
# Consultation de
http://bugs.debian.org/libc-client2002edebian
63. Epier ses faits et gestes
La pratique
Cas 3: Plantage d’un webmail lors de la consultation
# gdb –p PID_Process_Apache ou gdb fichier_core
0 0xb6b8d25d in mail_search_full () from /usr/lib/libc-client.so.2002edebian
1 0xb6c33c3b in zif_imap_search () from /usr/lib/php5/20060613+lfs/imap.so
2 0xb73ea60f in execute () from /usr/lib/apache2/modules/libphp5.so
[…]
13 0xb7376482 in php_execute_script () from /usr/lib/apache2/modules/libphp5.so
15 0x08074607 in ap_run_handler ()
[…]
23 0x0806224f in main ()
# dpkg -S /usr/lib/libc-client.so.2002edebian
Bin
libc-client2002edebian: /usr/lib/libc-client.so.2002edebian
go
!
# Consultation de
http://bugs.debian.org/libc-client2002edebian
Bug 502996: Segfaults if IMAP server sends more than 30
user flags
66. Intercepter ses
communications
Quelques outils utiles
tcpdump / snoop: outil de capture de bas niveau
Usage classique:
tcpdump -s 0 -w /tmp/capture.cap tcp port Numero_port
wireshark / tshark: pour faire l’analyse des captures
• Un outil très puissant à connaître absolument,
• capable de décoder énormément de protocole réseau
HTTPS, LDAP, ethernet, TCP, UDP, IP, …)
(SQL, HTTP,
67. Intercepter ses
communications
Quelques outils utiles
tcpdump / snoop: outil de capture de bas niveau
Usage classique:
tcpdump -s 0 -w /tmp/capture.cap tcp port Numero_port
wireshark / tshark: pour faire l’analyse des captures
• Un outil très puissant à connaître absolument,
• capable de décoder énormément de protocole réseau
(SQL, HTTP,
HTTPS, LDAP, ethernet, TCP, UDP, IP, …)
l’extension livehttpheaders de Firefox: pour connaître
les échanges HTTP lors de la consultation d’une page
68. Intercepter ses
communications
Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn
Client
+
Syn
Seq =
2,
Ac k
Serveur
Ack
Client
Len =
4, Ack
=
0,
Len =
q = 0,
Se
Seq =
6, Len
Ack =
0
6
Serveur
= 8, A
ck = 0
Traduction en capture tcpdump / wireshark
Traduction en capture tcpdump / wireshark
192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]
209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]
192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK]
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
69. Intercepter ses
communications
Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn
Client
Seq =
2,
Serveur
Client
Len =
4, Ack
=
0,
Len =
q = 0,
Se
Seq =
6, Len
Ack =
0
6
Serveur
= 8, A
ck = 0
Traduction en capture tcpdump / wireshark
Traduction en capture tcpdump / wireshark
192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
70. Intercepter ses
communications
Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn
Client
+
Syn
Seq =
2,
Ac k
Serveur
Client
Len =
4, Ack
=
0,
Len =
q = 0,
Se
Seq =
6, Len
Ack =
0
6
Serveur
= 8, A
ck = 0
Traduction en capture tcpdump / wireshark
Traduction en capture tcpdump / wireshark
192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]
209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
71. Intercepter ses
communications
Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn
Client
+
Syn
Seq =
2,
Ac k
Serveur
Ack
Client
Len =
4, Ack
=
0,
Len =
q = 0,
Se
Seq =
6, Len
Ack =
0
6
Serveur
= 8, A
ck = 0
Traduction en capture tcpdump / wireshark
Traduction en capture tcpdump / wireshark
192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]
209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]
192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK]
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
72. Intercepter ses
communications
Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn
Client
Rst
Seq =
2,
Serveur
Client
Len =
4, Ack
=
0,
Len =
q = 0,
Se
Seq =
6, Len
Ack =
0
6
Serveur
= 8, A
ck = 0
Traduction en capture tcpdump / wireshark
Traduction en capture tcpdump / wireshark
192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]
209.85.148.106 192.168.0.156 TCP 80 > 45261 [RST]
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
73. Intercepter ses
communications
Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn
Client
+
Syn
Seq =
2,
Ac k
Serveur
Ack
Len =
4, Ack
=
Client
0
Serveur
J’ai déjà envoyé 2 octets
Je t’envoie 4 nouveaux
octets
Traduction en capture tcpdump / wireshark
Traduction en capture tcpdump / wireshark
192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]
209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]
192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK]
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
74. Intercepter ses
communications
Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn
Client
+
Syn
Seq =
2,
Ac k
Serveur
Ack
Client
Len =
4, Ack
=
0,
Len =
q = 0,
Se
Ack =
0
6
Serveur
J’ai bien reçu
6 octets en tout
Traduction en capture tcpdump / wireshark
Traduction en capture tcpdump / wireshark
192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]
209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]
192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK]
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6
75. Intercepter ses
communications
Les bases à savoir pour analyser les
flux Acquittement des paquets
Etablissement de la connexion
S yn
Client
+
Syn
Seq =
2,
Ac k
Serveur
Ack
Client
Len =
4, Ack
=
0,
Len =
q = 0,
Se
Seq =
6, Len
Ack =
0
6
Serveur
= 8, A
ck = 0
Tu as bien reçu mes 6 octets
alors je t’en envoie 8 de plus
Traduction en capture tcpdump / wireshark
Traduction en capture tcpdump / wireshark
192.168.0.156 209.85.148.106 TCP 45261 > 80 [SYN]
209.85.148.106 192.168.0.156 TCP 80 > 45261 [SYN, ACK]
192.168.0.156 209.85.148.106 TCP 45261 > 80 [ACK]
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=2 Len=4 Ack=0
209.85.148.106 192.168.0.156 TCP 80 > 6238 Seq=0 Len=0 Ack=6
192.168.0.156 209.85.148.106 TCP 6238 > 80 Seq=6 Len=8 Ack=0
76. Intercepter ses
communications
La pratique
Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325
Capture avant le routeur
53
54
55
56
0.488462
0.586425
5.260831
5.306787
138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170
TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
HTTP HTTP/1.1 200 OK (text/css)
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
77. Intercepter ses
communications
La pratique
Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325
Capture avant le routeur
53
54
55
56
0.488462
0.586425
5.260831
5.306787
138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170
Le serveur envoie
TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
3306 + 395 = 3873 octets
TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
HTTP HTTP/1.1 200 OK (text/css)
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
78. Intercepter ses
communications
La pratique
Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325
Capture avant le routeur
53
54
55
56
0.488462
0.586425
5.260831
5.306787
138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170
Le client accuse réception
TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
de 1846 octets
TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
HTTP HTTP/1.1 200 OK (text/css)
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
79. Intercepter ses
communications
La pratique
Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325
Capture avant le routeur
53
54
55
56
0.488462
0.586425
5.260831
5.306787
138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170
TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
TCP 58683 >Le client accuse réception
http [ACK] Seq=395 Ack=3306 Len=0
HTTP HTTP/1.1 200 de 3306 octets
OK (text/css)
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
80. Intercepter ses
communications
La pratique
Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325
Capture avant le routeur
53
54
55
56
0.488462
0.586425
5.260831
5.306787
138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
Le serveur TCP 58683 > http [ACK]
138.102.70.2 138.102.118.170 attend l’accusé de Seq=395 Ack=3306 Len=0
138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css)
réception de ces 3873 octets…
138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
81. Intercepter ses
communications
La pratique
Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325
Capture avant le routeur
53
54
55
56
0.488462
0.586425
5.260831
5.306787
138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
Pendant 5 secondes !!
138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK (text/css)
138.102.70.2 138.102.118.170 HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
82. Intercepter ses
communications
La pratique
Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325
Capture avant le routeur
53
54
55
56
0.488462
0.586425
5.260831
5.306787
138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170
TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
TCP 58683 >Il décide ensuite Ack=3306 Len=0
http [ACK] Seq=395 de
HTTP HTTP/1.1 200 OK (text/css)
retransmettre le paquet
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
83. Intercepter ses
communications
La pratique
Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325
Capture avant le routeur
53
54
55
56
0.488462
0.586425
5.260831
5.306787
138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170
TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
Il OK (text/css)
HTTP HTTP/1.1 200reçoit bien l’accusé de
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
réception des 3873 octets
cette fois-ci
84. Intercepter ses
communications
La pratique
Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325
Capture avant le routeur
53
54
55
56
0.488462
0.586425
5.260831
5.306787
138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170
Avant le routeur, tout est
identique…
?
TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
HTTP HTTP/1.1 200 OK (text/css)
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
… sauf que le 1er paquet envoyé
au client n’apparait pas !
85. Intercepter ses
communications
La pratique
Cas 1: Lenteur d’accès aléatoire à des sites Web
Capture depuis le serveur web
53 0.487102 138.102.118.170 138.102.70.2 HTTP HTTP/1.1 200 OK Seq=3306 Ack=395, Len=567
54 0.488361 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
55 0.586329 138.102.70.2 138.102.118.170 TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
…
56 5.260048 138.102.118.170 138.102.70.2 TCP [Retransmission] Seq=3306 Ack=395, Len=567
57 5.306327 138.102.70.2 138.102.118.170 HTTP GET /toto HTTP/1.0 Seq=395 Ack=3873, Len=325
Capture avant le routeur
53
54
55
56
0.488462
0.586425
5.260831
5.306787
138.102.70.2 138.102.118.170
138.102.70.2 138.102.118.170
138.102.118.170 138.102.70.2
138.102.70.2 138.102.118.170
TCP 58683 > http [ACK] Seq=395 Ack=1846 Len=0
TCP 58683 > http [ACK] Seq=395 Ack=3306 Len=0
HTTP HTTP/1.1 200 OK (text/css)
HTTP GET /7pc/images/eurosfaire-trans.gif HTTP/1.0
Le paquet était perdu dans le routeur dont il a fallu faire changer la
carte
86. Intercepter ses
communications
La pratique
Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)
87. Intercepter ses
communications
La pratique
Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)
Vers qui sont envoyées
toutes ces requêtes ?
88. Intercepter ses
communications
La pratique
Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)
$ lsof -d 243 -a -p 5937
java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)
89. Intercepter ses
communications
La pratique
Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)
$ lsof -d 243 -a -p 5937
java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)
Il communique avec le
serveur postgres
90. Intercepter ses
communications
La pratique
Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)
$ lsof -d 243 -a -p 5937
java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)
$ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432
On écoute plus précisément ce
qu’ils se disent
91. Intercepter ses
communications
La pratique
Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)
$ lsof -d 243 -a -p 5937
java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)
$ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432
Sous wireshark, on voit toujours la même requête ?!
92. Intercepter ses
communications
La pratique
Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)
$ lsof -d 243 -a -p 5937
java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)
$ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432
$ strings -a | grep "^select" | wc -l
Combien de requêtes SQL ?
8467
$ strings -a | grep "^select" | sort -u | wc -l
1
93. Intercepter ses
communications
La pratique
Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)
$ lsof -d 243 -a -p 5937
java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)
$ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432
$ strings -a /tmp/capture.cap | grep "^select" | wc -l
8467
$ strings -a /tmp/capture.cap | grep "^select" | sort -u | wc -l
1
Combien de requêtes SQL uniques ?
94. Intercepter ses
communications
La pratique
Cas 2: Problème de performance sous tomcat
$ strace -tt -f -e trace='!clock_gettime,futex,gettimeofday' -p 29927
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
send(243, "P002<0select donneesjcr0_.id as i"..., 617, 0) = 617
recv(243, "100000420004T001z0fid4_0_000@2701000"..., 8192, 0) = 487
[…] (en boucle)
$ lsof -d 243 -a -p 5937
java 29927 appli 243u IPv6 247 TCP appserver:60170->pgsql.inra.fr:5432 (ESTABLISHED)
$ tcpdump -s 0 -w /tmp/capture.cap tcp port 5432
$ strings -a /tmp/capture.cap | grep "^select" | wc -l
8467
$ strings -a /tmp/capture.cap | grep "^select" | sort -u | wc -l
1
L’application effectue la même requête sql en boucle !!
98. Connaître son passé
La problématique
Les problèmes n’arrivent pas toujours quand un
administrateur est présent (nuit, week-end…)
Les outils de monitoring classiques (Cacti, Nagios,
Zabbix…) ne permettent pas de faire des diagnostics
précis dans le passé
– aggrégations des données trop rapides,
– peu d’indicateurs détaillées,
– grain pas assez fin (pas de vision par processus ou
utilisateurs…)
Un besoin d’outils adapté pour le diagnostic
99. Connaître son passé
dim_stat, une solution
Pour ceux qui ne peuvent pas s’offrir Sysload, Patrol…
Un outil gratuit (mais pas réellement open-source)
Librement téléchargeable sur http://dimitrik.free.fr/
Une interface fruste mais puissante
De nombreuses sondes par défaut (tout l’historique des
commandes iostat, vmstat, iostat, netstat sans perte de
données)
Très facilement extensible (sondes mysql, java…)
Exemples de requêtes possibles:
•
•
•
Quels sont les 10 processus qui ont occupé le plus de mémoire entre
22h et 4h du matin ?
Quel est le taux d’interruption du CPU 2 entre 2h et 4h ?
Quel utilisateur a consommé tout le CPU entre 5h et 6h ?
100. Connaître son passé
Exemple d’utilisation
Cas 1: Comprendre les raisons d’une saturation mémoire
Sous Solaris, le répertoire /tmp est stocké en mémoire et son
occupation peut saturer la mémoire comment savoir si des
saturations étaient dues au /tmp ou à des processus ?
2 septembre 2011
90% RAM occupé par
les processus, ce
sont eux qui saturent
la mémoire !
9 septembre 2011
60% RAM seulement,
C’est le /tmp qui doit
occuper le reste de la
mémoire !!!
102. Passer à la vitesse supérieure
2 outils pour aller plus loin
Dtrace sous Solaris: un outil d’analyse et de profilage du
système extrêmement puissant
• le précurseur, créé en 2003 et disponible depuis Solaris 10
• totalement sûr, avec un impact faible, conçu pour être utilisé
en production
• permet d’accéder à énormément d’information du système,
• un language de scripting spécifique: le D
b
Systemtap sous Linux: l’équivalent pour Linux, créé en
2005,
• disponible nativement dans Redhat depuis la version 5.2
• scripts systemtap compilés et chargés en tant que module
noyau
103. Passer à la vitesse supérieure
dtrace et systemtap
Des outils puissants qui permettent de répondre aux questions
suivantes:
Quels sont les processus qui génèrent le plus d’entrées/sorties disque ?
Quels processus sont responsables d’une occupation CPU Système
importante ?
Quels sont les processus qui génèrent le plus de traffic réseau ?
Quels sont les processus qui accèdent de manière brève à ce fichier ?
Quelle processus est responsable de la suppression de fichiers ?
…
Des outils complexes à maîtriser !
Mais il existe de nombreux scripts directement utilisables sur le net:
• DtraceToolkit:
http://hub.opensolaris.org/bin/view/Community+Group+dtrace/dtracetoolkit
• Exemples Systemtap:
http://sourceware.org/systemtap/examples/