ポート (コンピュータネットワーク)
ポート(port)はIPネットワークの各ホスト上で、複数アプリケーションへ通信を振り分けるために用意された、論理的な情報の送受信口である。TCP・UDPで定義される。
Internet Protocolを用いたネットワークはホスト間通信を可能にする。この場合あるホストへの全信号を1つのアプリケーションのみが受け取るため、単一ホスト上で動作する複数アプリケーションへ同時には通信できない。
これを解決する手法がポートである。IPの上で動作するプロトコルにおいて「ヘッダに記された番号に基づき、このホスト内のある送受信口へデータをルーティングする」という規則を定めれば、1ホスト内複数アプリケーションへ通信を振り分けられる。このホスト内送受信口という概念がポートである。ポートを指定する番号をポート番号(port number)という。ホストのIPアドレスを「マンションの住所」にたとえるなら、ポート番号は「部屋番号」に相当する。ポートの概念を導入することでアプリケーション間通信が可能になる。
ポート番号は、通信プロトコルの種類(プロトコル番号一覧)と密接に関係している。65536個のポート番号のうち、システムポート番号以前はウェルノウンポート番号 (well-known port numbers) と呼ばれていた。と呼ばれる1024個(0 - 1023)は、慣例的に予約され、特定のサービスのために使用される。そのため、ポート番号を参照することにより、その通信が利用しているサービス(ソフトウェア)を知ることができる場合がある。
プログラムでポートを用いて通信するには、一般にソケットと呼ばれる仕組みを用いる(ソケットはBSDで開発されたため、特にBSDソケットとも呼ぶ)。ソケットとは通信の端点のことで、2台のコンピュータが通信しているとき、その通信路の両端、すなわちそれぞれのコンピュータにソケットが存在する。また、ソケットのインターフェイス(API)やソケットを扱うライブラリプログラムも併せてソケットと呼ぶこともある。ソケットを利用したプログラムを記述することをソケットプログラミングと呼ぶ。
ソケットを用いた通信は、以下のような手順で行われる(クライアントサーバモデル)。
サーバ機でサービスを提供するプログラムは、ソケットを作成し、サービス固有のポート番号をソケットに割り当て (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コマンド(ソケットの通信状況を表示するコマンド)を実行してみるとよくわかる(2021-08のGNU/Linuxではiproute2への移行が進んでいるため前述のコマンドよりも$ ss --resolve --tcp --udpなどとしたほうがいいであろう)。
$ 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種類に分けられる。
システムポート (System Ports) 番号(旧称:ウェルノウンポート (Well Known Ports) 番号)は、基本的なシステムサービスやプロトコルで使用される、よく知られたポート番号であり、Internet Assigned Numbers Authority (IANA) が管理している。ユーザーポート (User Ports) 番号(旧称:登録済みポート (Registered Ports) 番号)に関しても、IANAが利便性を考慮して公開している。いずれの用途にも該当しないポート番号を使用する場合は、49152番以降を使用する。
クライアントが用いるポートはエフェメラルポート(短命なポート)と呼ばれる。かつては、動的・私用ポート (Dynamic and/or Private Ports) の範囲のポート番号を用いることが一般的であったが、 RFC 6056 によって現在では1024から65535までの範囲を用いるべきとされている。
1992年まではウェルノウンポート番号は1〜255までだった。
ただし、これはあくまで指針であり強制力はない。これに従わず任意のポート番号を勝手に用いて通信することも技術的には可能だが、使用するポートが意図せず重複した場合、不具合を起こす可能性がある。
なお、Unix系のOSでは、0〜1023番のポートを使用するには、通常、root権限が必要で、予約ポートとも呼ばれる。
一般に、コンピュータ内には様々なプログラムが動いている。近年は通信処理を行うのに十分な能力を持つコンピュータが安価になったことから、家庭用のPC内でもいわゆるサーバ機能を有するプログラムが多数動作している。これらのプログラムはポートにバインドされたソケットを作成して接続を待ち受けているが、プログラムの不備があると、ある特別なデータを受信した時にプログラムが誤作動することがある。悪意を持って巧妙に作られたデータの場合、本来通信データとして送信してはいけない情報(コンピュータ内に隠匿してあるはずのパスワードなど)を勝手に送信してしまうような誤動作をさせられることもある。このような誤作動の元となるプログラムの不備のことをセキュリティホールと呼ぶ。
セキュリティホールのないソフトウェアを用いるのが最善の策であるが、プログラムが人間によって作られるものである限り誤りを完全になくすことはできない。また、セキュリティホールになりえる動作でも用途によっては便利な機能であることがあり、悪意のあるデータが送られてこないことが保証されていればそのソフトウェアを動かしたい場合も多い。
このような場合のために、安全を確保しやすい内部のLANと何者がいるかわからない外部のインターネット網との間の通信に介入し、不正な通信の一部を遮断するということが行われる。この遮断機能をファイアウォールと呼ぶ。
ファイアウォールにはいくつかの手法があるが、最も多く用いられているのはソケットのバインドを規制するものである(パケットフィルター型)。特定のポート番号とのバインドができないようにしたり、逆に特定のポート番号とのバインドしかできないようにしたりすることにより、ユーザが気づかないうちにコンピュータが外部と勝手に通信してしまうのを防ぐ。また、TCPのように通信回線確立の手順があるプロトコルにおいては、LAN側からインターネット上にあるサーバに対して接続開始を要求するのは認めるが、インターネット側からLAN上のコンピュータへの接続開始の要求は通さないということもよく行われる。
ファイアウォールはソフトウェアまたはハードウェアの形態を取り、その機能はルーター(LANとインターネットの接続点に位置する)に内蔵されたり、コンピュータ内部に導入されたりする (IDS)。パーソナルコンピュータ (PC) 向けのIDSは特にパーソナルファイアウォールと呼ばれる。
一般論として、ネットワーク経由で記憶媒体を共有する、いわゆる「ファイル共有」を実現するサービスは、処理の高速化などの必要性からプロトコルが単純化されておりセキュリティ面での脆弱性を持つことが多い。特にMicrosoft Windowsがファイル共有などの実現に用いているNetBIOSと呼ばれるプロトコルは非常に広く用いられているにもかかわらずプロトコルの脆弱性が高いといわれている。このため、NetBIOS用として定義されているポート番号137番〜139番(TCPとUDP)については、インターネットとLANを接続するルーターにおいて通信を遮断することが強く推奨されている。市販のルーターでは工場出荷状態でこれらのポートの通信遮断設定が入っていることが多い。
IPアドレス枯渇問題の対処方法としては、IPv6を用いる場合もあるが、ネットワークアドレス変換(NAT)も多用されている。
NATを利用する場合、「電子メールの受信サービスを行うのはAというコンピュータ」「WWWのサービスを行うのはBというコンピュータ」というように、処理をするコンピュータをサービス毎に変えるようにするためには、「ポート番号25番の通信はAへ」「ポート番号80番の通信はBへ」というようにポート番号毎に通信先を振り分ければよい。このポート番号による通信コンピュータの振り分けの機能を「ポートフォワード (port forward)」または「ポート転送」と呼ぶ。
類似のパケット転送機能として「DMZ」と呼ばれる機能を持つルーターもある。