ダウンロード サンプルファイル(C#) (93.3 KB)
ダウンロード サンプルファイル(VB) (110.9 KB)
ファイアウォール
ファイアウォールはいくつもの種類があります。有名なのは、「パケットフィルタリングファイアウォール」、「アプリケーションゲートウェイ」、「プロキシーファイアウォール」の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が受信したメッセージが表示されず、代わりにデータが破棄されたことが示されるので、確認してください。
以上で、複数の層にまたがる重要な技術に関する解説が終わりました。次ページからは、仮想ネットワークの仕様についての解説をします。
この記事は参考になりましたか?
- 仮想ネットワークの実装で学ぶTCP/IP連載記事一覧
-
- 仮想ネットワーク実装でTCP/IPを学ぼう(7) ― GDI+と独自プロトコルの定義
- 仮想ネットワーク実装でTCP/IPを学ぼう(6) ― セキュリティの基礎と仮想ネットワーク...
- 仮想ネットワーク実装でTCP/IPを学ぼう(5) ― アプリケーション層の勘所
- この記事の著者
-
インドリ(インドリ)
分析・設計・実装なんでもありのフリーエンジニア。ブログ「無差別に技術をついばむ鳥(http://indori.blog32.fc2.com/)」の作者です。アドバイザーをしたり、システム開発したり、情報処理技術を研究したりと色々しています。座右の銘は温故知新で、新旧関係なく必要だと考えたものは全て学...
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア


