web-dev-qa-db-ja.com

ローカルソケットに接続するPIDを継続的に監視する方法は?

一部のローカルプロセスは、ポート1234で127.0.0.1に接続および切断しています。

このポート(またはサーバープロセス)へのすべての接続をログに記録します。

私はもう試した

 ss -tpn | grep 1234 

リストを表示しますが、停止します。新しい接続のログは記録されないため、ソケットや所有者のPIDを取得できません。

接続および切断ソケットのPIDを検出するためにどのツールを使用できますか?

5
Hernán Eche

LinuxでTCP connectイベントを監視するために使用できる2つのツールがあります。

2つの違いは、前者は出力をカスタマイズするためのオプション(PIDやポート番号によるフィルタリングなど)を提供するのに対し、後者はより単純なツールであり、洗練されたオプションを提供しないことです。

あなたのユースケースでは、最も簡単なオプションはbccをインストールして実行することです:

tcpconnect.py -P 1234

ディストリビューションのパッケージマネージャーを使用してこれらのツールをインストールする場合、一部のディストリビューションは/usr/bintcpconnectを配置せず、代わりに/usr/shareのような別の場所に配置することに注意してください。したがって、これらのファイルが見つからない場合は、ディストリビューションがこれらのファイルを配置する場所を確認してください。

3
Sora Minazuki

それを行う「監視」ツールがある、またはあなたができる
while true; do sleep 2; clear; ss -tulnp | grep 1234 ; done
コードをファイルに追加して、追跡することができます。これはおそらくCPU使用率を生成しますが、あなたが探しているものであなたを助けるかもしれません。
Linux監視コマンド

1
Karov

ssはソケット統計のみをダンプするため、継続的なダンプをシミュレートする必要があります(watchまたはwhileループを使用)、netstatには継続モードがあります( -c)。

netstat -ntcp | grep '  127.0.0.1:1234'

クライアントpidのみをキャプチャする必要がある場合、127 ...の前の2つのスペースはタイプミスではないことに注意してください。
出力例:

$ netstat -ntcp | grep '  127.0.0.1:1234'
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:50146         127.0.0.1:1234          ESTABLISHED 21274/nc            
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:50146         127.0.0.1:1234          ESTABLISHED 21274/nc            
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:50146         127.0.0.1:1234          ESTABLISHED 21274/nc            
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:35720         127.0.0.1:1234          ESTABLISHED 22655/nc            
tcp        0      0 127.0.0.1:50146         127.0.0.1:1234          ESTABLISHED 21274/nc            
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:35720         127.0.0.1:1234          ESTABLISHED 22655/nc            
tcp        0      0 127.0.0.1:50146         127.0.0.1:1234          ESTABLISHED 21274/nc
1
lainatnavi

ssプログラムは、sock_diag(7) netlinkソケットを使用して、ソケットに関する情報を取得しています。ただし、sock_diagインターフェースは、rtnetlink(7)とは異なり、「モニター」/ウォッチング/リスニングモードをサポートしていません。 sock_diagソケットを介してのみqueriesを実行できます。

ただし、pcap/tcpdumpを介してtcp syn(= connect)パケットをキャプチャし、sock_diagインターフェースを使用してそれらに関するプロセス情報を見つけることができます。

しかし、これには少なくとも3つの重大な問題があります。

  1. その情報(sslsof)をクエリして表示できるすべてのコマンドラインユーティリティは非常に厳格であり、出力形式を構成したり、フィルターとして機能させることは不可能です。コマンドラインから実行できることは、パケットごとに個別のssインスタンスを実行することだけです。

  2. それは際どいです。プロセスは、パケットをキャプチャしてからプロセスに関する情報を照会するまでの間にすでに終了している可能性があります。

  3. tcpdump自体は、ssまたはlsofと同じくらいスクリプトから簡単に使用できます。

これらすべてを念頭に置いて、次のようなものmayするか、少なくとも開始するかもしれません。

socmon(){
  script /dev/null -qc "tcpdump -qn -iany '
   ((tcp[tcpflags] & tcp-syn) != 0 or (ip6 and (ip6[13 + 40] & 2) == 2)) and ($*)
' 2>/dev/null" </dev/null |
  Perl -ne 'print; next unless /(\S+)\.(\d+) >/; print qx(ss -Hp src "[$1]:$2") =~ s/.*users:/\t/r'
}

使用法:

>>> socmon dst port 9999
07:14:59.700995 IP6 fe80::89c8:7f7c:29f5:78df.50720 > fe80::89c8:7f7c:29f5:78df.9999: tcp 0
        (("xxx",pid=15805,fd=1),("xxx",pid=15804,fd=0))
07:15:08.868555 IP 127.0.0.1.42784 > 127.0.0.1.9999: tcp 0
        (("xxx",pid=15851,fd=1),("xxx",pid=15850,fd=0))
07:15:17.055518 IP 172.31.255.1.39700 > 172.31.255.1.9999: tcp 0
        (("xxx",pid=15856,fd=1),("xxx",pid=15855,fd=0))

script /dev/null ... </dev/nullは、tcpdumpにラインバッファリングを強制的に使用させます。 tcpdump -lは、パケットをキャプチャしてから印刷するまでの間に人為的な遅延がないと機能しません。

(ip6 and (ip6[13 + 40] & 2) == 2)はIPv6では機能しないため、tcp[tcpflags] & tcp-synは、SYNパケットBY HANDかどうかを確認します。

Perlはtcpdump出力からソースアドレスとポートを抽出し、それらをフィルター引数としてssを呼び出し、ss出力をトリミングしてプロセス情報のみを表示します。

ここで開発されていない、より良いアイデア

Iptablesまたはnftablesを使用してポートを別のポートにリダイレクトできます。リスニングプログラムは、ピアに関する情報を取得できますbefore接続を受け入れ、接続を宛先に転送します。これは両方の競合を修正し、どこかに接続し、ソケットファイル記述子を他のプロセスに渡したりリークしたりするプロセスによって混乱することはありません。

1
Uncle Billy
watch -n 1 -d 'lsof -n -itcp:1234'

ログではなく、ハイライト付きのリアルタイムの強力なモニタリング...

$ man watch

  • -n 1-1秒ごと
  • -d-違いを強調表示

$ man lsof

  • -n-ipsをドメインに解決しません。
  • -itcp:1234-tcpポート1234と相互作用します
0
Putin_Nitup