Build of Firewall
 火の壁の構築
バナー

■最近はセキュリティがどうの〜〜(ぉ

会社で防火壁建てられたので,必要になるかどうかはわかりませんがメモ代わりとして記載しておきましょう.

ここでは FreeBSD でよく使われる (?) ipfw で防火壁を構築し,防火壁内へのマシンへの特定ポートのリダイレクト (データの受け渡し) は natd のオプションで設定します.

■ipfw ワンポイント

まずは The FreeBSD Project (Japan) (以下本家と呼称) で ipfw のヘルプをよ〜〜〜っく見てから ipfw を使うゲートウェイマシンで設定しましょう.
でないと作業途中にたたき落とされる場合があります (経験者語る).

ここでは ipfw コマンド使用前にする諸手続 (カーネルの再構築など) は説明せず,ipfw コマンドの実用使用方法を説明しています.
ipfw コマンド使用前の諸手続は本家の ipfw 説明書に書いてあります.

ipfw の「どのパケットを通してどのパケットを通さないか」という「ルール」は,数字の若いルールが最優先になります.
たとえば

00100 divert 8668 ip from any to any via ed2
00150 allow ip from any to any via lo0
00200 deny ip from any to 127.0.0.0/8
65000 allow ip from any to any
65535 deny ip from any to any

これは ipfw を導入した時の一番はじめの設定です.
65535 で全てのプロトコル (ip)全てのルートから来る (from any to any) パケットを破棄する (deny) 設定になっていますが,65000 で全てのプロトコル (ip)全てのルートから来る (from any to any) パケットを通す (allow) 設定になっているので,パケットの破棄情報は数字の若い 65000 で上書きされる形になります.
ここは重要なので覚えて置いてください.

■ここで使う鯖の構成

  • ed1:IP - 1.2.3.4
  • ed2:IP - 192.168.1.1

    ■実際に壁を作ってみる

    1.必要な穴を書き出す
    まず,どのポートに穴を開けるかを調査します.
    ipfw の設定では不必要な穴を閉じてゆくという手法を取らず,必要な穴を開けていく手法が必要なので事前調査が必要になります.
    (これは開ける穴の数が閉じる穴の数より絶対的に少ないからです)

    基本的には

  • FTP
  • SMTP
  • POP
  • HTTP
  • DNS

    これに

  • Telnet
  • SSH

    等を含めておくと幸せになれるかも知れない.

  • 1.穴を閉じてから開ける
    手始めに・・・.
    鯖で設定してください.(^^;
    クライアントから設定してもいいのですが,そうすると 23番が閉鎖された時点でクライアントが鯖から切り離されるので結局は鯖まで走らないとダメです.(笑 / 結構走りました(ぉ))

    火の壁の基本は「表からのパケットを全てブロックし,中からのパケットはブロックしない」というのが基本パターンです.
    しかしそうすると Web は散歩できないわメールは送れないわ ICQ はできないわ (ぉぃ) で結構大変になります.

    そこで,通常は外から中へ入ってくるパケットを全てブロックし,必要な物だけブロックしないという手段を踏んでいきます.

    [ とりあえず穴の閉じ方 ]
    # ipfw add deny tcp from any to 123.45.67.89 20-21

    やっていることは

  • deny:穴を閉じる
  • tcp:tcp パケットが該当
  • from any to [IP ADDRESS] [PORT]:全ての鯖から (any) [IP ADDRESS] の [PORT] のデータ

    つまり上記例を説明すると,

    全ての鯖から 123.45.67.89 の 20 〜 21 に飛んでくる TCP パケットは全てブロック

    ということになります.

    で,実例.
    以下は /etc/rc.firewall 内に記述することを前提にします.

    00010 allow tcp from any to 1.2.3.4 80   # 防火壁上で httpd を起動するときに必要
    00100 divert 8668 ip from any to any via ed2
    00100 allow ip from any to any via lo0
    00200 deny ip from any to 127.0.0.0/8
    00250 allow tcp from any to any established   # クライアントからリンクを張る分に関しては全て許可
    00400 allow tcp from any to any 20,21 setup
    00600 allow tcp from 192.168.1.0/24 to 192.168.1.2
    00700 allow tcp from any to any 25 setup
    00701 allow udp from any to any 25
    00710 allow tcp from any 25 to any 1024-65535
    00711 allow tcp from any 1024-65535 to any 25
    00800 allow tcp from any to any 110 setup
    00900 allow tcp from any to any 53 setup   # 辞書引きがどうやってもうまくいかない場合は設定
    00901 allow udp from any to any 53         # 辞書引きがどうやってもうまくいかない場合は設定
    01000 allow tcp from any to any 80 setup
    01100 allow tcp from any to any 22         # SSH 用
    02000 allow tcp from any to any setup
    65000 allow tcp from any to any 1024-65535
    65001 allow udp from any to any 1024-65535
    65535 deny ip from any to any
    

    ここで ipfw の説明書を見た方なら「おや?」と思う節があるかも知れません.

    じつは TCP パケットと UDP パケットを指定する際,ALL と指定すれば TCP と UDP,さらに ICMP も指定することになり,これらを全てブロックすることができます.
    しかし ALL オプションを使うと ipfw がエラーを吐き,ALL と同じ属性をもつ IP オプションを指定しても同じ事になったので,しかたなく TCP と UDP をわけて指定してあります.
    もし貴方の環境で ALL または IP オプションが使えるので有ればそちらを使った方がスマートです.

    この設定でとりあえず外からの侵入が防げ,中からの脱出は容易にできます.
    確認方法は誰かに外からポートスキャンしてもらい,そのログを見ると良いでしょう.
    私も会社の防火壁は先輩に頼んでポートスキャンしてもらいました.
  • ■今度は貫通穴を開ける

    これは natd の -redirect_port オプションを使用します.
    natd は設定ファイルを読み込めますので,-config オプションを使用して設定ファイルを読み込むようにすると rc.conf が汚くならずにすみます.

    [ /etc/natd.conf ]
    #
    # natd 設定ファイル
    #
    # 先頭の # はコメントを意味します.

    redirect_port tcp 192.168.1.10:80 8080
    # redirect_port [TCP/UDP] [ADDRESS]:[SRV_PORT] [IN_PORT]

    上記ファイルを新規で作成した後,rc.conf の natd_flags を

    natd_flags="-log -same_ports -config /etc/natd.conf"

    のようにします.
    今すぐに設定し直したい場合は一度 natd を殺してから上記オプション付きで起動すると貫通穴があきます.

    上記 natd.conf の例では,

    redirect_port [許可するプロトコル / TCP もしくは UDP] [防火壁内のクライアント IP]:[貫通穴の番号] [外からの穴番号]

    になっています.
    詳細を説明すると

    • [許可するプロトコル / TCP もしくは UDP]
      TCP プロトコルと UDP プロトコルのどちらを貫通させるかを指定します.
    • [防火壁内のクライアント IP]
      外からのポート番号にリダイレクト (パケットの行き先を変更) したいクライアントの IP アドレスを指定します.
    • [貫通穴の番号]
      外からのポート番号にリダイレクト (パケットの行き先を変更) したいクライアントのポート番号を指定します.
    • [外からの穴番号]
      反応させるポート番号を指定します.
    上記設定ファイルの例では,

    防火壁の 8080番に入ってきたパケットは 192.168.1.10 の 80番へリダイレクトする

    という風になります.
    もし防火壁内で TNChat 鯖を起動したい場合は

    redirect_port tcp 192.168.1.10:30000 30000
    redirect_port tcp 192.168.1.10:30001 30001

    という風にすれば,192.168.1.10 のクライアントで 0ch と 1ch で TNChat 鯖を起動できます.


  • ←戻る Made with PC-9821Xa/U8W "Wyvern" Go to NEC Web Page
    Made by HyperEdit for Windows Go to HyperEdit Web Page