Моя машина - это сервер, поэтому я хочу игнорировать соединения с моим сервером (например, когда кто-то заходит на мой сайт). Я хочу видеть только соединения / запросы, сделанные моим сервером в другие места.
Как я вижу только эти исходящие соединения?
РЕДАКТИРОВАТЬ: я новичок в такого рода вещи. То, что я пытаюсь сделать, это просто посмотреть, отправляется ли что-нибудь с моего сервера, кроме данных для моих веб-приложений. Например, если кто-то посещает мои сайты, то, очевидно, мой сервер отправит данные в браузер клиента. Но предположим, что где-то в структуре моего веб-приложения есть код, который отправляет статистические данные в другое место, о котором я не знаю. Я хотел бы видеть те места, куда мой сервер отправляет данные, если таковые имеются. Это, вероятно, маловероятно, но предположим, что вы решили использовать среду php или nodejs, которую вы не написали: есть небольшая вероятность, что она может отправить куда-нибудь какой-либо тип данных. Если так, то это то, что я хотел бы увидеть.
netstat
в «непрерывном режиме» там-c
не работает. Вместо этого вы используете числа, какnetstat -na 1 | find "[Scan_Host_IP_Addr]"
для обновления каждую1
секунду (в этом примере). ( источник ).strace
для процесса, фильтруя поиск сервера имен (без подробностей, это не полный ответ на это). В качестве альтернативы вы можете показать обратный DNS для IP-адресов, перечисленных вnetstat
, опускаяn
опцию, включенную в мой ответ.Если вы просто хотите регистрировать каждую попытку подключения, возможно, самая простая
iptables
LOG
цель - на Linux (или эквивалентная функция ведения журнала брандмауэра в вашей системе).Если вам нужна дополнительная информация, такая как длительность соединения и объем данных, которыми обмениваются в обоих направлениях, то
conntrackd
(в Linux), вероятно, является лучшим вариантом.Однако обратите внимание, что эти два выше только регистрируют трафик, который проходит через сетевой фильтр, который, как правило, весь трафик, но не учитывает трафик, генерируемый стеками IP в пространстве пользователя (например, виртуальные машины или что-либо, использующее необработанные сокеты) или мостовой трафик.
Для более общих решений, вы можете взглянуть на такие вещи , как
argus
,bro-ids
,sancp
илиntop
что регистрировать все виды информации , основанные на трафике они нюхать на интерфейсе.источник
Я пробовал кучу инструментов, в том числе
iftop
,ntop
,iptraf
, и, конечно, очень полезная встроеннаяnetstat -tupln
(поддерживаются опция зависит от операционной системы), но наиболее практичные для моего случая использования оказалосьnethogs
- агрегирует соединения с помощью порождающего приложение , и является наименее шумным из всех.Устанавливается через:
Запустите с правами root:
Если ваша цель - просто просмотреть все TCP-соединения, инициированные любым приложением, вы можете использовать:
источник
Я думаю, что вы хотите сделать, это получить список прослушивающих портов и затем удалить их из любых других 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. Я считаю, что следующее будет работать:Обратите внимание, что это зависит от используемой версии 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
действительно ли это необходимо или просто оформление витрин?ss --out
чтобы получить список исходящих соединений.tcpdump
позволяет видеть весь IP-трафик, поступающий в / из определенного интерфейса с возможностью фильтрации по определенным критериям.tcpdump
обычно устанавливается в большинстве систем * nix по умолчанию, если нет, то обычно есть порт, где можно взять его для вашего конкретного дистрибутива.источник
netstat
является хорошим вариантом. Используйте параметры по мере необходимости. (см. его man-страницы) Например,Здесь он может контролировать все (a) прослушивание числовых (n) tcp (t) и udp (u) процессов (p).
Вы также можете попробовать
ss
команду. Для справки:SS Linux TCP / UDP Информация о сети и сокете
источник
Если вы используете Solaris или его производную, посмотрите на conntrack
источник