LINUX.ORG.RU

Исходящие и входящие сокеты TCP

 , ,


0

1

Други всем доброго времени суток. Постараюсь коротко и по делу. Пишу скрипт сбора метрик на серверах а так же все возможных алертов. В тз сказанно, получить кол-во исходящих и входящих сокетов, дабы отслеживать что бы они не закончились так как приценденты были. Так вот, я в линуксе откровенно плаваю, понимаю что эту инфу можно вытащить через netstat, только не понимаю что тащить. Объясните пожалуйста как понять какой сокет входящий а какой исходящий, если можно на пальцах))

Заранее спасибо за любые наводки и подсказки.

Вроде даже на уровне ядра нет иформации о направлении сокета, не говоря уж про netstat.

ИМХО, либо брать информацию из вывода ″conntrack -L -p tcp --state ESTABLISHED″, либо из вывода netstat (ss) брать порты в состояние listen и совпадающими с ними сокеты считать входящими. В первом случае на сервере в ядре должна быть подсистема conntrack. Во- втором случае будет ошибка, если порт перестали слушать, а соединения ещё остались.

как понять какой сокет входящий а какой исходящий, если можно на пальцах

Может об это спросить разработчиков ТЗ? Им точно нужно два числа, а не просто число открытых сокетов?

mky ★★★★★
()
Ответ на: комментарий от t184256

не, это было бы слишком просто. чего его там смотреть. Либо грепом либо флагом -l если я не ошибаюсь.

De_Archangel
() автор топика
Ответ на: комментарий от mky

А что если так, делаю netstat -atn | grep -v -e «^tcp6» -e «^Proto» -e «Active» -e " 127.0.0.1:" далее грепом убираю tcp6, обращение к 127.0.0.1 и заголовки, а оставшиеся tcp сокеты начинаю сравнивать по ip адресу. Там 2 колонки с ipшниками, (ман не читал) но скорее всего 1 адрес отправителя а 2 адрес получателя. я прохожусь по всему столбцу и сравниваю ip адрес со своим, если адрес в 1 столбце совпадает с моим значит это исходящий сокет…… ну как нибудь так. может сработать?

De_Archangel
() автор топика
Ответ на: комментарий от De_Archangel

Даже не так. local - это у нас sourse + 4-х значный номер порта. foreign - это destination и 5-ти значный номер порта. от сюда если в local я встречаю свой адрес с коротким номером порта тогда это реально исходящий, все остальные считаем входящими.

или проверять по столбцу foreign, там буду искать свой адрес и 5-ти значный порт, и это считать входящим, а всё остальное исходящим

как думаете?

De_Archangel
() автор топика

В тз сказанно, получить кол-во исходящих и входящих сокетов, дабы отслеживать что бы они не закончились

как ты будешь определять что они заканчивают, например открыто 1000 сокетов - это много или мало ?

x905 ★★★★★
()

Как здесь уже сказали, сокет — это двунаправленное соединение. А значит по определению не бывает исходящих и входящих. Они все могут и передавать, и принимать. Но бывают, как тоже здесь говорилось, серверные и клиентские сокеты. Поэтому я бы уточнил, что заказчик подразумевает под словами «исходящие и входящие». Иначе разговор получится беспредметным.

что бы они не закончились

А вот закончиться в теории могут порты, независимо от того, передают по ним или принимают, и серверные ли они или клиентские. Поэтому тут надо считать все занятые и свободные порты, принимая во внимание, что номер порта может быть от 0 до 65535, порты tcp и udp — разные, и их номера могут совпадать, порты с номерами 0 – 1023 включительно — привилегированные, их могут занимать только серверные приложения, запущенные от рута, и помимо привилегированных портов могут быть и другие зарезервированные, которые не должны заниматься клиентскими программами. Перечислены зарезервированные порты в файле /etc/services. Соответственно, число свободных клиентских портов можно узнать, вычтя из 65536 первые 1024 и все порты из /etc/services, большие 1023, а также все задействованные порты, кроме вышеперечисленных. И ещё раз повторюсь: отдельно для tcp и udp.

aureliano15 ★★
()
Ответ на: комментарий от De_Archangel

Судя по-всему - речь идёт о количестве возможных открытых дескрипторов на процесс а не про количество свободных портов? По-крайней мере твою постановку я так интерпретировал не заглядывая дальше. И смотреть надо не в netstat а в /proc/pid/* с помощью какого нить inotify.

pon4ik ★★★★★
()
Последнее исправление: pon4ik (всего исправлений: 1)
Ответ на: комментарий от De_Archangel

Попробуйте :) Думаю через какое-то время поймёте, что local означает локальный ip-адрес (пренадлежит этому хосту).

Фильтруя forigen по локальным ip-адресам вы уберёте соединения хоста самого с собой, но они обычно 127.0.0.1.

mky ★★★★★
()
Ответ на: комментарий от De_Archangel

ip_local_port_range обычно больше 1024, а сокетов каждый процесс более 1024 может и не открыть (если лимит не увеличен)
как узнать что процессу скоро не хватит сокетов по причине лимита дескрипторов И ограничения в ip_local_port_range - я не знаю

x905 ★★★★★
()

я в линуксе откровенно плаваю

Нафиг вообще брался, если такой тупой?

Возьми collectd и продай как свое решение, мне 25% за идею.

LZai
()

По-моему единственное нормальное решение - это сканировать трафик и отслеживать SYN пакеты, и по их очерёдности смотреть, какое соединение было исходящее, а какое входящее. Отдельно порты, думаю, не разделяются. Например, если на двух машинах в сети одновременно запустить команду telnet, и сделать так, чтобы совпадали исходящие и входящие порты, то может быть установлено соединение.

urquan
()
Последнее исправление: urquan (всего исправлений: 1)
Ответ на: комментарий от Pyzia

да нееее, сюда то я пришёл что бы всякие балбесы повышали свой ЧСВ за счёт менее опытных людей оставляя тут язвительные и совершенно бессмысленные комментарии.

De_Archangel
() автор топика

Всем большое спасибо. Буду делать наверное следующим образом: Как тут ранее говорилось,буду смотреть на номер порта столбца local - если у меня локал с одним из портов, на которых слушают сервисы - это входящий сокет, если локал с одним из портов из local_port_range - это исходящий сокет.

De_Archangel
() автор топика
Последнее исправление: De_Archangel (всего исправлений: 2)

дабы отслеживать что бы они не закончились

Закончится могут файловые дескрипторы у процесса, эфимерные порты (ip_local_port_range) для конкретной пары {локальный_ip, протокол} или для всех IP (если bind делается на нулевой адрес), список открытых файлов для всей системы (fs.file-nr).

kmeaw ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.