Вопрос или проблема
Например, tomcat
(PID 4739
) инициировал соединение с postgress
(который находится на другом сервере), чтобы получить данные из базы данных, потому что tomcat
получил запрос от клиента (curl 192.168.1.12:8088/get
). При этом tomcat
использует случайный TCP source port
для соединения с postgress
. Теперь есть ли возможность получить эти source ports
, которые были созданы tomcat
с PID
?
Я использовал netstat -tp
, но не получаю PID
соединения. Получаю PID
только если использую l - Listening
, например netstat -tlp
. Я пытался прочитать PID
сокеты из /proc/PID/fd
и затем сопоставить с /proc/net/tcp
. Но я не вижу ничего в /proc/net/tcp
.
ПРИМЕЧАНИЕ: Топология, подобная ниже.
Мои запросы(server1)
<——->tomcat(server2)
<——–>postgress(server2)
ОБНОВЛЕНИЕ1
netstat -tepn
вывод
Активные интернет соединения (без серверов)
Протокол Recv-Q Send-Q Локальный адрес Удаленный адрес Состояние Пользователь Идентификатор PID/Имя программы
tcp6 0 1 172.25.30.21:36598 xx.xx.xx.91:4343 SYN_SENT 0 42955126 9661/java
tcp6 0 0 172.25.30.21:38340 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:38064 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:38282 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:37520 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:38286 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:37654 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:37906 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:38152 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:38124 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:37412 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:37374 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:38126 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:38252 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:37224 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:37800 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:37780 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:38274 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:37244 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:37880 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:38230 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:38118 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:37496 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:1099 172.25.30.21:47496 ESTABLISHED 0 42954824 4738/java
tcp6 0 0 172.25.30.21:37474 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:38200 172.25.30.12:5432 TIME_WAIT 0 0 -
tcp6 0 0 172.25.30.21:38102 172.25.30.12:5432 TIME_WAIT 0 0 -
PID
grep
ed вывод
veeru@localhost:~/veeru# netstat -tepn | grep 4738
tcp6 0 0 127.0.1.1:41095 127.0.0.1:45180 ESTABLISHED 0 42960213 4738/java
tcp6 0 0 172.25.30.21:1099 172.25.30.21:49984 ESTABLISHED 0 42963153 4738/java
netstat -tep | grep <pid of server2>
Это должно дать вам исходный порт, используемый server2 для подключения к postgress.
На Linux
netstat -atp
ss -atp
lsof -i tcp
Это даст вам список TCP сокетов вместе с pid (и fd, кроме netcat
) процессов, которые открыли fd на них (вам нужны привилегии суперпользователя, чтобы получить эту информацию для процессов, которые не ваши), но только если они действительно открыли fd на них.
После того как процессы закроют свой fd к сокету или завершат соединение с помощью shutdown(), даже если только в направлении записи, уже невозможно получить эту информацию. Вы все равно можете видеть сокеты в состоянии TIME_WAIT
в выводе netstat
или ss
, но, насколько я могу судить, нет способа вернуться к процессам, которые имели файловые дескрипторы на них.
Ваш лучший вариант в этом случае может быть в том, чтобы записывать все TCP соединения по мере их возникновения, например, используя auditctl
для аудита логирования системных вызовов connect()
.
Ответ или решение
Как получить исходящие соединения по PID процесса в Linux?
Вопрос, как получить информацию о соединениях, инициированных конкретным процессом (например, Tomcat с PID 4739), является актуальным для администраторов систем и специалистов в области ИТ. В этой статье мы подробно рассмотрим способы отслеживания исходящих соединений и получения информации о случайных исходящих портах, используемых процессами.
Проблема
При выполнении запросов (например, через curl
к Tomcat), произошла инициализация соединения с PostgreSQL. Tomcat использует случайный TCP-исходящий порт для соединения с сервером PostgreSQL. Цель состоит в том, чтобы определить, какие исходящие порты использует процесс Tomcat для установления соединения.
Способы получения информации о соединениях
-
Использование
netstat
:
Командаnetstat
предоставляет разнообразную информацию о сетевых соединениях. Чтобы увидеть соединения с указанием PID, воспользуйтесь командой:netstat -tepn
Это отображает все активные соединения и соответствующие им PID. Однако иногда
netstat
может не показывать PID для соединений, находящихся в состоянии TIME_WAIT. -
Использование
ss
:
ss
— это более современная утилита, которая также предоставляет информацию о сокетах:ss -atp
Эта команда покажет информацию о TCP-соединениях, вместе с PID процесса и состоянием соединения.
-
Использование
lsof
:
Командаlsof
может быть использована для получения списка открытых файлов и сетевых соединений:lsof -i tcp
lsof
покажет TCP-соединения и соответствующие процессы, однако доступ к процессам, не принадлежащим текущему пользователю, может потребовать прав суперпользователя.
Логирование соединений
Если требуется отслеживание соединений в реальном времени или запись данных о соединениях, можно использовать auditd
для аудита системных вызовов:
auditctl -a always,exit -F arch=b64 -S connect -S accept -F pid=4739
Эта команда позволит отслеживать все системные вызовы connect()
и accept()
, связанные с заданным PID. Таким образом, вы получите историю всех соединений, инициированных указанным процессом.
Ограничения
Важно понимать, что после завершения соединения (например, закрытия сокета) вы не сможете вернуть информацию о нем через netstat
, ss
или lsof
, так как связь между сокетом и PID теряется. Поэтому, если требуется постоянный контроль за соединениями, обязательно примените метод логирования.
Заключение
Определение исходящих соединений по PID процесса требует использования различных инструментов командной строки в Linux, таких как netstat
, ss
и lsof
. Важно активно отслеживать соединения в реальном времени с помощью логирования системных вызовов для получения наиболее полной картины. Эти подходы обеспечивают лучший контроль за сетевыми взаимодействиями и помогут в диагностике проблем, связанных с производительностью и безопасностью приложений.