Как я могу контролировать все исходящие запросы / подключения с моей машины?

Моя машина – это сервер, поэтому я хочу игнорировать подключения, выполняемые на моем сервере (например, когда кто-то посещает мой сайт). Я хочу видеть только соединения / запросы, сделанные моим сервером в других местах.

Как увидеть только те исходящие соединения?

EDIT: Я новичок в таких вещах. То, что я пытаюсь сделать, это просто посмотреть, не отправлено ли что-либо с моего сервера, кроме данных для моих веб-приложений. Например, если кто-то посещает мои сайты, то, очевидно, мой сервер отправит данные в браузер клиента. Но предположим, что в моем веб-приложении есть код, который отправляет статистические данные в другое место, о котором я не знаю. Я хотел бы видеть те места, куда мой сервер отправляет данные, если они есть. Вероятно, это маловероятно, но предположим, что вы решили использовать инфраструктуру php или nodejs, которую вы не пишете: есть небольшая вероятность, что она может куда-то отправить какие-то данные. Если это так, я бы хотел это увидеть.

7 Solutions collect form web for “Как я могу контролировать все исходящие запросы / подключения с моей машины?”

Используйте 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 чтобы непрерывно обновлять выходные данные.

Если вы просто хотите регистрировать каждую попытку подключения, самым простым является, вероятно, iptables LOG target в Linux (или эквивалентная функция ведения брандмауэра в вашей системе).

Если вам нужна дополнительная информация, например, продолжительность соединения и объем данных, обмениваемых в обоих направлениях, то conntrackd (в Linux), вероятно, лучший вариант.

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

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

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

 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 utility, iproute2-ss111117) имеют другой формат вывода, поэтому вам, возможно, придется использовать $ 3 вместо $ 4 в awk. Обратите внимание, что ss -tln и ss -tln дает вам разные результаты, что для меня немного противоречит интуиции. YMMV.

Я нашел несколько более элегантное решение, которое не требует знания IP- ss -tn state established dst :* хоста, ss -tn state established dst :* хорошо работает, я изменил приведенные выше командные строки.

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

Я пробовал кучу инструментов, в том числе iftop , ntop , iptraf и, конечно же, очень полезный встроенный netstat -tupln (поддерживаемые параметры зависят от ОС), но наиболее практичным для моего случая использования оказалось nethogs – он объединяет соединения с исходным приложением и является наименее шумным из всех.

Устанавливается через:

 sudo apt-get install nethogs 

Запуск от имени пользователя root:

 sudo nethogs 

Если ваша цель – просто увидеть все TCP-соединения, инициированные любым приложением, вы можете использовать:

 sudo tcpdump -i lo -A | grep Host: 

netstat – хороший вариант. Используйте необходимые параметры (см. его страницы руководства). Например

netstat -antup

Здесь он может контролировать все (а) числовые (n) tcp (t) и udp (u) процессы (p).

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

SS Linux и TCP / UDP

Если вы запустите Solaris или производную, посмотрите на conntrack

Linux и Unix - лучшая ОС в мире.