Kodama's home / tips.

/etc/services と well known ports

/etc/services の概説

/etc/services には IP 接続のポート番号とサービス名の対応が書かれている. この定義/予約されたサービスは RFC で公開されている. 簡潔にまとまった形では IANA が公開している port-numbers リストで知る事ができる.

/etc/services に書かれたサービス名は /etc/inetd.conf(inetd の場合) 等の設定ファイルで使用される. この意味では, 設定ファイルで参照したいポート名だけが /etc/services に書かれていれば十分だ. たまに, 勘違いを見掛けるが, /etc/services はポート番号とポート名の変換表を提供するだけで, inetd サーバの提供サービスを設定するのは /etc/inetd.conf の役割なのだ. サービスを止める場合には /etc/services ではなく /etc/inetd.conf の該当する項目を削除する. 言い替えれば, /etc/services に項目があるだけではサーバは動かない.

また, /etc/services は netstat, tcpdump, iptraf などの表示で ポート番号をポート名に変換する場合にも使われている. /etc/services に項目が無い場合, ポート番号で表示される事になる. tcpdump, iptref 等でネットワークの状況を調査する場合, できるだけ多くのポート名が /etc/services に書かれている事が望ましい.

ポート番号 0-1023 の範囲は Well Known Ports とよばれ, IANA が定義/管理している. ポート番号 1024-49151 の範囲は Registered Ports とよばれ, 個々に予約されたものを IANA がリスト化している. ここまでの 0-49151 の範囲は, サーバが要求をまちうけるためのポートとして予約されている. ポート番号 49152-65535 は Dynamic Ports とか Private Ports とよばれ, TCP の接続(主にクライアント側)のために一時的に使われる.

well known ports リストから /etc/services を得る方法

port-numbers から /etc/services への書き換え. 余分なものをコメント化しているだけなので, 手作業で切り出しても同じ事だが...

cat port-numbers|tr -d '\r'|gawk '($2~/^[0-9][-0-9]*\/(tcp|udp)$/){print$0;next}{print "# "$0}'

C での /etc/services の参照

C のネットワークプログラミングでは, /etc/services で定義されているサービス番号の参照などは, getservent, getservbyname, getservbyport, setservent, endservent などの関数で行う. servent 構造体(netdb.h) のポート番号は ネットワークバイトオーダーである事に注意.
Kodama's home / tips.