IP空間飛び地実験(IPアドレスの飛び地を作る)
〜プライベートセグメントにグローバル空間を置く〜
最終更新日:14/11/25 JST
1.アドレスの空間異なるセグメントにIPアドレス的な飛び地を作るとは?
下図のようにプライベートアドレスセグメント(192.168.0.0/24)にグローバルアドレスを与えた計算機(hostA,hostB)を設置する。
アドレス空間的に見ればプライベートアドレス側にグローバルアドレス(202.224.193.28,202.224.193.27)があたかも飛び地のように存在する。
ここからInternetにアクセス出来るようにするのが本目的である。
以前はOpenBSD側でdc0とrl0をブリッジ構成してしていたがプライベート側に不要なパケットまで流入するのでセキュリティを確保するためにフィルタルールを大量に書かねばならなった。
これが意外に手間。限定出来れば労力が少くて済む。
2.手段および前提条件
「IP空間飛び地」を実現するためにProxy ARPを使ってプライベート側にグローバルIPのパケットを飛ばす。
具体的には
OpenBlockS266(以下OBS266)にてパケットの中継をする。
本来はOpenBSDでやりたかったのだがLinuxのarpのようにインターフェイス毎に設定出来なかったのでBSDのarpよりキメ細かい設定が出来るLinuxを使った。
また、OBS266のEthernet-I/Fは以下のようになっているものとする。
eth1 IP 202.224.193.30 MAC 00:0A:85:01:88:77
eth0 IP 192.168.0.9 MAC 00:0A:85:01:08:77
3.設定
arp -i eth1 -s 202.224.193.28 00:0A:85:01:88:77 pub
arp -i eth1 -s 202.224.193.27 00:0A:85:01:88:77 pub
グローバル側からプライベート側に設置してある計算機(202.224.193.28および202.224.193.27)へのアクセスがあったらOBS266が、それらの代わりにeth1のMAC(00:0A:85:01:88:77)を回答してARP解決する。(ProxyARP応答)
さらに以下を設定。
arp -i eth0 -s 202.224.193.25 00:0A:85:01:08:77 pub
arp -i eth0 -s 202.224.193.26 00:0A:85:01:08:77 pub
arp -i eth0 -s 202.224.193.29 00:0A:85:01:08:77 pub
プライベート空間に設置してあるグローバルIPを持つ計算機がInternetに行くためには
少なくともゲートウェイである202.224.193.25にパケットを渡さねばならない。*1
しかし、202.224.193.25は、あっち側にあるのだからOBS266が中継せにゃならん。
よってeth1側同様にeth0側にも上記のような設定が必要なのである。
なお、202.224.193.26および202.224.193.29も設定してあるのはWWWなど各種サーヴァなのでプライベート側の202.224.193.27および202.224.193.28からそれらに直接接続出来るようにするためである。
(ゲートウェイがリダイレクトしても良いのだがパフォーマンスが落るのは嫌ですから)
*1:
hostAやhostBにてデフォルトゲートウェイを192.168.0.9にすれば良いような気もするがインターフェイスにグローバルIPを設定してしまうと異なるアドレス空間のゲートウェイ(この場合は192.168.0.9)の設定が出来無い。
ルーティング設定。
以上でパケットを受け付ける準備は出来た。
しかしパケットを受け付けるだけでは中継出来ないので適切なルーティングを設定してやる。
OBS266上で192.168.0.0/24側にあるグローバルIPな端末全てについて下記設定を行う。
route add -host 202.224.193.28 gw 192.168.0.9
route add -host 202.224.193.27 gw 192.168.0.9
以上でOBS266上での設定は全て終了である。
実際には管理上もう少し複雑なルーティング設定しているが基本的には上記設定で運用している。
あとは該当する端末で適切な設定を行なう。
4.プライベート側に設置されたグローバル計算機の設定
グローバル空間側に設置してあった時と全く同じで良い。
例えば202.224.193.28上においてはデフォルト経路を202.224.193.25に向ける設定をするだけで良い。
基本的にそれ以上の設定は不要。
あとはOBS266が良きにはからってくれる。
プライベート側にいながらグローバル側にあるのと同じ感覚で操作が可能。
5.考察
- BSDの場合は?
CHOPARPを使えば実現可能かも知れない。
- セキュリティについて
ARP Poisoningされたらアウト
- もっと楽な方法は?
ProxyARPのようなスケーラビティが無いテクノロジーを使うのではなくCIDRを上手く使えば可能と聞いたことがある。
どうすれば出来るの?
教えて偉い人!
Copyright(C)2005,Shinichi KAYANUMA/STEEL Communications AllRightsReserved.
E-mail:shin@steel-communications.net