Chciałbym śledzić procesy inicjujące połączenia wychodzące na pulpicie Linux. Najlepsze, co mogę wymyślić, to:
iptables -A OUTPUT -m state --state NEW -j LOG --log-uid
Loguje to identyfikator UID / gid, który inicjuje połączenie, ale nie nazwa procesu / polecenia ani nawet pid. Gdybym mógł po prostu dostać pid, prawdopodobnie mógłbym wymyślić skrypt, który pobiera nazwę procesu, gdy dziennik jest zapisywany, ale wydaje się, że to nawet nie jest możliwe.
Idealnie chciałbym również rejestrować procesy, które akceptują połączenia przychodzące.
Jakieś pomysły, jak to możliwe z iptables [lub czymkolwiek innym] na Linux-ie?
Odpowiedzi:
Możesz napisać program do monitorowania / proc / net / tcp, którego dane wyjściowe wyglądają tak:
Następnie możesz powiązać otwarte porty z i-węzłami, które mogą być powiązane z procesami i deskryptorami plików, wykonując link read na deskryptorach plików wymienionych dla każdego procesu:
Zobacz tutaj, że i-węzeł 4847458 odpowiada pierwszemu gniazdu tcp z powyższej listy. Dane wyjściowe polecenia netstat -tapn weryfikują to dla mnie (i pamiętam, że 0x50 == 80):
Gdy program monitorujący zauważy zmianę w / proc / net / tcp, przeanalizuj dane i sprawdź, czy zmiana jest nowo otwartym gniazdem. Następnie możesz po prostu wyliczyć wszystkie deskryptory plików dla każdego procesu wymienionego w / proc, wykonując link read na każdym z nich, aby znaleźć pasujący i-węzeł. Gdy znajdziesz to, masz własny identyfikator, z którego możesz uzyskać wszystko, czego możesz chcieć, szczególnie jeśli masz rozliczanie procesów.
Jeśli nie potrzebujesz natychmiastowego powiadomienia, program monitorujący może użyć wolnej ankiety (być może okres 50 ms lub 100 ms, a nawet 1000 ms).
źródło
Chcesz moduł dopasowania właściciela, który działa tylko w łańcuchu WYJŚCIE (a może PREROUTOWANIE ...?). Przeczytaj dokumenty, ale zadziała to mniej więcej tak:
źródło
Nie ma nic wspólnego z iptables ani logowaniem; ale tutaj jest „górny” interfejs, który odpytuje katalog / proc / i wyświetla przepustowość dla programu / pid:
http://sourceforge.net/projects/nethogs
„NetHogs to małe narzędzie„ net top ”. Zamiast rozbijać ruch według protokołu lub podsieci, jak większość narzędzi, grupuje przepustowość według procesów. NetHogs nie polega na ładowaniu specjalnego modułu jądra.”
źródło
Gdy zastanawiam się nad podobnym pytaniem, próbując ograniczyć prędkość Skype, znalazłem
jest dobrym sposobem na połączenie numeru portu z pid / cmd, ponieważ pid-owner / cmd-owner nie są już obsługiwane bezpośrednio w iptables; następnie musisz przeanalizować wynik, a następnie dodać regułę iptables zgodnie z portem; naturalnie będziesz potrzebować trochę kodu czyszczącego później / przy zamykaniu / ponownym uruchamianiu systemu itp .; zapisz numer portu w pliku do odwołania w czasie czyszczenia
w rzeczywistości dobrą odpowiedzią na pytanie o numery portów jest
może być konieczne dostosowanie elementu grep tcp zgodnie z własnymi potrzebami
wtedy dla moich celów najłatwiej było dodać filtry tc u32 według numerów portów, wpisy w iptables według numerów portów podobne
źródło