Der Source Port von TCP Verbindungen kann nützlich zum Debuggen sein. Er erlaubt einen Rückschluss auf die exakte Prozess ID auf dem Source System.
Nach dem Upgrade auf die neuste Fortigate Version hatten wir neulich
das Problem, dass die CPU permanent auf 100% ausgelastet war. Der
Schuldige lies sich über ein get system performance top
einfach finden. sshd
verursacht mit mehreren Prozessen,
dass alle Cores permanent ausgelastet waren. Diese Prozesse liessen sich
zwar mit diagnose system kill 9 <PIDNR>
abschiessen,
allerdings kamen auch schnell wieder neue ‘CPU-Fresser’ dazu. Ein etwas
umfangreicheres Debugging war also gefordert.
In der Ausgabe von get system session list | grep ":22"
war schnell ersichtlich, dass es sich um SSH Sessions vom Monitoring
Server handeln musste. Die entsprechenden Sessions waren länger offen
und verschwanden auch nach mehreren Minuten nicht. Eine normale
Monitoring Session dauert sonst max. 10 Sekunden.
Beispieloutput von get system session list
:
PROTO EXPIRE SOURCE SOURCE-NAT DESTINATION DESTINATION-NAT
...
tcp 1600 192.168.0.10:12345 - 192.168.1.1:22 -
...
Da der Monitoring Server viele SSH Sessions zu dem betroffenen System
öffnet, und zudem noch verschiedene Skripte ausgeführt werden, lässt
sich nicht einfach bestimmen welcher Monitoring Check Amok lief, resp.
für die hohe CPU Last verantwortlich war. An dieser Stelle kam der
Source Port ins Spiel. Mit ihm lässt sich der Problemprozess auf dem
Quellsystem ausfindig machen. Dies kann man z.B. mit einem
netstat
. Dabei helfen die Optionen: --tcp|-t
für TCP Verbindungen, --numeric|-n
für die numerische
Ausgabe von Ports und --programs|-p
welches noch das
Programm angibt:
$ netstat -tnp | grep <sourceport>
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 12 48 192.168.0.10:12345 192.168.1.1:22 ESTABLISHED 9590/ssh: username
In der Spalte PID/Programm
Name steht die Prozess ID.
Nun muss man diese nur noch über pstree
oder
ps axfu
suchen und hat den Schuldigen gefunden.
$ ps axfu
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
...
monitoringuser 12344 0.0 0.7 9128 3784 pts/8 Ss 20:28 0:00 | \_ -bash
monitoringuser 12345 0.0 0.1 3532 836 pts/8 S+ 20:46 0:00 | \_ monitoringcmd
...
In diesem fiktiven Output war nun der Befehl
monitoringcmd
für die Hohe CPU Last verantwortlich.