ポート番号
ポート番号(ポートばんごう)とは、コンピュータがデータ通信を行う際に通信先のプログラムを特定するための番号のことである。
概要
ネットワーク上でコンピュータ(計算機)同士がデータを交換するプロトコルの一つであるTCP/IPにおいては、IPアドレスにより通信相手のコンピュータを指定するが(IP・ネットワーク層)、そのコンピュータ上で動いている複数のプログラムのうちの一つを通信相手として指定するために、ポート番号を用いる(TCPやUDP・トランスポート層)。指定できる番号の範囲はTCPやUDPなどの通信の種類毎にそれぞれ 0 から 65535(16ビット符号無し整数)と定められている。 これらの番号と、TCPやUDPなどの通信プロトコルの指定との組み合わせで特定される、論理的な通信の口をポートと呼ぶ。
IPアドレスを建物の住所にたとえるなら、ポート番号は部屋番号に相当する。 ポート(Port)の語源は,船舶の左舷,すなわち,荷出入り口であって,旅客航空機もそれにならって左側に搭乗口がある。つまり,ポート番号とは,出入り口番号を意味する。 そう。 ポート番号とはポストと同様の存在である。
ポートとソケット
プログラムでポートを用いて通信するには、一般にソケットと呼ばれる仕組みを用いる(ソケットはBSDで開発されたため、特にBSDソケットとも呼ぶ)。ソケットとは通信の端点のことで、2台のコンピュータが通信しているとき、その通信路の両端、すなわちそれぞれのコンピュータにソケットが存在する。また、ソケットのインターフェースやソケットを扱うライブラリプログラムも併せてソケットと呼ぶこともある。
ソケットを用いた通信は、以下のような手順で行われる。
- サーバ機でサービスを提供するプログラムは、ソケットを作成し、サービス固有のポート番号をソケットに割り当て (bind)、待ち行列を用意し (listen)、クライアントからの接続を待ち受ける (accept)。
- サービスを利用するクライアントプログラムは、ソケットを作成し、そのソケットの通信相手としてサーバ機のIPアドレスとサービスのポート番号を指定し (connect)、接続を行う。
- サーバは接続を受け付けると、新規にソケットを作成し、そのソケットとクライアントとの間に通信を確立する。もとのソケットは再び待ち受けに戻る(これは、会社などで、受付係が来客を担当者に引き合わせ、その後また受付に戻るようなものと考えることができる)。
- 通信が終わると、2.および3.で作成したソケットは破棄される。
これらの手順に沿って通信を行うプログラムの形式は、ソケットプログラミングと呼ばれる。
WWW (HTTP) の場合、原則としてHTMLファイルや画像ファイルを1件取得するたびに上記2.~4.の手順が繰り返されるため、アクセスが集中するとサーバの負荷が非常に高くなる(ただしHTTP 1.1では1回の接続で複数件のデータを取得する動作がデフォルトとなっている)。
このように、ポート番号とはサーバ上のサービスを特定するための番号であるといえる。そのため、サーバ側のポート番号は重要であるが、クライアント側のポート番号は通常問題とされず、空いている番号を適当に自動で割り当てる。
なお、上記手順の3.で作成されるソケットは、待ち受け用のソケットと同じIPアドレス・ポート番号・プロトコル (TCP/UDP) を有する。 すなわち、1台のサーバ機に、同じIPアドレス・ポート番号・プロトコルのソケットが複数存在し得る(ポートとソケットは一対多の対応となり得る)ことに注意が必要である。 この様子は、同時に複数の相手と通信を行っているWebサーバなどで、netstatコマンド(ソケットの通信状況を表示するコマンド)を実行してみるとよくわかる。
$ netstat tcp4 0 0 xxx.yyy.zzz.www.80 aaa.bbb.ccc.ddd.39321 ESTABLISHED tcp4 0 0 xxx.yyy.zzz.www.80 eee.fff.ggg.hhh.56047 TIME_WAIT tcp4 0 0 xxx.yyy.zzz.www.80 iii.jjj.kkk.lll.41358 TIME_WAIT tcp4 0 0 xxx.yyy.zzz.www.80 mmm.nnn.ooo.ppp.3356 FIN_WAIT_2 tcp4 0 0 xxx.yyy.zzz.www.80 qqq.rrr.sss.ttt.3355 FIN_WAIT_2
ここでxxx.yyy.zzz.wwwはこのWebサーバ機のIPアドレス、80はWebサーバプログラムのポート番号、右側は各クライアントのIPアドレスおよびポート番号である。
ポート番号の種類
ポート番号は大別して 3 種類に分けられる。
種類 | 範囲 | 内容 |
---|---|---|
WELL KNOWN PORT NUMBERS | 0番 - 1023番 | 一般的なポート番号 |
REGISTERED PORT NUMBERS | 1024番 - 49151番 | 登録済みポート番号 |
DYNAMIC AND/OR PRIVATE PORTS | 49152番 - 65535番 | 自由に使用できるポート番号 |
WELL KNOWN PORT NUMBERは、Internet Assigned Numbers Authority (IANA) が管理している。REGISTERED PORT NUMBERSに関しても、IANAが利便性を考慮して公開している。なお、クライアント側に割り当てられるポート番号など、ユーザが自由にポート番号を使用する場合は、49152番以降を使用する。クライアントのポート番号は俗にエフェメラルポート(短命なポート)と呼ばれる。
1992年まではWELL KNOWNポート番号は1~255までだった。
ただし、これはあくまで指針であり強制力はない。これに従わず勝手なポート番号を用いて通信することも一応は可能であるが、混乱を招くであろう。
なお、Unix系のOSでは、0〜1023番のポートを使用するには、通常、root権限が必要で、予約ポートとも呼ばれる。
代表的な例
以下は、一般的に使用されるポート番号の一覧である。
- TCP/20 : FTP (データ)
- TCP/21 : FTP (制御)
- TCP/22 : SSH
- TCP/23 : Telnet
- TCP/25 : SMTP
- UDP/53 : DNS
- UDP/67 : DHCP(サーバ)
- UDP/68 : DHCP(クライアント)
- TCP/80 : HTTP
- TCP/110 : POP3
- TCP/119 : NNTP
- UDP/123 : NTP
- UDP/137~138 : NetBIOS
- TCP/139 : NetBIOS
- TCP/143 : IMAP
- TCP/443 : HTTPS
- TCP/445 : ダイレクトホスティングSMBサービス
- TCP/587 : Submission(メール送信)
プロトコル名称とポートの対応表は、Unix系OSやMac OS Xでは/etc/servicesに、Windows NT系では%SystemRoot%\System32\drivers\etc\servicesにテキストファイルとして存在する。ただしIANAに登録されているものがすべて記載されているとは限らない。
ポートと不正アクセス
一般に、コンピュータ内には様々なプログラムが動いている。近年は通信処理を行うのに十分な能力を持つコンピュータが安価になったことから、家庭用のパソコン内でもいわゆるサーバ機能を有するプログラムが多数動作している。これらのプログラムはポートを作成して結合を待ち受けているが、プログラムの不備があると、ある特別なデータを受信した時にプログラムが誤作動することがある。悪意を持って巧妙に作られたデータの場合、本来通信データとして送信してはいけない情報(コンピュータ内に隠匿してあるはずのパスワードなど)を勝手に送信してしまうような誤動作をさせられることもある。このような誤作動の元となるプログラムの不備のことをセキュリティホールと呼ぶ。
セキュリティホールのないソフトウェアを用いるのが最善の策であるが、プログラムが人間によって作られるものである限り誤りを完全になくすことはできない。また、セキュリティホールになりえる動作でも用途によっては便利な機能であることがあり、悪意のあるデータが送られてこないことが保証されていればそのソフトウェアを動かしたい場合も多い。
このような場合のために、安全を確保しやすい内部のLANと何者がいるかわからない外部のインターネット網との間の通信に介入し、不正な通信の一部を遮断するということが行われる。この遮断機能をファイアーウォールと呼ぶ。
ファイアーウォールにはいくつかの手法があるが、最も多く用いられているのはソケットのバインドを規制するものである(パケットフィルタ型)。特定のポート番号とのバインドができないようにしたり、逆に特定のポート番号とのバインドしかできないようにすることにより、ユーザが気づかないうちにコンピュータが外部と勝手に通信してしまうのを防ぐのである。また、TCPのように通信回線確立の手順があるプロトコルにおいては、LAN側からインターネット上にあるサーバに対して接続開始を要求するのは認めるが、インターネット側からLAN上のコンピュータへの接続開始の要求は通さないということもよく行われる。
ファイアーウォールはソフトウェアまたはハードウェアの形態を取り、その機能はルーター(LANとインターネットの接続点に位置する)に内蔵されたり、コンピュータ内部に導入されたりする (IDS)。パソコン向けのIDSは特にパーソナルファイアウォールと呼ばれる。
一般論として、ネットワーク経由で記憶媒体を共有する、いわゆる「ファイル共有」を実現するサービスは、処理の高速化などの必要性からプロトコルが単純化されておりセキュリティ面での脆弱性を持つ事が多い。特にMicrosoft Windowsがファイル共有などの実現に用いているNETBIOSと呼ばれるプロトコルは非常に広く用いられているにもかかわらずプロトコルの脆弱性が高いといわれている。このため、NETBIOS用として定義されているポート番号137番〜139番(TCPとUDP)については、インターネットとLANを接続するルータにおいて通信を遮断する事が強く推奨されている。市販のルータでは工場出荷状態でこれらのポートの通信遮断設定が入っている事が多い。
ポートフォワード
近年のインターネットの爆発的な拡大にともない、コンピュータ1台1台を識別するはずのIPアドレスの数がコンピュータの台数よりも遥かに少ないという状況が起こってしまった。IPv6を用いてIPアドレスの数を飛躍的に増加させるという動きもあるが、現状では一つのIPアドレスを複数のコンピュータで使い回すということが行われている。
この際、「電子メールの受信サービスを行うのはAというコンピュータ」「WWWのサービスを行うのはBというコンピュータ」というように、サービス毎に処理をするコンピュータが違うようにするためには、「ポート番号25番の通信はAへ」「ポート番号80番の通信はBへ」というようにポート番号毎に通信先を振り分ければよい。このポート番号による通信コンピュータの振り分けの機能を「ポートフォワード (port forward)」と呼ぶ。
一般に、ポートフォワードはNAPT(ルータによるIPアドレス/ポート変換)やパケットフィルタの機能の一部として実現される。