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

71

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

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

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

trusktr
источник

Ответы:

77

Используйте 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опцию, чтобы вывод обновлялся постоянно.

gertvdijk
источник
Благодарю. Это хорошая информация. Не могли бы вы взглянуть на мой обновленный вопрос?
trusktr
1
Совершенно неуместный угонщик (за исключением того, что этот ответ хорошо гуглился): Этот ответ также работает с Windows. Использовать netstatв «непрерывном режиме» там -cне работает. Вместо этого вы используете числа, как netstat -na 1 | find "[Scan_Host_IP_Addr]"для обновления каждую 1секунду (в этом примере). ( источник ).
Ерф
4
Это опросы, поэтому он не всегда ловит все соединения.
reinierpost
Есть ли способ отображения более удобной для пользователя информации, такой как доменные имена, информация о ip? Возможно, используя собственный скрипт?
Авр
@awm Ну, это было бы выполнимо straceдля процесса, фильтруя поиск сервера имен (без подробностей, это не полный ответ на это). В качестве альтернативы вы можете показать обратный DNS для IP-адресов, перечисленных в netstat, опуская nопцию, включенную в мой ответ.
gertvdijk
11

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

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

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

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

Стефан Шазелас
источник
9

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

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

sudo apt-get install nethogs

Запустите с правами root:

sudo nethogs

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

sudo tcpdump -i lo -A | grep Host:
ccpizza
источник
6

Я думаю, что вы хотите сделать, это получить список прослушивающих портов и затем удалить их из любых других TCP-соединений, тогда это будут все исходящие соединения. Команда ss (состояние сокета) выводит столбцы «Local Address: Port» и «Peer Address: Port», нам нужно удалить прослушивающие порты из столбца «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, iproute2-ss111117) имеют другой формат вывода, поэтому вам может потребоваться использовать $ 3 вместо $ 4 в 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 просто включили в него эту функцию. Сделайте, ss --outчтобы получить список исходящих соединений.
Дейл
Хорошо, мне нравится этот ответ. Я попробую, когда вернусь к повышению безопасности на моем сервере. : D
trusktr
Похоже, это можно использовать и для UDP, но, конечно, вам просто нужно использовать разные флаги и состояния.
Дейл
4

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

txtechhelp
источник
2

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

netstat -antup

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

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

SS Linux TCP / UDP Информация о сети и сокете

Кратос
источник
1

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

jlliagre
источник
Хорошо , это также доступно в Arch Linux: archlinux.org/packages/community/i686/conntrack-tools - Не могли бы вы привести пример того, как вы будете использовать conntrack, чтобы видеть, что только соединения запускаются из локального, а не из других соединений?
trusktr