Linux マシンで開いているポートを調べたいですか? まず、重要な説明をします: サーバー側で「開いている」ポートとは、多くの場合、 ローカルで聞くこれは、それがインターネットからアクセス可能であること、あるいはファイアウォールがそれを通過させることを許可していることをまだ証明するものではありません。
私の場合、常に2つのステップで確認します。まず、サーバー上で何がリッスンしているかを確認します。 ssそして、ポートの背後にあるサービスまたはプロセス。 ネット統計 既知の機能ではありますが、多くの最新ディストリビューションではデフォルトではインストールされていません。最新のベストプラクティスに従うのが最善です。

今日使用するコマンド:ss
最近のLinuxでは、 ss が推奨コマンドです。これはスタックの一部です。 iproute2 そして多くの場合、 ネット統計 ネットワークソケットを検査する。
sudo ss -lntup
選択肢は重要です。
-Lリスニングポートを表示します。-nDNS解決を回避し、ポート番号を保持する。-tTCP接続に限定される。-uUDPを追加します。-p必要な権限がある場合、関連するプロセスを表示します。
それなし 須藤ポート番号は表示される場合もありますが、その背後にあるプログラムが必ずしも表示されるとは限りません。サーバーの簡単な監査を行うには、管理者権限でコマンドを実行し、該当する列を直接読み取るのがおすすめです。 プロセス。
間違いなく結果を読み取ってください
典型的な結果は次のようになります。
状態 受信キュー 送信キュー ローカルアドレス:ポート ピアアドレス:ポート プロセス
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=812,fd=3))
LISTEN 0 511 127.0.0.1:3306 0.0.0.0:* users:(("mariadbd",pid=1044,fd=21))
最初に確認すべき列は ローカルアドレス:ポート見たら 0.0.0.0:22このサービスはすべての IPv4 インターフェイスでリッスンします。 127.0.0.1:3306このサービスはローカルでのみ通信を傍受します。リスクは同じではありません。
IPv6の場合、 または 繰り返しますが、あまり速く読まないでください。 IPv6側では広範囲にわたるリスニングを意味する可能性があるが、 地元に留まります。
特定のポートをフィルタリングする
SSH、HTTP、またはデータベースのみを探している場合は、出力全体をスキャンする必要はありません。フィルターするには、 grep またはフィルターを使用して ss。
sudo ss -lntup | grep ':22'
sudo ss -lntup | grep ':80'
sudo ss -lntup | grep ':443'
TCPに特化した出力を得るには、以下を使用できます。
sudo ss -ltnp '(sport = :22)'
私はよく、 grep 急いでいるときは、彼女は誰とでも話すので。 ss 誤検出を避ける。
では、この全てにおいてnetstatはどのような役割を果たすのでしょうか?
ネット統計 管理者の記憶から消えたわけではないが、パッケージから来ている ネットツールDebian、Ubuntu、または最小限のインストールでは、多くの場合欠落しています。ドキュメントで質問されている場合は、 ネット統計 また、コマンドが見つからない場合でも、必ずしもサーバー側のエラーとは限りません。
netstat -lntup
出力は概念的には似ています。プロトコル、ローカルアドレス、ポート、PID、プログラム名などです。ただし、パッケージを使用するためだけにインストールする必要がある場合は、 ネット統計まず、自分自身に問いかけてみてください。 ss それだけでは不十分です。最近のサーバーでは、私の答えはほぼ常に「はい」です。
のマニュアルページ ss 利用可能なフィルターの詳細。 ネット統計 古いスクリプトをまだ維持している場合は、それは依然として有用です。
ポートの背後にあるプロセスを見つける
ポートが予期せず閉じられた場合は、むやみに閉じないでください。まずプロセスを特定し、必要に応じて関連するsystemdサービスを特定してください。
sudo ss -lntup
sudo lsof -iTCP -sTCP:LISTEN -P -n
lsof ポート、PID、バイナリをリンクしたい場合に便利です。 -P港は数字のままです。 -nそうすることで、読み取り速度を低下させたり、文字化けさせたりするDNS解決を回避できます。
PIDが分かっている場合は、そのPIDをサービスまで遡って追跡してください。
ps -p 812 -o pid,ppid,user,cmd
systemctl status ssh
systemd で実行されているサーバーの場合、ガイドは Linuxサービスとsystemctlコマンド この手順は正常に完了しました。目的は、想定されるサービス、コンテナ、古い忘れられたデーモン、または手動で起動されたプロセスが存在するかどうかを判断することです。
リスニングポートは必ずしも露出ポートを意味するものではない
それは典型的な罠だ。 ss ポートが「リッスン中」と表示されている場合、そのマシン上でプログラムが接続を受け付けていることがわかります。ただし、このポートがローカルファイアウォール、クラウドルール、NAT、ルーターのいずれを通過しているかはまだわかりません。
それらを整理するには、少なくとも以下を確認してください。
- リスニングアドレス:
127.0.0.1、0.0.0.0プライベートIP、パブリックIP。 - le service derrière le port ;
- 例えばローカルファイアウォール
うわー、nftablesまたはiptables; - ホスティング側またはクラウド側のセキュリティルール。
- 実際の露出を検証する必要がある場合は、別のマシンでテストを実行します。
sudo ufw status verbose
sudo nft list ruleset
sudo iptables -S
これらのコマンドは自動クリーンアップスクリプトで実行しないでください。まずはお読みください。リモートサーバーでは、ファイアウォールルールの不具合により、予想よりも早くSSH接続が切断される可能性があります。SSHが既に応答しない場合は、上記の方法を使用してください。 UbuntuでSSHを再インストールして検証する。
ファイアウォールに触れる前に私が確認する簡単なチェック
sudo ss -lntupリスニング中のTCPポートとUDPポートを確認する。sudo ss -ltnpTCPのみが必要な場合。sudo lsof -iTCP -sTCP:LISTEN -P -nプロセスを確認するため。systemctl status サービス名その背後にあるサービスを確認するため。journalctl -u サービス名 -b --ページングなしサービスが本来監視すべきでない時に監視している場合。- ローカル環境で何が監視されているかを理解してから、外部テストを実施する。
予期しないポートが見つかった場合は、すぐにプロセスを強制終了しないでください。ポート番号、PID、サービス名をメモし、ログを確認してください。(ガイドを参照してください…) journalctl の最後の起動 これにより、サービスが自動的に開始されたのか、それとも最近の操作によって開始されたのかを判断するのに役立ちます。
簡単に言うと: ss 初めに、 ネット統計 古い習慣を維持する必要がある場合に限り、ファイアウォールを変更してください。ポートの背後にあるサービスを特定する前にファイアウォールを変更しないでください。