SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

仮想ネットワークの実装で学ぶTCP/IP

仮想ネットワーク実装でTCP/IPを学ぼう(6)
― セキュリティの基礎と仮想ネットワークの仕様

仮想ネットワーク実装でTCP/IPを学ぼう(6)


  • X ポスト
  • このエントリーをはてなブックマークに追加

ファイアウォール

 ファイアウォールはいくつもの種類があります。有名なのは、「パケットフィルタリングファイアウォール」、「アプリケーションゲートウェイ」、「プロキシーファイアウォール」の3つです。今回は理解しやすいパケットフィルタリングファイアウォールについて解説します。

 パケットフィルタリングファイアウォールとは、IPパケットやUDPデータグラムの情報に基づいて、通信の許可/不許可をコントロールする方法です。今まで解説してきたように、TCP/IPでは通信相手を示す送信元/宛先IPアドレスと、サービスの種類を示す送信元/宛先ポート番号を指定して通信を行います。この情報に基づき、パケットの通過を許可/不許可することにより、不完全ではあるもののある程度のセキュリティ対策になります。

 例えば、遠隔地にある端末から、ローカルネットワークに存在する端末に直接接続されると大変危険です。なぜなら、その端末にある個人情報の強奪、盗聴、端末の破壊、他の端末に対して不正行為をするためにその端末を踏み台にする・・・など、あらゆる危険が生じるからです。

 これを実現する方法として、IPパケットもしくはUDPデータグラムの送信元IPアドレスと宛先IPアドレスを調べて、外部から送られてきたパケット/データグラムをルータが破棄することが考えられます。これがパケットフィルタリングファイアウォールの考え方です。パケットフィルタリングファイアウォールを使用すると、そういった危険を防ぐために、ローカルネットワーク内でのみFTPサーバにアクセスするなど、柔軟な処理ができます。

 サンプルプロジェクト「FirewallTest」を用意しましたのでそれを元に解説を行います。

パケットフィルタリングファイアウォールを表すサンプル(C#)
//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;
  }
}
パケットフィルタリングファイアウォールを表すサンプル(VB.NET)
'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が受信したメッセージが表示されず、代わりにデータが破棄されたことが示されるので、確認してください。

 以上で、複数の層にまたがる重要な技術に関する解説が終わりました。次ページからは、仮想ネットワークの仕様についての解説をします。

次のページ
仮想ネットワークの概要

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
仮想ネットワークの実装で学ぶTCP/IP連載記事一覧

もっと読む

この記事の著者

インドリ(インドリ)

分析・設計・実装なんでもありのフリーエンジニア。ブログ「無差別に技術をついばむ鳥(http://indori.blog32.fc2.com/)」の作者です。アドバイザーをしたり、システム開発したり、情報処理技術を研究したりと色々しています。座右の銘は温故知新で、新旧関係なく必要だと考えたものは全て学...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/5122 2010/05/26 15:58

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング