現在、コンピュータの共通ss -l
リストには、さまざまなNetidタイプを含む多くのオープンソケットがあり、そのほとんどはlocalhostでのみ受信されます。
リモートコンピュータがデータを交換できるすべてのソケットのリストをどのように取得できますか?
これには、TCP、UDP、その他のトランスポート層プロトコル、RAWソケット、および私が認識しないその他のプロトコルが含まれます。 (
ss
こういう意味で完全だって?)私はこれがUNIXソケットを除外すると信じています(それらはローカルファイルシステムにのみありますか?そうでなければ、UNIXソケットはリモートで動作する可能性があるので含める必要があります)。
リスナーはlocalhostの制限を無視できますが、localhostの表示/マッピング方法に注意があるかどうかはわかりません。
デフォルトの基準は、「リスニングプロセスが許可する場合は、リモートですべてのソケットを攻撃できます」です。
ss
(数年前にコマンドが次のように表示されたことを覚えています。たくさんその結果は私が今得ているものより少なくなりました。これにより、一部のディストリビューションがデフォルトss
でコンテンツを非表示にするように設定されているかどうか疑問に思います。ss
他の環境で実行されるという理由だけで何も隠さない限り、可能な限り移植性の高いユーティリティコマンドまたは同様のユーティリティコマンドを探しています。また、セキュリティ理論の観点から、脅威モデルの場合、システムが完全に私たちの制御下にあり、正常で悪意のないソフトウェアを実行していると仮定することができます。 )
それでは、関連するソケットのみをリストする方法は何ですか?
答え1
ほとんどの環境では、tcp、udp、rawソケット、およびパケットソケットのみが見つかると予想されます。幸いなことにss
、これらすべてが知られています。
ss
必要なすべてのプロトコルを知っていると仮定すると、おそらく次のコマンドを使用します。これは「unix」ソケットを除外します。また、ローカルカーネルとの通信にのみ使用される「netlink」ソケットも除外されます。
sudo ss -l -p | grep -vE '^(u_|nl )'
通常、リスニングソケットはあまりありません。したがって、すべてのエントリを表示し、ループバックIPアドレスを受信するすべてのエントリを手動で上書きできます。あるいは、ss
すべてのフィルタリングが行われるように要求することができる。
sudo ss -l -p -A 'all,!unix,!netlink' 'not src 127.0.0.1 not src [::1]'
どちらの場合も、出力には「クライアント」UDPソケットも含めることができます。したがって、DNSクライアント、HTTP / 3クライアントも表示されることがあります。
各ソケットを開いたプログラムに関する情報を表示する必要がない場合は、そのオプションを削除してルート(または)()-p
として実行する必要はありません。ss
netstat
sudo
上記のコマンドはどのくらい包括的ですか?
netstatの代替品として宣伝されていますが、ss
「udplite」ソケットマークのサポートは不足しています。
また、答えはバージョンによって異なりますss
(そしてカーネルによっても同じようです)。私がもともとこの答えを書いたとき、前に2017年、ss
「sctp」はサポートされていません。 netstat
それからサポートしてください2014年2月)。 sctpは具体的に予想される~へ電話会社。電話会社以外のVOIPは通常UDPを使用します。
残念ながら、 で完全なリストを見つけるとman netstat
非常に混乱します。 sctp と udplite のオプションは、tcp、udp、raw とともに最初の行に表示されます。もっと詳しく見ると、プロトコルの完全なリストがあります。家族:[-4|--inet] [-6|--inet6] [--unix|-x] [--inet|--ip|--tcpip] [--ax25] [--x25] [--rose] [--ash] [--bluetooth] [--ipx] [--netrom] [--ddp|--appletalk] [--econet|--ec]
。
udplite と sctp はサポートされますが、netstat
「dccp」はサポートされません。また、netstatは.NET Frameworkなどのパケットソケット(ネイティブソケットと同じですが、リンクレベルのヘッダーを含む)もサポートしていませんss -l -0
。
ss
Bluetoothソケットもサポートされていません。 Bluetoothソケットは伝統的な意味では問題ではありません。これは完全なレビューを行う場合に関連している可能性があります。しかし、Bluetoothセキュリティは非常に具体的な質問なので、ここでは答えません。
localhostを省略しますかnetstat
?
netstat
ソケットをlocalhostにバインドすることを省略する特別な方法はありません。| grep -v
最後に使用してください。-p
netstat /ss オプションを使用する場合は注意してください。プロセス名が一致した場合は、誤って一部のプロセスを除外する可能性があります。grep -v localhost:
デフォルトでは、数値アドレスを表示するだけでなく、パターンにコロンを含めるので、ss
この場合は誤っ| grep -vE (127.0.0.1|\[::1\]):
て除外されるプロセスを確認できますps ax | grep -E (127.0.0.1|\[::1\]):
。
もっと簡単なコマンドはありますか?
残念ながら、パケットソケットの場合。それ以外の場合は、簡単なnetstat -l
コマンドを提案することもできます。 netstat
要求を予測し、出力を「インターネット接続」、「UNIXドメインソケット」、および「Bluetooth接続」に分割するのに役立ちます。最初の部分だけを確認してください。ネットリンクソケット部分はありません。
tcp、udp、raw、およびパケットソケットにのみ興味があるとします。最初の3種類のソケットにはnetstat -l -46
。
パケットソケットが一般的に使用されます。したがって、ランニングss -l -0
(またはss -l --packet
)トレーニングも必要です。
残念ながら、これは大きな落とし穴を引き起こします。問題は今、これら2つのコマンドを組み合わせようとしていることです。
避けるべきトラップss
ss -l -046
単一のコマンドとしての答えは魅力的に見えます。しかし、これはいいえ本当。 ss -46
IPv6ソケットのみが表示されます。 ss -64
IPv4ソケットのみが表示されます。
常に結果に対して完全なチェックを実行することをお勧めします。何を期待すべきかを把握してください。各プロトコルを調べて、欠落しているものを確認してください。 IPv4アドレスがない場合、またはIPv6アドレスがない場合は非常に疑わしいです。ほとんどのサーバーには、両方を受信するSSHサービスがあると予想できます。 DHCPが使用されるため、サーバーではなくほとんどの場合、パケットまたは生のソケットも表示する必要があります。
2つの異なるコマンドの出力を解釈したくない場合は、netstat
コマンドをに置き換えることが代替かもしれませんss -l -A inet
。これは、netstatを実行するときにまったく同じオプションがipv6ソケットを除外するため、少し不幸です。
したがって、単一のコマンドの場合ss -l -A inet,packet ...
。
ss -l | grep ...
IMO、最初の部分で提案された方法で使用することもできます。このコマンドは覚えやすく、選択オプションですべての混乱した動作を防ぎますss
。
この出力を使用して何かを自動化するスクリプトを作成する場合は、おそらくフィルタリングを好む必要があります。ポジティブ代わりにソケットタイプのリストです。そうしないと、ss
新しいローカル専用ソケットのサポートが開始されたときにスクリプトがクラッシュする可能性があります。
ss -a -A raw -f link
とから来るソケットの組み合わせを表示すると言いましたか?そして見せてss -a -A raw
ss -a -f link
ss -a -A inet -f inet6
少ないソケット比率ss -a -A inet
?私は-f inet6
andが-f inet
正確に文書化されていない特別なケースだと思います。
(-0
、-4
およびは、およびのエイリアス-6
です。)-f link
-f inet
-f inet6
ss -A packet
ヘッダーは表示されますが、ソケットは表示されないと述べましたか?strace
実際に何も読まないことを示します。これは、パケットソケットを常に「聞いている」と見なしているためです。 ss
これに対する警告を提供するにはあまりにも怠惰です。これは、ss
次のように処理される生ソケットとは異なります。同時に「聞く」そして「聞かない」。
(man 7 raw
元のソケットいいえ特定のプロトコルにバインドされているが特定のIPプロトコルにバインドされていない場合は、転送専用です。これがリスニングソケットと見なされているかどうかを確認していません)