ファイアウォール
ファイアウォールはいくつもの種類があります。有名なのは、「パケットフィルタリングファイアウォール」、「アプリケーションゲートウェイ」、「プロキシーファイアウォール」の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が受信したメッセージが表示されず、代わりにデータが破棄されたことが示されるので、確認してください。
以上で、複数の層にまたがる重要な技術に関する解説が終わりました。次ページからは、仮想ネットワークの仕様についての解説をします。


