メモっとかないとまた忘れる。
あるホスト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だけではうまく行かない。なぜなら、裏回線から入って来たパケット は、外部ネットワークからのものなので、帰りのパケットが host-A の defaultroute に従い、表回線から出て行こうとする。それではだめなので 裏から来たパケットの返しも裏に返すようにする。
以下、すこし具体的に。
これはルータの設定でおこなう。Web画面からできるようなルータなら
Protocol TCP
Public port 8022
LAN server address 192.168.0.1
LAN server port 22
てなぐあいにすれば良かろう。もしルータがUnixならやはり ルータ上の ipnat(/etc/ipnat.conf等)で、
rdr fxp0 0/0 port 8022 -> 192.168.0.1 port 22 tcp
って感じ? これで、裏回線から裏ルータ(または 裏回線用サーバ)にきた tcp 8022 番ポートへのパケットが host-A に フォワードされる。問題は帰り道。
主回線から来る外部ネットワークからのパケットは if1 に届く。 if2は Private LAN 用なので、裏口がなければ 192.168.0.0/24 の パケットしか流れない。これがポイント。もし 192.168.0.0/24 以外への パケットを if2のアドレスから返さないと行けないとしたら、それは裏口 から来たパケット。ということで、ソースアドレスが if2 のもので、宛 先アドレスがLAN以外当てのパケットを出すときは、普通にルーティング させるのではなく、host-B(またはrouter2)に送ってしまおう。
ipfw add fwd host-B ip from if2のアドレス to not LANアドレス (上図の例であれば以下のようになる) ipfw add fwd 192.168.0.2 ip from 192.168.0.1 to not 192.168.0.0/24
/etc/ipf.conf
などに書く。
pass out quick on if1 to if2:host-B from if2アドレス to ! LANアドレス (上図の例であれば以下のようになる) pass out quick on if1 to if2:192.168.0.2 from 192.168.0.1 to ! 192.168.0.0/24
いじょ。
でもこの手法だと回線2本の場合しか対応できんな。
裏回線が2本以上あった場合はどうしたらいいだろう。あ、思いついた。
2本目の裏回線を回線Cとしよう。host-A のLAN用インタフェース if2 に、 回線Cからフォワードされたパケットに応答するためだけのaliasアドレスを もういっこ付けちえばよさそうだ。
# ifconfig if2 alias 192.168.0.100 netmask 255.255.255.255
そして、回線C用のルータ router3 からポートフォワードするときは
Protocol TCP
Public port 10023
LAN server address 192.168.0.100
LAN server port 22
のように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
これでよい。