Как получить инициированные соединения процесса (PID)

Вопрос или проблема

Например, 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 greped вывод

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 для установления соединения.

Способы получения информации о соединениях

  1. Использование netstat:
    Команда netstat предоставляет разнообразную информацию о сетевых соединениях. Чтобы увидеть соединения с указанием PID, воспользуйтесь командой:

    netstat -tepn

    Это отображает все активные соединения и соответствующие им PID. Однако иногда netstat может не показывать PID для соединений, находящихся в состоянии TIME_WAIT.

  2. Использование ss:
    ss — это более современная утилита, которая также предоставляет информацию о сокетах:

    ss -atp

    Эта команда покажет информацию о TCP-соединениях, вместе с PID процесса и состоянием соединения.

  3. Использование 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. Важно активно отслеживать соединения в реальном времени с помощью логирования системных вызовов для получения наиболее полной картины. Эти подходы обеспечивают лучший контроль за сетевыми взаимодействиями и помогут в диагностике проблем, связанных с производительностью и безопасностью приложений.

Оцените материал
Добавить комментарий

Капча загружается...