SS、netstat、tcpdumpなどのプログラムは、すべてポートを識別するとポート番号を名前に変換します。したがって、例えば、ポート22の接続は「ssh」で示される。
このマッピングがどのように実行されるかを知りたいです。私はこれらのプログラムがそれぞれハードコーディングされたマッピングのリストを持っていないと仮定していますか?ネットワーク内のポート番号を名前にマッピングするのに役立つ中央プログラムまたはサービスはありますか?
関連する質問、同じLinuxバージョン(6.9、少し古いバージョン)でSSを実行すると、他の動作が発生します。仮想マシンで同じOSを使用しているベアメタルのポート11001にプログラムをリストし、ポートがMetasysとしてリストされているコマンド「ss -a」をテストしています。この問題を解決するには、スクリプトを変更するのは十分簡単ですが、なぜあるサービスがポート11001を認識し、他のサービスが認識されないのか疑問に思います。
答え1
通常、getservbyport()
APIを使用するとネームサービス額縁。
これは、IPアドレスをホスト名、ユーザー名をユーザーIDなどで解決するのと同じ機能系列です。
getservbyport()
/etc/nsswitch.conf
アイテムを取得するためにデータベース(各カテゴリに使用するデータベースを一覧表示する)を調べるのが一般的ですservices
。
エントリがservices
表示されると、ファイルは前述files
の/etc/services
(ユーザーデータベース)と同様にプレーンテキストファイルとして使用されます/etc/passwd
。files
passwd
他の形式のデータベースを持つこともできます。 GNUシステムに以下がある場合xyz
リストされたデータベースは、libnss_xyz.so
要求時にロードされた共有ライブラリを使用して照会されます。
また、files
一般的なものにはdb
、、、、...が含まれます。nis
nisplus
ldap
単純な展開にはfiles
通常/etc/services
。