services は、人が分かりやすい形のインターネットサービスの名前と、 それらのサービスに割り当てられたポート番号や プロトコル種別の対応関係が書かれているテキストファイルである。 ネットワーク上で動作するプログラムはすべて、 そのサービスに対応するポート番号 (とプロトコル) を得るために、 このファイルを調べる必要がある。 C ライブラリ関数である getservent(3), getservbyname(3), getservbyport(3), setservent(3), endservent(3) を利用することで、プログラムはこのファイルを調べることができる。
Man page of SERVICES
Cライブラリ関数がサービス名からポート番号を取得したり、ポート番号からサービス名を取得したりするのに使われるらしい。
netstat を実行すると、
% netstat -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 oel11gr2.yoheia.com:2208 *:* LISTEN tcp 0 0 *:1006 *:* LISTEN tcp 0 0 *:sunrpc *:* LISTEN tcp 0 0 oel11gr2.yoheia.com:ipp *:* LISTEN tcp 0 0 oel11gr2.yoheia.com:smtp *:* LISTEN tcp 0 0 oel11gr2.yoheia.com:2207 *:* LISTEN tcp 0 0 *:ssh *:* LISTEN
「ssh」とかサービス名が表示される。これって、/etc/services から取ってきてるかも。
strace でオープンしているファイルを調べてみる。
% strace -e open netstat -a ... open("/etc/services", O_RDONLY) = 4
/etc/services を開いている。
ということは、/etc/services から ssh の行を削除すると、ssh はサービス名で表示されなくなる気がする。
ssh の行をコメントアウトして、
% vi /etc/services #ssh 22/tcp # SSH Remote Login Protocol #ssh 22/udp # SSH Remote Login Protocol
netstat を実行してみると、
% netstat -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 oel11gr2.yoheia.com:2208 *:* LISTEN tcp 0 0 *:1006 *:* LISTEN tcp 0 0 *:sunrpc *:* LISTEN tcp 0 0 oel11gr2.yoheia.com:ipp *:* LISTEN tcp 0 0 oel11gr2.yoheia.com:smtp *:* LISTEN tcp 0 0 oel11gr2.yoheia.com:2207 *:* LISTEN tcp 0 0 *:22 *:* LISTEN
想定通り、ssh と表示されていたところが 22 になった。