バニラss -l
(現在のマシンでは)多くのオープンソケットがリストされ、さまざまなNetidタイプがあり、その多くはlocalhostでのみリッスンしています。
リモートマシンがそのマシンとデータを交換できると考えられるソケットのみのリストを取得するにはどうすればよいですか?
これには、TCP、UDP、その他のトランスポート層プロトコル、RAWソケット、および私が知らない他のすべてが含まれます。 (この意味でss
は完全ですか?)
私はこれがUNIXソケットを除外すると信じています(それらはローカルファイルシステム上だけにありますよね?またはUNIXソケットはリモートで動作できるので、それらを含める必要があります)。
Localhostで制限されたリスナーは無視できますが、localhostを表現/マッピングする方法に関して注意点があるかどうかはわかりません。
重要な基準は、「リスニングプロセスで許可されていれば、リモートでハッキングされる可能性があるすべてのソケット」です。
(私は数年前のss
コマンドがlot現在よりも少ない結果を示したことを思い出します。これは、一部のディストリビューションがss
を構成して何かを隠すかどうか疑問に思います別の環境で実行されたという理由だけで何も隠さない限り、可能な限り移植可能なss
または同様のユーティリティコマンドを探しています。また、セキュリティ理論的な観点から、脅威モデルでは、マシンは完全に制御されており、通常の悪意のないソフトウェアを実行していると想定できます。
それでは、どのようにして関連するすべてのソケットのみをリストするのですか?
ほとんどの環境では、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
)を実行する必要はありません。 root権限(Sudo
)。
Netstatの代わりとして宣伝されているにもかかわらず、ss
は "udplite"ソケットを表示するためのサポートを欠いています。
また、答えはss
のバージョンによって異なります(カーネルもそうです)。この回答が最初に書かれたとき、 2017 以前は、ss
は「sctp」をサポートしていませんでした。 netstat
は 2014年2月 )以降サポートしています。 sctpは特にinside電話会社が想定されています。電話会社以外では、VOIPは通常udpを使用します。
残念ながら、_man netstat
_で包括的なリストを探すと、かなり混乱します。 sctpおよびudpliteのオプションは、tcp、udp、およびrawとともに最初の行に表示されます。さらに下には、プロトコルの包括的なリストfamilies:_[-4|--inet] [-6|--inet6] [--unix|-x] [--inet|--ip|--tcpip] [--ax25] [--x25] [--rose] [--ash] [--bluetooth] [--ipx] [--netrom] [--ddp|--appletalk] [--econet|--ec]
_のようなものがあります。
netstat
はudpliteとsctpをサポートしていますが、「dccp」はサポートしていません。また、_ss -l -0
_で選択されているように、netstatは(rawソケットのようにリンクレベルヘッダーを含む)パケットソケットをサポートしていません。結論として、私はすべてが嫌いであり、私はおそらくあまり知識人にならないように立つことができました。
また、ss
はBluetoothソケットをサポートしていません。 Bluetoothソケットは従来の問題ではありません。これは、完全な監査を行っている場合に関連する可能性があります。 Bluetoothセキュリティは非常に具体的な質問です。ここでは答えません。
netstat
でlocalhostを省略していますか?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接続」に分割します。最初のセクションだけを見てください。 netlinkソケット用のセクションはありません。
Tcp、udp、raw、およびパケットソケットのみに関心があるとします。最初の3つのタイプのソケットでは、_netstat -l -46
_を使用できます。
パケットソケットが一般的に使用されています。したがって、_ss -l -0
_(または_ss -l --packet
_)を実行するようにトレーニングする必要もあります。
残念ながら、これには大きな落とし穴があります。問題は、2つのコマンドを組み合わせようとすることです。
ss
で回避すべきトラップ_ss -l -046
_は、単一コマンドの回答として魅力的に見えます。ただし、これはnot trueです。 _ss -46
_はIPv6ソケットのみを表示します。 _ss -64
_はIPv4ソケットのみを表示します。
常に結果の健全性をチェックすることをお勧めします。期待することを学ぶ。各プロトコルを調べて、そこにあるはずの欠落がないかどうかを確認します。 IPv4アドレスもIPv6アドレスもない場合は、非常に疑わしいです。ほとんどのサーバーでは、両方でリッスンするSSHサービスが想定されています。 DHCPを使用しているため、ほとんどの非サーバーもパケットまたはrawソケットを表示する必要があります。
2つの異なるコマンドの出力を解釈したくない場合は、netstat
コマンドを_ss -l -A inet
_で置き換えることもできます。 netstatを実行すると、まったく同じオプションがipv6ソケットを除外するため、これは少し残念です。
したがって、単一のコマンドの場合、_ss -l -A inet,packet ...
_を使用できます。
IMOでは、最初のセクションで提案したように_ss -l | grep ...
_を使用することもできます。このコマンドを覚えることは簡単で、ss
の選択オプションでの混乱を招く動作を回避します。
この出力を使用して何かを自動化するスクリプトを作成する場合は、ソケットタイプのpositiveリストでフィルタリングすることをお勧めします。そうしないと、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
_よりもlessソケットを示していますか? _-f inet6
_および_-f inet
_は特殊なケースであり、適切に文書化されていません。
(_-0
_、_-4
_および_-6
_は、_-f link
_、_-f inet
_、および_-f inet6
_のエイリアスです)。
_ss -A packet
_には見出しが表示されますが、ソケットは表示されません。 strace
は、文字どおり何も読み取らないことを示しています。これは、パケットソケットを常に「リッスンしている」ものとして扱うためです。 ss
は、これに関する警告を提供しません。これは、ss
が同時に "リスニング"および "非リスニング"として扱うrawソケットとは異なります。
(_man 7 raw
_は、生のソケットが特定のIPプロトコルにバインドされていないnot特定のプロトコルにバインドされている場合、送信専用であることを示しています。待機ソケットとしてのみ扱われる)