FreeNASで一つのNICに二つ以上のIP addressを付与する

FreeNASで一つのNICに二つ以上のIP addressを付与する。

現在あるホストに192.168.52.214というアドレスを割り振っているが、(物理的に)同じセグメントにおいてあるマシンとのやりとりは、デフォルトゲートウェイを介さなければならない。

これは、一つのスイッチングハブに複数のL2のセグメント、例えばあるホストは192.168.0.1のアドレスであり、あるホストは192.168.1.1、ということだ。

普通はこんなことにしない。L2スイッチでつながれるのはブロードキャストドメインであるはずであり、各ブロードキャストドメインをつなぐのがルータの役割だからだ。

でもなんかなんとなく、こんな構成にしている。

でもここで問題がある。先述のホスト、192.168.0.1(ホストA)と192.168.1.1(ホストB)が通信するときにすべてお互いのデフォルトゲートウェイとなっているルータを介して通信してしまっていることだ。

これは実はルータを介さず直接通信することができるはず、である。

そのための手段は、

  1. デフォルトゲートウェイがICMPリダイレクトを送信して、それぞれのホストが直接macアドレスをホストA、ホストB宛てにしてやりとりする
  2. ルータからルーティング情報を広告する、もしくは各ホストにスタティックルートを書く。これでデフォルトゲーウェイに投げることなくarp解決を各自のホストで行ってもらう。
  3. arpプロキシでもいけるのかも・・・、しれない。いややっぱり無理っぽい

でもそれぞれには問題がある

  1. デフォルトゲートウェイにあるルータ(RT58i)がICMPリダイレクトを投げてくれない。またデフォルトではICMPリダイレクトを受け取らない(拒否する)ホストがある。
  2. ルーティング情報を設定するのが面倒。ルータから管理セグメント宛ての広告にしても、各ホストでRIPなどの待ち受け(例えばwindowsならRIPリスナ)の設定がたくさんひつようで面倒。静的ルーティングは構成変更とかあると大変そう、というか絶対漏れて通信できなくなってましたっていうホストがでてくる。

といったところでいろいろと躊躇していた。

ところで最近いろいろとホストが増えてきて、セグメント間のネットワーク利用率も高まり、いよいよ通信はルータがボトルネックになってきた。でもこれらのセグメントにはちょっとした特性があった。それは帯域を利用するホストがごく少数に限られていること、だ。

それぞれのセグメントにはそれぞれのデフォルトゲートウェイをおいて、ネットワークを司るサーバ(DNSとかnisとかメールとかwebとか。 dhcpはl2だったので統合されてしまった)がいるんだけど、そいつらへのアクセスが多い。ココで言う多いとはもう一方のセグメントからの通信、すなわちルータの帯域を使う通信が多い、ってことだ。

でも実は、多いといえども帯域的にはそこまで使ってなかった。だから今までそこまで問題視してなかった。所詮はDNSの問い合わせとかypとか、キャッシュされやすい項目だしまぁ許容範囲内だった。でもあるときから状況が変わってしまった。それはNAS/SANの導入だ

NASを導入したんだけどこれって結構お金がかかる。HDDとかマシン代とか。ついでに運営コストも結構こまめに設定いれると面倒だ。だから一元化してしまいたい、してしまった。これによりこのホストには同じ(論理)セグメントからの通信はもちろん、もう一方のセグメントからの通信量も増えてしまった。さてさてここでルータがいよいよ本格的にボトルネックになってしまった。

いよいよ上述の三つのうち、そろそろどれかを解決して直接通信させる必要がでてきたんだけど、ここでyubirdたんからアドバイスが。

「NIC二枚さして別のIP持たせればいいんじゃない?」

なるほど、頭いいです。それをやれば確かに現在の問題は解決する。万事オッケー。でもこれこれには投資が必要だ。

そこで横着な案を思いついた。一つのNICに複数のIPアドレスを設定すればよいのではないか・・・、と。

ところでこのNASはFreeBSDをベースとしたFreeNASで構築されている。中身はまぁFreeBSDだ。ということはFreeBSDでNICへ複数のIPアドレスを持たせてやれ(どうやらこれはエイリアスと呼ばれるらしい)ばよい。FreeBSDとなると情報源も一挙に広がるので対処しやすい。

さてそこでさっくりググって情報を漁る。さっくり見つかる。

rc.conf

ifconfig_lnc0=”inet 192.168.140.129 netmask 255.255.255.0″
ifconfig_lnc0_alias0=”inet 192.168.254.100 netmask 255.255.255.0″
ifconfig_lnc0_alias1=”inet 172.17.10.100 netmask 255.255.0.0″

設定終了後サーバの再起動等を行って設定を反映させます。
FreeBSD-複数IPアドレス設定(alias) — server-memo.net

なるほど、これなら自分にもできそうだ、ということで早速試してみる。とここで問題が。

FreeNASのrc.confってどうやら再起動ごとに書き換わってしまうみたい。ということで手動で(ifconfigをたたいて)できないか試すことになった。

まずは実験前の状態


# ifconfig
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
ether 00:50:xx:xx:xx:xx
inet 192.168.0.1netmask 0xffffff00 broadcast 192.168.52.255
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active

# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: icmp_seq=0 ttl=63 time=0.822 ms
64 bytes from 192.168.1.2: icmp_seq=1 ttl=63 time=0.568 ms

ここでTTLが63になっている。ちなみにICMPリダイレクトがくると二発目ぐらいから64とかになったりする。今回は見てても全然減らない。

tracerouteしてみると


# traceroute 192.168.1.1
traceroute to host002.l3tp.org (192.168.84.2), 64 hops max, 52 byte packets
1  192.168.0.254 (192.168.0.254)  0.703 ms  0.439 ms  0.407 ms
2  192.168.1.2 (192.168.1.2)  0.790 ms  0.470 ms  0.470 ms

やっぱりルータ経由みたい。

さてテキトウにmanみてaliasを与える。


# ifconfig em0 alias 192.168.1.1/24
# ifconfig
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
ether 00:50:xx:xx:xx
inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.52.255
inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.84.255
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active

なんか二行になったwwwうぇっうぇっ。こんなの始めてww。

aliasの後はinetをつけずにIPアドレスを記述。サブネットマスクはnetmask 255.255.255.0でもいいしCIDRでもいいらしい。

pingしてみる


# ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2): 56 data bytes
64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=0.870 ms
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.401 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.308 ms

ちゃんとTTLが64のままだ。


# traceroute 192.168.1.2
traceroute to 192.168.1.2 (192.168.84.2), 64 hops max, 52 byte packets
1 192.168.1.2 (192.168.1.2)  2.449 ms  2.087 ms  0.701 ms

ばっちり。

さてここでaliasの解除してみる。解除のためには-aliasをつけるらしい。


# ifconfig em0 -alias 192.168.1.1

後ろのIPアドレスを指定しないとすべての関連づけ?されているIPアドレスがなくなってしまうので注意。DHCPで配られたアドレスすらなくしてしまった。

ひとまずこれで一つのNICに複数のIPアドレスをつけることができた。

方法は二つ、

  • rc.confにifconfig_em0_alias0=”inet 192.168.1.1″の形で書くこと
  • ifconfigのaliasオプションで設定してやること

これを使ってFreeNASに複数のIPアドレスを付与してみる。

中略

手動で与えて、他のホストからnetperfをかけてみる。


freenas%./netserver
Starting netserver at port 12865
Starting netserver at hostname 0.0.0.0 port 12865 and family AF_UNSPEC

client% netperf -H 192.168.0.1
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.0.1 (192.168.0.1) port 0 AF_INET
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec

65536  32768  32768    9.93       91.26
client% netperf -H 192.168.1.1
TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.1.1(192.168.1.1) port 0 AF_INET
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec

65536  32768  32768    9.90      847.86

別セグメントからはおよそ91Mbp、同じセグメントからは850Mbps出た。

別セグメントだとルータを通過するのでそこのスループットで頭打ちになっているけど、同じセグメント扱いのときはワイヤスピード?にちかい850Mbpsが出た。ばっちりだ!

コメントを残す