Tag Archives: netstat

[How To] Monitorizare statut conexiune TCP

In caz că vă doriți să monitorizați statutul unei conexiuni TCP dintre o aplicație pe client și un server de aplicații puteți considera mecanismul pe care îl voi descrie mai jos.  Imaginativă o aplicație (critică) instalată pe o stație la un utilizator. Aplicația trebuie monitorizată ca tot timpul să țină stabilită o conexiune TCP intre ea și serverul de aplicație. În caz că conexiunea cade, utilizatorul pe stație trebuie înștiințat astfel încât acesta să reacționeze cât mai repede și eventual să intervină manual pentru remediere. Motive pentru care conexiunea se poate pierde pot fi multiple de la crash de aplicație până la probleme de network.

Înțeleg că soluții pot fi multe, dar una simplă și fără investii (timp/bani) este cea pe care v-o propun mai jos. Ideea se bazează pe verificare periodică a conexiunii TCP analizând output-ul rulării utilitarului netstat intr-un fișier de comenzi BAT. Rezultatul netstat se filtrează în așa fel încât să afișeze doar conexiunea dintre client și respectivul server de aplicație după care se caută secvența cu string-ul ESTABLISHED.  Dacă secvența ESTABLISHED lipsește utilizatorul primește un message-box cu atenționare. Periodicitatea se asigură cu un task programat in Windows Task Scheduler să zicem odată la 5 minute.

Așadar codul fișierului de comenzi BAT este: 

tcp_monitoring_source_code

Las fără explicații 1,2,8, pentru restul:

  • In linia 3 se execută netstat-ul cu parametri –an (all connections, host-uri ca adrese IP) peste care se aplică un filtru pentru conexiunile spre IP-ul serverului de aplicație. În continuare din rezultat se numără de câte ori se întâlnește secvența ESTABLISHED. Suma este aruncată în fișierul tmpfile care poate fi zero dacă nu sunt conexiuni și diferit de zero dacă sunt. TmpFile e creat și distrus pe durata executării scriptului.
  • În următoarele două linii (4,5) numărul conexiunilor se scoate din tmpfile după care se încarcă în variabila number_of_connections. De ce nu sa făcut direct din output-ul netstat in variabilă și sa mers prin fișierul tmpFile ? Răspunsul e pentru că nu am știut cum se face J, intuiesc totuși că se face cumva.
  • In linia 6 se verifică dacă numărul de conexiuni este zero fapt ce ar înseamna conexiune ruptă intre aplicația client și server. Dacă e zero utilizatorul primește o atenționare printr-un message-box. Message-box-ul trebuie confirmat pentru a fi închis.

tcp_monitoring_warrning_message

  • In linia 7 se face același lucru doar că evenimentul este înregistrat într-un fișier log: connection-report.txt. Locația se decide aici, oricare, important ca user-ul se aibă acces R/W.

tcp_monitoring_loged_messages

Dacă conexiune există scriptul pornește și închide imediat fără a deranja utilizatorul.  Nu se afișează nici un mesaj și nici nu se lasă mesaje in fișierul log.

Acum, pentru a asigura verificarea periodică a conexiunii fișierul de comenzi se programează ca task in Windows Task Scheduler pentru care se fixează periodicitate corespunzătoare (minim de 5 min).

Până la a include un task in Task Scheduler va trebui de asigurat în prealabil dreptul de  Logon as a batch job pentru utilizatorul pe stație. Fără acest settings job-ul din Task Scheduler intră in hung cu statut running și nu mai finalizează.  Pentru asta, din Control Pannel – Administrative Tools se deschide snap-in-ul pentru Local Security Policy după care se accesează politica Logon as a batch job în Local Policies – User Right Assignment la care se adaugă în permissions utilizatorul pe stație.

tcp_monitoring_logonasabatchjob

De remarcat că configurația de mai sus se execută cu privilegii de administrator. Task-ul în Windows Task Scheduler (mai jos) se configurează din numele utilizatorului pe stație. Utilizatorul pe stație simplu user, fără privilegii în plus față de grupul users.

Pe final configurăm task-ul in Windows Task Scheduler:

  • Inițiem Wizardul pentru un task nou. Din Task Scheduler click pe Create Basic Task ..
  • In Create a Basic Task specificăm un nume relevant pentru task.
  • În Trigger lăsăm implicit pe Daily
  • În Action – Start a Program specificăm fișierul de comenzi bat creat anterior. Atenție, e important in Start in să specificăm folderul in care rulează BAT-ul.
  • Click Finish, după care se deschide fereastra Properties la task.
  • Pe pagina Triggers click pe Edit, iar în fereastra deschisă se bifează Repeat task every .. iar in drop down se alege intervalul corespunzător, exemplu de 5 minute. După, în for a duration of se selectează indefinitely.

Cu asta tot, task-ul va porni periodic fișierul de comenzi care dacă va detecta că nu există conexiune cu serverul de aplicație va înștiința printr-un mesaj utilizatorul pe stație și va lăsa o înregistrare în fișierul log.