2022年8月、ホームページを全面リニューアルしました! 情報を分かりやすくお伝えできるサイト作りを目指してまいります。

FloppyFWで単純ローカルルータを作る!

ネットワークを運用する際に困ることは、クラスCネットワークでセグメントを作っている場合、リースすべきIPアドレスが足りなくなることである。この場合の解決策は、クラスCのセグメントを増やすか、クラスBのネットワークにIPアドレスを振り返るかである。大規模なネットワークになればL3スイッチでVLANを組む方法が有るが、そこまでしなくてもルータかまして・・・・。みたいな方法で良いかなって思う。そこで、前から気になってた1FD Linuxルータを作り(ただ単にマスカレードしてパケットをフォワードするだけのルータ)、これをルータ代わりにクラスCでセグメント分けを行ってみようと思った。ここでは、その経過と作成手順などを説明する。

■ 以下の図の赤の部分のようなセグメントルータを作る

① 某社 全社内ネットワーク図

② 3F部分ネットワーク図

・LAN側IP 192.168.3.1/24
・WAN側IP 192.168.0.25/24

■ FloppyFWを動かす環境

・386SX以上のCPU
・8MB以上のRAM(12MB以上が好ましい)
・VGAのビデオカード
・2枚のNIC


1.インストール

インストールするFloppyDiskは、あらかじめDOSまたはWindowsでフォーマットしておく。floppyfwは ここ からゲットする。俺の場合、1.0系のfloppyfw-current-1.0.imgをダウンした。1.0系はKernel2.2系なのでipchainsを使う。2.0系は、Kernel2.4なのでiptablesを使う。俺自身、ipchainsに慣れているのでfloppyfw-current-1.0.imgを使うことにした。そんでもってダウンしたイメージファイルをFloppyDiskへ展開(従ってここでは、floppyfw-current-1.0.imgとして説明する)。

1)DOS/Windowsで行う場合

DOS/Windowsで展開する場合は、rawrite.exeを使用する。LinuxのディストリCDの起動ディスクを作るときに馴染みが深いだろう。redhat系のサイトでは、i386/dosutilsにあることが多い。ここでは、CドライブのFlOPPYFWというフォルダにダウンロードしたfloppyfw-current-1.0.imgファイルとrawrite.exeを置いてあるという前提。Windowsでは、MS-DOSプロンプトを起動して以下実行。。

C:\WINDOWS>CD \FLOPPYFW
C:\Floppyfw>RAWRITE
Enter disk image source file name: floppy~1.img
Enter target diskette drive: a
Please insert a formatted diskette into drive A: and press -ENTER- : < リターン >

少し時間がかかるが、DOSのプロンプトが表示されたら終わり。
rawrite.exeは純粋なDOSプログラムなので8.3形式のファイル名しか扱えない。従ってfloppyfw-current-1.0.imgファイル名を指定する際も「floppy~1.img」のように8.3形式のファイル名を入力しなければならない。あるいは、それがいやならrawritewin.exeと言うWindowsプログラムがあるので、それを使うのも手だ。

2)Linuxで行う場合

Linuxで展開する場合、ddコマンドを使用します。Linuxで作成する場合も、DOSまたはWindowsでフォーマットしたFloppyDiskに対して展開する。フォーマットしてないと書き込めないので注意すること。ダウンロードしたfloppyfw-current.imgファイルのあるディレクトリをカレントにして、

$ dd if=floppyfw-current.img of=/dev/fd0

その後、FDDをマウントして ls コマンドでFDの内容を確認してみる。


2.floppyfwの設定

設定は作成したディスクの中のテキストファイルを編集することによって行う。また、機能(DHCPやNICのドライバなど)を追加する場合は、パッケージファイルやモジュールファイルなどをダウンロードする必要が有る。

1)NIC

floppyfwには、あらかじめ以下のNIC用ドライバが組み込まれている。従って、これらのNICを使用する場合は特に作業は必要なし。
俺が使ったNICは、NE2000 Compatible cardsだったので何も作業する必要はなかった。

■ FloppyFWがサポートしているNIC

① 3com 3c509, 3c59x and 3c90x
② NE2000 Compatible cards
③ Tulip based cards.
④ intel EtherExpress PCI-cards. (10 ad 100Mbit)
⑤ RealTek rt8139 and friends.
⑥ RealTek rt8139+ and friends.
⑦ AMD PCNet32 (which also is the adapter used in vmware)

注:NICのファイル名に注意!

「via-rhine.o」というファイル名が8.3形式を超えているため読み込まれない。そこで、ファイル名を「via-rhin.o」に変更してMODULES.LSTも修正すると大丈夫のようだ。だが、「post -dhcpd.ini」というファイル名も8.3形式を超えているが、これはなぜか旨く読み込まれるようだ。

ただし、サポートされてないNICを使用する場合は、くしくもドライバをダウンロードして設定ファイルを編集する必要がある。方法としては、Webサイト上に各NICのドライバが用意されているので使用するNICに搭載されているコントローラが分かればよい。NICとドライバの対応については、 Linux Ethernet-Howto が参考になる。
例えば、プラネックスのVT86C100Aはドライバとして「via- rhine.o」を使用するのでfloppyfwのサイト ( http://www.zelow.no/floppyfw/download/modules/ カーネルのバージョン /net/ ) にあるドライバをダウンロードしてFloppyDiskの\MODULESディレクトリにコピーする。
このモジュールを使用するという設定は、テキストエディタでMODULES.LSTを開きファイルの末尾にドライバ名を入力する。

#
# Modules.lst
# Remove the comment for extra modules.
ip_masq_irc.o
ip_masq_ftp.o
ip_masq_portfw.o
ip_masq_autofw.o
ip_masq_raudio.o
via-rhine.o                         
 ← 追加するドライバ名

てな具合・・・・だぜっと。

2) 設定

■ syslinux.cfgの設定

NIC二枚以上指してる場合、以下の濃い部分のEtherカード設定を追加する。

# Append stuff, usually the only stuff you might need to edit.
append initrd=initrd.gz root=/dev/fd0 ether=0,0,0,eth0 ether=0,0,0,eth1

■ configの設定

「CONFIG」ファイルでは、floppyfwの最も基本的な設定を行う。テキストエディタで開いて、以下の部分を編集する。
接続先からIPアドレスが固定で供給される場合には、「OUTSIDE_IP=」に指定されたIPアドレスを入力する。

今回の場合は、ローカルルータなので以下のクラスCの固定IPを入力。
#クラスCの外側のIPアドレスを設定
OUTSIDE_IP=192.168.0.25

IPアドレスが固定の場合は、以下の部分にも、指定されたアドレスを記述する。
#外側のサブネットマスクを設定
OUTSIDE_NETMASK=255.255.255.0
#外側のネットワークアドレスを設定
OUTSIDE_NETWORK=192.168.0.0
#外側のブロードキャストアドレスを設定
OUTSIDE_BROADCAST=192.168.0.255

LAN側の設定を行う。
#クラスCの内側のIPアドレスを設定
INSIDE_IP=192.168.3.1
INSIDE_DEV=eth1

#内側のサブネットマスクを設定
INSIDE_NETMASK=255.255.255.0
#内側のネットワークアドレスを設定
INSIDE_NETWORK=192.168.3.0
#内側のブロードキャストアドレスを設定
INSIDE_BROADCAST=192.168.3.255

DHCPの設定を行う。
#DHCPを使うことを設定
DHCP_DAEMON=y
#192.168.3.10~192.168.3.154迄をリースIPとして使用する
DHCP_RANGE_START=192.168.3.10
#DHCPのリース範囲を設定
DHCP_RANGE_END=192.168.3.254

デフォルトゲートウェイ等の設定。
#デフォルトゲートウェイの設定
DEFAULT_GATEWAY=192.168.0.1
#DNSサーバアドレスの設定
NAME_SERVER_IP1=192.168.0.4
NAME_SERVER_IP2=
#ドメインの設定
DOMAIN=xxxxxxxxx.co.jp
#ホスト名の設定
HOSTNAME=mt3f-gw

ネットワーク関係以外の設定。
#キーボードからのコマンド操作を可能にするか否かの設定
OPEN_SHELL=n
#メインメモリが8MBのシステムで運用する場合に、「y」にする
ONLY_8M=y
#syslogを使うか否かの設定
USE_SYSLOG=y
#syslogのパラメータの設定
SYSLOG_FLAGS=”-m 360″
#その他のセカンドデバイスを使うか否かの設定。以上で、CONFIGファイルの設定は終了
SECOND_DEVICE=n

■ firewall.iniの設定

本来、firewall.iniでは、ファイアウォールの設定を行う。しかし、俺が作ったのは単純ルータなので設定する項目は以下のようにマスカレードの設定だけである。

. /etc/config

# IPフォワードストップ
echo “0” > /proc/sys/net/ipv4/ip_forward

. /etc/outside.info

. /etc/inside.info

# IPアドレス及びネットワークアドレス等アドレスステータス表示。
echo “Starting firewall with the following config:”
echo
echo ” Inside Outside”
echo ” Network: ${INSIDE_NETWORK} ${OUTSIDE_NETWORK}”
echo ” Device: ${INSIDE_DEVICE} ${OUTSIDE_DEVICE}”
echo “IP Address: ${INSIDE_IP} ${OUTSIDE_IP}”
echo ” Netmask: ${INSIDE_NETMASK} ${OUTSIDE_NETMASK}”
echo ” Broadcast: ${INSIDE_BROADCAST} ${OUTSIDE_BROADCAST}”
echo ” Gateway: [None Set] ${OUTSIDE_GATEWAY}”
echo

# チェーンとIPフォワーディングの設定。
#ipchainsフラッシュ(クリア)
ipchains -F
#inputパケット許可
ipchains -P input ACCEPT
#転送するパケット許可
ipchains -P forward ACCEPT
#outputパケット許可
ipchains -P output ACCEPT
#outputパケット許可
ipchains -A forward -i ${OUTSIDE_DEVICE} -j MASQ
#チェーンルールをビューする
ipchains -n -L
echo “Enabling IP forwarding.”
#IPフォワーディング許可
echo “1” > /proc/sys/net/ipv4/ip_forward

# 自ホストセグメント以外のネットワークセグメントのルーティングテーブル追加
route add -net 192.168.10.0 netmask 255.255.255.0 gateway 192.168.0.34 eth0
route add -net 192.168.5.0 netmask 255.255.255.0 gateway 192.168.0.26 eth0
route add -net 192.168.7.0 netmask 255.255.255.0 gateway 192.168.0.27 eth0
route add -net 192.168.1.0 netmask 255.255.255.0 gateway 192.168.0.28 eth0

3)add.bz2圧縮ファイルを編集(udhcpd.confへ反映)

デバイス等のモジュールを圧縮しているadd.bz2の中の内容を編集する。私的には、Unix環境で編集した方がやりやすいかと思う。これをやらないとDNSサーバのIPアドレスをクライアントがゲットできない。add.bz2ファイルはTARBZ2形式に圧縮されているが、解凍して編集して元に戻すと旨く起動してくれないので、bz2解凍後のaddファイルをダイレクトに編集した方が良いような気がする。したがって、以下の方法で編集した。

FloppyFWのフロッピーディスクをマウントする。
# mount -t vfat /dev/fd0 /mnt/floppy
add.bz2ファイルを/tmpへコピーする。
# cp /mnt/floppy/floppyfw/add.bz2 /tmp
# cd /tmp
bz2圧縮を解凍する。
# bzip2 -d add.bz2
addファイルを編集する
# vi add

省略

echo “option dns ${INSIDE_IP}” >> /etc/udhcpd.conf
              ↓
echo “option dns ${NAME_SERVER_IP1}” >> /etc/udhcpd.conf

省略

編集前のbz2圧縮ファイルを削除する。
# rm add.bz2
編集したaddファイルをbz2圧縮して元に戻す。
# bzip2 -9 add
add.bz2をフロッピーディスクへ戻す。
# cp add.bz2 /mnt/floppy/floppyfw/


3.動作確認

動作確認は、
1)設定が終わったフロッピーをドライブに入れてブートする。
2)ルータPCのブート画面を確認する。
3)クライアントを再起動するか、DOSプロンプトから ipconfig /renew を実行してIPアドレスの再配布を依頼する。
4)DOSプロンプトから、 ipconfigを実行し、

C:\>ipconfig /all

Windows 2000 IP Configuration

Host Name . . . . . . . . . . . . : michan
Primary DNS Suffix . . . . . . . : xxxxxxxxx.co.jp
Node Type . . . . . . . . . . . . : Broadcast
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
DNS Suffix Search List. . . . . . : xxxxxxxxx.co.jp

Ethernet adapter ローカル エリア接続 3:

Connection-specific DNS Suffix . : xxxxxxxxx.co.jp
Description . . . . . . . . . . . : Allied Telesis LA100-PCI-T V2 LAN Ad
apter #2
Physical Address. . . . . . . . . : 00-00-F4-95-3D-84
DHCP Enabled. . . . . . . . . . . : Yes
Autoconfiguration Enabled . . . . : Yes
IP Address. . . . . . . . . . . . : 192.168.3.24
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Default Gateway . . . . . . . . . : 192.168.3.1
DHCP Server . . . . . . . . . . . : 192.168.3.1
DNS Servers . . . . . . . . . . . : 192.168.0.4
Lease Obtained. . . . . . . . . . : 2005年5月20日 9:29:05
Lease Expires . . . . . . . . . . : 2005年5月30日 9:29:05

C:\>

こんな具合に、IPをもくろみ通りゲット出来てればOK!


4.FloppyFWのディスクが完成したらディスクイメージを取って保管する

Floppyディスクは壊れやすいので、ディスクイメージを取ってオリジナルとして保管しよう。ディスクイメージの取り方とFloppyディスクへのリストアはLinux上から以下の要領で行う。
# dd if=/dev/fd0 of=/tmp/floppyfw.img

Floppyディスクへのリストアは、
# dd if=/tmp/floppyfw.img of=/dev/fd0


5.DHCPリース範囲変更時の注意

FloppyFwの設定ファイル中のDHCPリース範囲を変更した場合は、クライアントのネットワークアダプタにFloppyFwからのIPアドレスのリースがキャッシュされているので、それを解放する必要がある。したがって、DOSプロンプトから、

C:\>ipconfig /release

さらに、念のためDNSリゾルバの未使用キャッシュをフラッシュする。

C:\>ipconfig /flushdns

最後に、DHCP IPアドレスのリースの更新を行う。

C:\>ipconfig /renew

以上

コメント