Як я можу контролювати всі вихідні запити / з'єднання зі своєї машини?


71

Моя машина - це сервер, тому я хочу ігнорувати з'єднання, встановлені на моєму сервері (наприклад, коли хтось відвідує мій веб-сайт). Я хочу бачити лише з'єднання / запити, які здійснює мій сервер до інших місць.

Як я бачу лише ті вихідні з'єднання?

EDIT: Я новачок у подібних речах. Що я намагаюся зробити, це просто побачити, чи надсилається щось із мого сервера, окрім даних для моїх веб-додатків. Наприклад, якщо хтось відвідує мої веб-сайти, то, очевидно, мій сервер надсилатиме дані в браузер клієнта. Але припустимо, що також існує код у моєму веб-додатку, який надсилає статистичні дані кудись інше, про що я не знаю. Я хотів би бачити ті місця, на які сервер надсилає дані, якщо такі є. Це, мабуть, малоймовірно, але припустимо, ви вирішили використовувати рамку php або nodejs, яку ви не написали: є невеликий шанс, що вона може десь надіслати певний тип даних. Якщо так, це те, що я хотів би бачити.

Відповіді:


76

Використовуйте netstat. Наприклад

$ netstat -nputw
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
[...]
tcp        0      0 192.168.25.222:22       192.168.0.134:42903     ESTABLISHED 32663/sshd: gert [p

перераховує всі вихідні з'єднання UDP ( u), TCP ( t) і RAW ( w) (не використовуючи lабо a) у числовій формі ( nзапобігає можливим тривалим запуску DNS-запитів) та включає pпов'язану з цим програму ( ).

Розгляньте можливість додавання cопції для постійного оновлення результатів.


Дякую. Це гарна інформація. Не могли б ви поглянути на моє оновлене запитання?
trusktr

1
Зовсім невідповідний викрадення (за винятком того, що ця відповідь добре гугла): ця відповідь працює і в Windows. Використовувати там netstat"безперервний режим", -cне працює. Натомість ви використовуєте числа, як-от netstat -na 1 | find "[Scan_Host_IP_Addr]"для оновлення кожної 1секунди (у цьому прикладі). ( джерело ).
ruffin

4
Це опитування, тож воно не завжди охопить усі з'єднання.
reinierpost

Чи є спосіб відобразити більш зручну для користувача інформацію, таку як доменні імена, інформацію про ip? Можливо, за допомогою користувацького сценарію?
awm

@awm Добре, що можна зробити з straceпроцесом, фільтруючи для пошуку серверів імен (немає деталей, це не повна відповідь на нього). Крім того, ви можете показати зворотний DNS перелічених IP-адрес netstat, опустивши nпараметр, включений у мою відповідь.
gertvdijk

11

Якщо ви хочете просто зареєструвати кожну спробу підключення, найпростіший, мабуть, iptables LOGнацілений на Linux (або еквівалентну функцію реєстрації брандмауера у вашій системі).

Якщо вам потрібна додаткова інформація, наприклад тривалість з'єднання та обмін даними, що обмінюються в обох напрямках, то conntrackd(на Linux), мабуть, найкращий варіант.

Однак зауважте, що ці два вище лише записують трафік, який проходить через netfilter, який, як правило, весь трафік, але не враховує трафік, генерований IP-стеками в просторі користувача (наприклад, віртуальними машинами або чим-небудь, що використовує необроблені сокети) або мостовим трафіком.

Для більш загальних рішень, ви можете поглянути на такі речі , як argus, bro-ids, sancpабо ntopщо реєструвати всі види інформації , засновані на трафіку вони нюхати на інтерфейсі.


8

Я пробував купу інструментів, в тому числі iftop, ntop, iptraf, і, звичайно, дуже корисна вбудована netstat -tupln(підтримуються опція залежить від операційної системи), але найбільш практичні для мого випадку використання виявилося nethogs- агрегує з'єднання з допомогою породжує додаток , і є найменш галасливим з усіх.

Встановлюється через:

sudo apt-get install nethogs

Запустити як корінь:

sudo nethogs

Якщо ваша мета - просто побачити всі TCP-з'єднання, ініційовані будь-яким додатком, ви можете використовувати:

sudo tcpdump -i lo -A | grep Host:

6

Я думаю, що ви хочете зробити, це отримати список портів прослуховування, а потім видалити їх з будь-яких інших підключень TCP, тоді це будуть всі вихідні з'єднання. Команда ss (статус сокета) виводить стовпці "Місцева адреса: порт" та "Адреса однорангової: порту", нам потрібно видалити порти прослуховування зі стовпця "Місцева адреса: Порт", а не стовпця "Peer Address: Port", інакше ви можете пропустити деякі вихідні з'єднання. Отже, щоб досягти того, що я використовую \s{2}+рядок ": $ port" у грепі, щоб відповідати пробілам, що знаходяться за стовпцем "Локальна адреса: Порт"; у цьому стовпці є два або більше білих пробілів за ним, де в "Peer Address: Port" є один пробіл, а потім новий рядок (grrr ... просто повинен бути новий рядок, IMO,\s+\s{2}+.) Зазвичай я можу спробувати використовувати функцію фільтрації ss, наприклад, з ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>. Але, схоже, існує обмеження щодо того, наскільки ця струна може бути, вона бомбардується в системі, де у мене було багато портів прослуховування. Тому я намагаюся зробити те ж саме з грепом. Я вважаю, що спрацює наступне:

FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\\s{2}+|", B[i]; printf ":%s\\s{2}+", B[i]}')

ss -tn state established dst :* | grep -P -v "$FILTER"

Зауважте, це залежить від версії ss, яку ви використовуєте, старіші версії (наприклад: утиліта ss, iproute2-ss111117) мають інший вихідний формат, тому вам, можливо, доведеться використовувати $ 3 замість 4 доларів in awk. Зауважте також, ss -tlnі ss -tn state listeningви отримуєте різні результати, що для мене трохи не інтуїтивно зрозуміло. YMMV.

Я знайшов трохи більш елегантне рішення, яке не вимагає знання IP-адреси хоста, ss -tn state established dst :*працює добре, я змінив командні рядки вище.


Будь ласка, додайте пояснення, як це працює? ( Відредагуйте відповідь; не публікуйте роз'яснювальну інформацію як коментарі.) Я думаю, я частково зрозумів це. Здається, може знадобитися трохи більше роботи. Я побіг ss -tn state listeningна хості, який працює на FTP-сервері, і, природно, команда показала, що машина слухає порт 21. Отже, це не означає, що egrep -vбуде фільтрувати будь-які віддалені хости, IP-адреса яких включає "21" (включаючи "210 "," 211 "," 212 ", ...)? Крім того, чи asortсправді потрібна, чи просто вітрина?
G-Man

Мені довелося виправити майже всю справу, виправлений сценарій вище.
Дейл

Зрештою, було б набагато приємніше, якби ss або netstat просто включили в нього цю функціональність. Зробіть a, ss --outщоб отримати список вихідних з'єднань.
Дейл

Приємно, мені подобається ця відповідь. Я спробую це, коли повернусь до підвищення безпеки на своєму сервері. : D
trusktr

Схоже, це може бути використане і для UDP, але ви, звичайно, просто повинні використовувати різні прапори та стани.
Дейл

4

tcpdumpдозволяє бачити весь IP-трафік, що надходить до / з певного інтерфейсу з можливістю фільтрації за певними критеріями. tcpdumpзазвичай встановлюється у більшості * nix систем за замовчуванням, якщо ні, зазвичай десь є порт, щоб захопити його для вашого конкретного дистрибутива.


2

netstat є хорошим варіантом. Використовуйте параметри, як потрібно. (див. його довідкові сторінки) Наприклад

netstat -antup

Тут він може контролювати весь (a) прослуховування числового (n) tcp (t) та udp (u) процесу (p).

Ви також можете спробувати ssкоманду. Для довідкового використання:

Інформація про мережу та розетку SS Linux TCP / UDP


1

Якщо ви користуєтеся Solaris або похідною, погляньте на conntrack


Приємно, що також доступно в Arch Linux: archlinux.org/packages/community/i686/conntrack-tools - Чи можете ви навести приклад того, як ви можете використовувати conntrack, щоб бачити лише з'єднання, розпочаті з локальних, але не з'єднання, розпочаті з інших місць?
trusktr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.