ステートフルインスペクション

 ここでは、厳密に戻りのパケットを指定するステートフルインスペクションという手法を説明してゆきます。この手法では、TCPヘッダの中もを詳しくチェックします。

TCPヘッダは、次のように構成されています。

TCPの通信では、コードビット部の「ACK」を見て、通過させるか遮断するかの判断し、さらにシーケンス番号を確認します。

 このシーケンス番号とは、受け取ったパケットを元通りに組み立てるために必要な番号です。パケットを送った順番通りに相手に届かないことがあるため、TCPでは、この番号を利用して並び替えを行っています。

 ステートフルインスペクションを実装するファイアウォールでは、通過するパケットのシーケンス番号を見て、次に戻ってくるパケットのシーケンス番号を予測して、予測した番号と異なる値のパケットを受信したら破棄するように動作します。

 ステートフルインスペクション機能を実装するファイアウォールでは、このシーケンス番号を確認するだけのものから、パケット内のデータ部分まで確認するものまで様々な製品があります。

フィルタリングに必要な情報

 ファイアウォールを設定するには、フィルタリングテーブルを定義してゆく必要があります。この時、アプリケーションがどのように通信を行うのか、通信の手順の流れや、特徴を把握しておかなければ、フィルタリングの条件を定義することができません。

 つまり、ファイアウォールのフィルタリングを定義するには、アプリケーション固有の通信を理解しておく必要があるのです。

TCP・UDPのポート番号を把握する

多くのアプリケーションでは、通信にトランスポート層のプロトコルとして、TCPもしくは、UDPを用いています。

 まず、使用するアプリケーションがTCPを使った通信を行うのか、UDPを使った通信を行うのか、また、どのポート番号を使用するのかを知っておく必要もあります。

主な、TCP・UDPのポート番号は、下の表の通りです。

TCPのウェルノウンポート
ポート番号サービス名説明
20ftp-dataFile Transfer [Default Data]
21ftpFile Transfer [Default Data]
22sshSSH Remote Login Protocol
23telnetTelnet
25smtpSimple Mail Transfer
53domainDomain Name Server
67bootpsBootstrap Protocol Server
68bootpcBootstrap Protocol Client
70gopherGopher
79fingerFinger
80www-httpWorld Wide Web HTTP
88kerberosKerberos
110pop3Post Office Protocol – Version 3
119nntpNetwork News Transfer Protocol
123ntpNetwork Time Protocol
137netbios-nsNETBIOS Name Service
138netbios-dgmNETBIOS Datagram Service
139netbios-ssnNETBIOS Session Service
161snmpSNMP
162snmptrapSNMPTRAP
179bgpBorder Gateway Protocol
443httpshttp protocol over TLS/SSL
445microsoft-dsMicrosoft-DS
636ldapsldap protocol over TLS/SSL
UDPのウェルノウンポート
ポート番号サービス名説明
53domainDomain Name Server
67bootpsBootstrap Protocol Server
68bootpcBootstrap Protocol Client
69tftpTrivial File Transfer
88kerberosKerberos
123ntpNetwork Time Protocol
137netbios-nsNETBIOS Name Service
138netbios-dgmNETBIOS Datagram Service
139netbios-ssnNETBIOS Session Service
161snmpSNMP
162snmptrapSNMPTRAP
213ipxIPX
445microsoft-dsMicrosoft-DS
520routerRIP
546dhcpv6-clientDHCPv6 Client
547dhcpv6-serverDHCPv6 Server

TCPのスリーウェイハンドシェイクの仕組みを把握する

 TCPでは、スリーウェイハンドシェイクという仕組みで、同期をとることで通信を行っています。具体的には、下記の手順でSYN(同期制御ビット)と初期シーケンス番号で構成されるパケットを交換することで行われます。

手順内容
手順1送信元が相手に対して、「SYNパケット」を送信する。
手順2SYN パケットを受け取った相手は、送信元に接続を許可する「SYN,ACKパケット」を送信する。
手順3SYN ACK パケットを受けとった送信元は、接続開始をあらわす ACK パケットを送信し、受信側との通信を開始する。

フィルタリングの条件を指定する際に、「ACK」や「SYN」を確認するかどうかを指定することができます。

アプリケーション固有の通信を理解する

 一般的なフィルタリングの条件の指定には、送信元と宛先のIPアドレスやポート番号を指定してフィルタリングの条件を指定したり、TCPのスリーウェイハンドシェイクのステータスをチェックするように条件を作成します。

しかし、アプリケーションの中には、複雑な通信を行うプロトコルも存在します。

たとえば、FTPです。

FTPの通信は、次のような特徴を持っています。

・制御用とデータ転送用の2つのTCPコネクションを使用する。
・サーバ側では、制御用にTCPのポート番号21が、データ転送用にTCPの20が使用される。
・最初にクライアント側から制御用コネクションを張る。
・サーバ側がデータ転送用コネクションのコネクションを張る。

このようにFTPでは、複雑な通信を行っています。

 ファイアウォールの設定では、この複雑なコネクションを遮断しないように通過させる条件を設定してゆくこととなります。

フィルタリングにおける留意点

 ファイアウォールのフィルタリングの条件を指定するには、アプリケーション固有の通信を理解したうえで定義してゆくことが重要となります。コネクションを張るために必要なパケットを遮断したのでは、アプリケーションの通信が成立しなくなってしまうからです。