『Linux/Debian』 Debian/kFreeBSDマシンで、DHCPで取得した情報を正しく反映されなくて困る事態が発生

非常にレアケースだと思うのですが、Debian/kFreeBSDで構築したzfsなファイルサーバー、DHCPで取得した情報を正確にネットワークインタフェースに反映させなくて、外部との通信や他のマシンとの通信が上手くできない事態が発生してしまいました。
色々と手段を考えて試して解決したのでメモしておきます。

背景

今住んでいる賃貸マンションでは光ネットワークサービスが導入されています。
今はフレッツやau光サービスも利用できますが、私が入渠した当時はNTT系のプロバイダのサービスしか対応しておらず、それを契約して今もずっと使っております。
トータルでみるとかなりお安く済む上に速度もそれなりに出ているので満足はしています。

サービスは2種類あって、一つはプライベートアドレスをもらって通信するサービス。
もう一つは、追加料金は発生するのですが、グローバルIPをもらって通信するサービス。こちらには固定IPと動的IPの2種類に分かれて、固定IPをもらえるサービスを契約して使っておりました。
自宅鯖でWEBを公開するためにです。

ファイルサーバー更新とともに、WEBサーバーをレンタルサーバーに移動させたのを契機に固定IPをもらうサービスを止めて、プライベートアドレスをもらう契約に変更しました。

今までは、自宅鯖がルーターでDHCPサーバーを立ち上げて運用していたのですが、マンション内のルーターがDHCPサーバーを兼ねていてIPアドレスを配ってくれるので、DHCPサーバーはマンション内のを使うようにしました。

その状態で、Debian/kFreeBSDなマシンをファイルサーバーにしてsambaを立ち上げたところ、どうやってもWindowsPCのネットワークの所にファイルサーバーが出てこない。
IPアドレス直うちならアクセス出来る。
コマンドプロンプトでnbtstat -A IPアドレス、をしたあとならマシン名でアクセス出来るようになるが、Windowsネットワークにはマシンは出てこない状態が続く状態になりました。

master browserの設定かと思って試しても改善せず。

色々と調査した結果、ファイルサーバーのサブネットマスクとブロードキャストアドレスが正しく設定されていないことが解りました。

マンション内ネットワーク、各部屋になぜか/23のアドレスを配っているのですが、Debian/kFreeBSDなマシンは、/24として設定しまいます。
Debian/GNU LinuxなマシンやWindowsやMacは/23のネットワークとして設定されています。
普通のFreeBSDではどのような結果になるか試していません。

このため、ファイルサーバーの情報が他のマシンへ正しく伝わらずこのような現象が起きていたのです。
そういえば、Windowsのファイル共有はブロードキャストで情報を伝える仕様だったので、この状態だと他のマシンから見えないのは当然だなと。

この状態でもネットワークインストールやaptでの更新もできていたし、他のマシンからリモートログインもできていたので気がつくのが遅れました。
#インストール時にサブネットマスクがおかしいって気がついていたような気もするけど・・・

解決方法は色々とあるのですが、直球な方法では解決しなかったので、以下、どのようにして解決していったかを書きます。

解決法その1 固定IPにしちゃう

リモートログインする必要もあり、固定IPにするのが最も楽な解決方法です。
が、DHCPサーバーが関与しないIPアドレスがどこか解らないのでバッティングする可能性もあります。

その時はその時でと思って固定IPで設定したところ、Windowsマシンから見えるようになりました。
が、ファイルサーバーから外部にアクセス出来なくなりました。
どうやら、マンションのルーターはDHCPでIPアドレスを配ったPC以外からのアクセスは弾く設定にしてあるようです。

ほとんどの場合、自宅ネットワーク外部へアクセスすることは無いのだけれども、aptが使えなくなるので致命的状況です。

と言うわけで、この解決方法は失敗。

解決方法その2 dhcpclient.confを設定する

ほとんどの場合、これが100%正しい解決方法で、これで解決するはずです。

Debian/kFreeBSDの場合は、/etc/dhcp/dhcpclient.confというファイルを編集してやります。

manで調べると、supersedeでオプションを強制上書きできるとあります。
つまり、dhcpclient.confに

supersede subnet-mask 255.255.254.0;
supersede broadcast-address ブロードキャストアドレス;

を追加してやれば、正しいサブネットマスクとブロードキャストアドレスが設定される事になります。

が、なぜか設定が反映されません。

なんでやねん!

解決方法その3 ifconfigで設定を変更する

こうなると、ifconfigで設定を変更するしかありません。
試しにコマンドプロンプトから

$ifconfig re0 IPアドレス netmask 255.255.254.0 broadcast ブロードキャストアドレス

とやったら解決しました。
当たり前か。

問題はこれを自動でやる方法です。

まずは、以下のスクリプトを書きました。

2014年10月19日追記

このままだとdefault gatewayが設定されていない状態だったので、スクリプトを追加修正しました

追記ここまで

[bash]
#! /bin/bash

ip_adr=$(ifconfig re0 | grep ‘inet ‘ | sed -e ‘s/^.*inet //’ -e ‘s/ .*//’)
ifconfig re0 $ip_adr netmask 255.255.254.0 broadcast ブロードキャストアドレス
route add default デフォルトゲートウェイのIPアドレス
[/bash]
自分のマシンのIPアドレスを調べて、その値を使ってifconfigを使って再設定をします。
ブロードキャストアドレスは正しい値に置き換えてください。

こいつを/etc/network/if-up.d/においてやります。
Debian系ならこのディレクトリになっているはずです。
FreeBSDやDebian系じゃないLinuxの場合は解りません。

すると、マシン起動時やネットワークカードをdown→upしたときに、dhcpでアドレスを取得したあとにこのスクリプトが走って、サブネットマスクとブロードキャストアドレスを設定し直します。

本当はこんな面倒くさいことはしなくて良いはずなのに(;つД`)

まとめ

なんでやねん!って感じですわ。
素直にFreeBSDを使ったら良かったのかなと大後悔中ですわ。

実践FreeBSDサーバ構築・運用ガイド
技術評論社 (2013-05-10)
売り上げランキング: 77,502

“『Linux/Debian』 Debian/kFreeBSDマシンで、DHCPで取得した情報を正しく反映されなくて困る事態が発生” への 1 件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です