ファイアウォール
ファイアウォールはいくつもの種類があります。有名なのは、「パケットフィルタリングファイアウォール」、「アプリケーションゲートウェイ」、「プロキシーファイアウォール」の3つです。今回は理解しやすいパケットフィルタリングファイアウォールについて解説します。
パケットフィルタリングファイアウォールとは、IPパケットやUDPデータグラムの情報に基づいて、通信の許可/不許可をコントロールする方法です。今まで解説してきたように、TCP/IPでは通信相手を示す送信元/宛先IPアドレスと、サービスの種類を示す送信元/宛先ポート番号を指定して通信を行います。この情報に基づき、パケットの通過を許可/不許可することにより、不完全ではあるもののある程度のセキュリティ対策になります。
例えば、遠隔地にある端末から、ローカルネットワークに存在する端末に直接接続されると大変危険です。なぜなら、その端末にある個人情報の強奪、盗聴、端末の破壊、他の端末に対して不正行為をするためにその端末を踏み台にする・・・など、あらゆる危険が生じるからです。
これを実現する方法として、IPパケットもしくはUDPデータグラムの送信元IPアドレスと宛先IPアドレスを調べて、外部から送られてきたパケット/データグラムをルータが破棄することが考えられます。これがパケットフィルタリングファイアウォールの考え方です。パケットフィルタリングファイアウォールを使用すると、そういった危険を防ぐために、ローカルネットワーク内でのみFTPサーバにアクセスするなど、柔軟な処理ができます。
サンプルプロジェクト「FirewallTest」を用意しましたのでそれを元に解説を行います。
//Routerクラスからの抜粋 public class Router { //IPアドレスで指定した宛て先にして、インターネット上へデータを送信します。 public void Send ( IPv4Address ruterAddress, Frame data ) { //データが許可されているかチェック if ( this.CheckPermission( data ) == false ) { //データを破棄 this.OnDestroyData( new DataFlowEventArgs( data ) ); } else { //インターネットを通じてデータを送る this.OnSendData( new DataFlowEventArgs( data ) ); this.net.SendData( this, ruterAddress, data ); } } //LAN内のホストへデータを送信します。 private void SendToLAN( Frame data ) { //データが許可されているかチェック if ( this.CheckPermission( data ) == false ) { //データを破棄 this.OnDestroyData( new DataFlowEventArgs( data ) ); } else { //データを送信 this.OnSendData( new DataFlowEventArgs( data ) ); this.m_lan.Send( data ); } } //指定したデータが許可されているのかチェックします。 private bool CheckPermission(Frame data) { //IPパケットでない場合は無視 IPv4 packet = null; InformationGetter.GetPacket( data, out packet ); if ( packet == null ) { return true; } //許可をチェック Transport transObj = packet.UserData; foreach ( PermissionElement element in this.permissionList ) { if ( element.SourceAddress == packet.SourceAddress && element.DestinationAddress == packet.DestinationAddress && element.SourcePortNumber == transObj.SourcePortNumber && element.DestinationPortNumber == transObj.DestinationPortNumber ) { return true; } } //許可しない return false; } }
'Routerクラスからの抜粋 Public Class Router 'IPアドレスで指定した宛て先にして、インターネット上へデータを送信します。 Public Sub Send(ByVal ruterAddress As IPv4Address, ByVal data As Frame) 'データが許可されているかチェック If Me.CheckPermission(data) = False Then Me.OnDestroyData(New DataFlowEventArgs(data)) Else 'インターネットを通じてデータを送る Me.OnSendData(New DataFlowEventArgs(data)) Me.net.SendData(Me, ruterAddress, data) End If End Sub 'LAN内のホストへデータを送信します。 Private Sub SendToLAN(ByVal data As Frame) 'データが許可されているかチェック If Me.CheckPermission(data) = False Then Me.OnDestroyData(New DataFlowEventArgs(data)) Else 'データ送信 Me.OnSendData(New DataFlowEventArgs(data)) Me.m_lan.Send(data) End If End Sub '指定したデータが許可されているのかチェックします。 Private Function CheckPermission(ByVal data As Frame) As Boolean 'IPパケットでない場合は無視 Dim packet As IPv4 = Nothing InformationGetter.GetPacket(data, packet) If packet Is Nothing Then Return True End If '許可をチェック Dim transObj As Transport = packet.UserData For Each element As PermissionElement In Me.permissionList If element.SourceAddress = packet.SourceAddress And _ element.DestinationAddress = packet.DestinationAddress And _ element.SourcePortNumber = transObj.SourcePortNumber And _ element.DestinationPortNumber = transObj.DestinationPortNumber Then Return True End If Next '許可しない Return False End Function End Sub End Class
このサンプルプロジェクトは、同じローカルネットワーク内に属する端末と、他のローカルネットワークに属する端末が、サーバ宛データを送信しています。パケットフィルタリングファイアウォールの設定により、他のローカルネットワークに属する端末からのデータを遮断している点に注目してください。
サンプルを実行すると、コンソール画面の最後の行で、サーバAが受信したメッセージが表示されず、代わりにデータが破棄されたことが示されるので、確認してください。
以上で、複数の層にまたがる重要な技術に関する解説が終わりました。次ページからは、仮想ネットワークの仕様についての解説をします。