プロセス ID なしで、Ubuntu サーバーの特定のポートでリッスンしているサービスを見つけるにはどうすればよいでしょうか?

プロセス ID なしで、Ubuntu サーバーの特定のポートでリッスンしているサービスを見つけるにはどうすればよいでしょうか?

類似の質問がたくさんあるにもかかわらず、私の質問に対する回答がなかったにもかかわらず、この質問を投稿することにしました。

  1. サーバーがリッスンするポートを定期的にチェックします。
  2. 私のUbuntu OSの出力は次の通りですlsb_relase -a:
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.3 LTS
Release:    20.04
Codename:   focal
  1. コマンドを実行するnetstat -tulpn4と、出力に不明なポートが表示されます。
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      580/systemd-resolve 
tcp        0      0 0.0.0.0:62176           0.0.0.0:*               LISTEN      900/sshd: /usr/sbin 
tcp        0      0 0.0.0.0:1122            0.0.0.0:*               LISTEN      1158/sshd: username    
tcp        0      0 0.0.0.0:3333            0.0.0.0:*               LISTEN      1158/sshd: username    
udp        0      0 0.0.0.0:51820           0.0.0.0:*                           -                   
udp        0      0 127.0.0.53:53           0.0.0.0:*                           580/systemd-resolve 
udp        0      0 X.X.X.X:1194           0.0.0.0:*                           870/openvpn         
  1. サーバーがポートをリッスンしている理由を調べるために、多くのツールとガイドを使用しましたが、51820答えは見つかりませんでした。
  2. 私が試してみました:
    • sudo lsof -i :51820- 空の出力が得られました。
    • sudo netstat -ltnp | grep -w ':51820'- 空の出力が得られました。
    • sudo fuser 51820/udp- 空の出力が得られました。
    • sudo netstat -peanut | grep ":51820"- 出力は次のようになります:
udp        0      0 0.0.0.0:51820           0.0.0.0:*                           0          26262      -                   
udp6       0      0 :::51820                :::*                                0          26263      - 
  • sudo ss -nlp | grep 51820出力は次のようになります。
udp     UNCONN   0        0                                             0.0.0.0:51820                                             0.0.0.0:*                                                                                                     
udp     UNCONN   0        0                                                [::]:51820                                                [::]:*  
  1. 以下の回答を確認しましたが、解決策は見つかりませんでした。

ポートについて Web で検索したところ、51820そのポートをリッスンしているのはインストールした「wireguard」であることがわかりましたが、どのコマンドを試してもそれを見つけることができなかったため、疑問は変わりません。

答え1

Wireguard をカーネル モジュールとして実装するオペレーティング システムを実行しています。カーネルはこのポートをリッスンしていますが、そのソケットを所有するプロセスがないため、PID は報告されませんnetstat

答え2

ジャンル:

この問題について 2 日間検索した結果、Michael Hampton 氏や Peter Zhabin 氏と同様に、リスニング ポート経由でカーネル プロセス ID を表示する既存のソリューションは存在しないことがわかりました。

さらに、その 2 日間で、commands 必要な答えをもたらす組み合わせもいくつか探しましたが、これを行うための簡単で便利な方法は見つかりませんでした。

私が作成したソリューションは暫定的なものであり、コミュニティのメンバーによって改善できると確信しています。

プロセスを見つけるための割引

  • プロセスはカーネル レベルまたはプロセスに ID (PID) を持たせないようにするその他のレベルで実行されています。
  • 指定されたコマンドの出力でプロセス ID またはプロセス プログラムが見つかりません: lsof、、、。netstatssfuser
  • 上記のコマンドの出力からリスニング ポートが見つかりました。ただし、リスニングの原因となっているプログラムまたは pid を構成することはできません。

についてgrep

grep開いているポートに関する詳細情報を検索するには、を使用します。

grep- パターンに一致する行を出力します。

grepコマンド経由でマニュアルページからman grep

DESCRIPTION
grep  searches  for  PATTERNS  in  each  FILE.  PATTERNS is one or more
       patterns separated by newline characters, and  grep  prints  each  line
       that  matches a pattern.  Typically PATTERNS should be quoted when grep
       is used in a shell command.
  • ここコマンドを正しく効果的に使用する方法についての素晴らしいトピックです。

指定されたポートを使用している PID またはプログラムを見つける方法grep:

私の場合、実行するとsudo grep --exclude-dir={sys,proc} -rnw / -e 51820 | grep -i port問題は解決し、ポートを使用しているプログラムに関する多くの情報が表示されました。

与えられた出力:

iptables.service:6:ExecStart=/usr/sbin/iptables -I INPUT -p udp --dport 51820 -j ACCEPT
/home/username/wireguard-install.sh:238:    read -p "Port [51820]: " port
/home/username/wireguard-install.sh:241:        read -p "Port [51820]: " port
/home/username/wireguard-install.sh:243:    [[ -z "$port" ]] && port="51820"
/usr/share/doc/netplan/examples/wireguard.yaml:9:      port: 51820
/etc/wireguard/wg0.conf:8:ListenPort = 51820
/etc/systemd/system/wg-iptables.service:6:ExecStart=/usr/sbin/iptables -I INPUT -p udp --dport 51820 -j ACCEPT
/etc/systemd/system/wg-iptables.service:10:ExecStop=/usr/sbin/iptables -D INPUT -p udp --dport 51820 -j ACCEPT

フラグが多数ある理由は、私が試した他の組み合わせでは大量の不要な出力があったためです。

コマンドの引数grepの意味:

  • --exclude-dir- パターンに一致する名前サフィックスを持つコマンドライン ディレクトリをスキップします。

そして特定の無視sysprocディレクトリ私たちの場合 不要な出力を避けるためです。

例:grep --exclude-dir={dir1,dir2}検索中に dir1 と dir2 を回避します。

  • -rまたは-R再帰的です。
  • -n行番号です。
  • -w単語全体に一致することを意味します。
  • /上から下への検索を開始するための「最上位」ディレクトリを表します。
  • -e- は検索中に使用されるパターンです。
  • 51820私たちの特定のケースでは、上記のネットワーク監視コマンドの 1 つによって検出されたポート番号です。
  • |- は、最初のコマンド部分の出力を 2 番目の部分にリダイレクトするパイプです。

私たちの場合:sudo grep --exclude-dir={sys,proc} -rnw / -e 51820出力を次のコマンドにリダイレクトするgrep -i port

  • -i- パターンと入力データ内の大文字と小文字の区別を無視し、大文字と小文字のみが異なる文字が互いに一致するようにします。
  • port- 検索を実行した目的に合わせて結果を絞り込み、フラグの後に定義された特定のポートに関する詳細情報を検索するために見つかりました-e

チップ:

  • 最初のステップでは、ディレクトリから開始してスキャンを可能な限り最大化し/、最小限のフラグを使用して出力をフィルタリングして、達成できる詳細を見逃さないようにします。
  • 必要な出力が見つかった後、または不要な出力が多すぎて必要な出力が見つからない場合は、フラグを 1 つずつ追加し始めます。
  • ポート番号をパターンとして指定します。結局のところ、これが出発点であり、最終目標です。
  • grep最初のスキャンをパターン フィルターにリダイレクトする二重コマンドを使用するportと、特定箇所を正確に特定して解決を高速化できます。結局のところ、パターンとして数字を探しているため、多くの望ましくない結果につながる可能性があります。
  • 与えられた出力で結論を導き出せない場合は、見つけたキーワードを選択して Web で検索してください。

関連情報