IPfilterでマルチホーム

メモっとかないとまた忘れる。

あるホストAにネットワークインタフェースが2つある。

ネットワーク構成はこんな感じ。主回線と副回線がある。

〜〜 主回線 ---[router1]
                  |
		(if1)
         [ global-1.add.re.ss ] ↑
	 [  host  A           ] defaultrouteは主回線
         [  192.168.0.1       ]
                (if2)
		  |
          +-------+-------+
	  |  private LAN  +-□
	  |192.168.0.0/24 +-□
          +-------+-------+
                  |
         [ 192.168.0.2        ]
	 [  host  B           ] defaultrouteは副回線
         [ global-2.add.re.ss ] ↓
                  |
	       [router2]--- 副回線 〜〜〜

router1, router2がルーターでない場合(ぶろ〜どばんどるうたあ)は、 host-A, host-B にはglobalアドレスは付けられないことが多いので、NATで外に 出て行くかもしれないがそれでもええ。このようなときに、

主回線に継っている host-A に裏回線から入る道筋を作る

のが目的。どういうことかというと、回線負荷分散や、回線ダウン時のために 主サーバである host-A に裏回線からログインできるようにする。 以下、方法。

  1. 副回線用の route2 から host-A へのポートフォワードを張る
  2. host-A に裏回線から入ってきたパケットの帰り道を host-B にする

1だけではうまく行かない。なぜなら、裏回線から入って来たパケット は、外部ネットワークからのものなので、帰りのパケットが host-A の defaultroute に従い、表回線から出て行こうとする。それではだめなので 裏から来たパケットの返しも裏に返すようにする。

以下、すこし具体的に。

  1. 副回線用の route2 から host-A へのポートフォワードを張る

    これはルータの設定でおこなう。Web画面からできるようなルータなら

    ProtocolTCP
    Public port8022
    LAN server address192.168.0.1
    LAN server port22

    てなぐあいにすれば良かろう。もしルータがUnixならやはり ルータ上の ipnat(/etc/ipnat.conf等)で、

    rdr fxp0 0/0 port 8022 -> 192.168.0.1 port 22 tcp
    

    って感じ? これで、裏回線から裏ルータ(または 裏回線用サーバ)にきた tcp 8022 番ポートへのパケットが host-A に フォワードされる。問題は帰り道。

  2. host-A に裏回線から入ってきたパケットの帰り道を host-B にする

    主回線から来る外部ネットワークからのパケットは if1 に届く。 if2は Private LAN 用なので、裏口がなければ 192.168.0.0/24 の パケットしか流れない。これがポイント。もし 192.168.0.0/24 以外への パケットを if2のアドレスから返さないと行けないとしたら、それは裏口 から来たパケット。ということで、ソースアドレスが if2 のもので、宛 先アドレスがLAN以外当てのパケットを出すときは、普通にルーティング させるのではなく、host-B(またはrouter2)に送ってしまおう。

いじょ。

でもこの手法だと回線2本の場合しか対応できんな。

裏回線が2本以上あった場合はどうしたらいいだろう。あ、思いついた。

2本目の裏回線を回線Cとしよう。host-A のLAN用インタフェース if2 に、 回線Cからフォワードされたパケットに応答するためだけのaliasアドレスを もういっこ付けちえばよさそうだ。

# ifconfig if2 alias 192.168.0.100 netmask 255.255.255.255

そして、回線C用のルータ router3 からポートフォワードするときは

ProtocolTCP
Public port10023
LAN server address192.168.0.100
LAN server port22

のようにaliasアドレス192.168.0.100に送る。で、ipf.confにて

pass out quick on if1 to if2:192.168.0.2 from 192.168.0.1 to ! 192.168.0.0/24 
pass out quick on if1 to if2:回線C直結ホスト from 192.168.0.100 to ! 192.168.0.0/24 

これでよい。


Generated with mkdiary.rb
yuuji@example.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]