redhat Linux 5.2でIPマスカレードをして
ケーブルテレビ用のルータにするまで

FreeBSDでNATはあきらめ…

From: 新居雅行 <msyk@mac.com>
To: catv-internet@egroups.co.jp
Subject: [catv-internet] FreeBSDでNATはあきらめ…
Date: Sun, 09 Jul 2000 01:44:31 +0900

UNIXでNATを実現する方法を、ホームページに書こうと思っていますが、なかなか始められそうにないような気がするので、ちょっとずつ書いていって、まとまったらページにします。まあ、おつきあいください。

●まず、FreeBSDでNATをしようと思った

ケーブルテレビでインターネットを快適に行う必需品のNATルータ(IPマスカレー ド対応)だが、やはりUNIXマシンでやりたいというのは1つの最終目標だった。フロッピーでのルータというユニークなものもあるが、ファイルサーバなども必要な ので、普通にUNIXを立ち上げたい。会社のシステムなどでFreeBSDを使っており、 Mac OS XもBSDベースなこともあって、やっぱりFreeBSDかなと思っていた。ちょう ど4.0も出たし、natdというデーモンがあって、そのman(オンラインマニュアル) を見る限りはやり方はそれほど難しく無さそう…というか、やり方がちゃんと書い てあるのでやろうとした。

使うマシンは、K6-200、128MB、8GB HDDという構成のマシンで、もはや時代遅れになったATケースに入ったマシンだ。これに2枚のPCIのEthernetカードが入っている。Windows 2000を入れた時に、一方はRealTek 8129/8139と認識したが、これはどこのメーカのものか忘れてしまった。マニュアルは残してあるけど、メーカーすら書いていない。DOS/Vパラダイスでワゴンでうっていた安いやつくらいしか記憶にない。もう1枚は、ナカガワメタルの赤い基盤のやつで、T-ZONEで2000円くらいで買ったもの。これは、Windows 2000では自動認識しないものの、フロッピーにWindows 2000のドライバがあったため、なんとかWindowsで使えていた。ドライバ情報を見ると、VIA Technologiesと出ている。Cirixを買った台湾のメーカだ。

で、FreeBSDを入れるために、アスキーのBSD Magazine No.4を買った。CD-ROMが欲しかったのと、Darwinの記事が書いていることに目をつけたが、その後記事を読んでいると、Windows CEでBSDが走るとか?これはこれで、また試そう!それで、インストールCDのドキュメントをいろいろ見ると、RealTekもVIAもサポートしているというので、これはラッキーと思ってインストールを始めた。FreeBSDは、カーネルにネットワークドライバが組み込まれており、ソースレベルでは分解されているものの、カーネルには統合されている。だからサポート品とそうでないものは、手間が雲泥の差になる。知り合いのアドバイスは、自分でソースを探してきて入れる手間があったら、3COMのカードが高いけど確実ですよ…というものだ。さて、いろいろやったが、RealTekはどうやら動いているらしい。デバイス名はrl0だ。インストーラを試行錯誤しながらとにかく最後まで行って、DHCPクライアントの設定をオンにする。そして、RealTekのカードからケーブルモデムにつなぐと、きちんとDHCPの情報を取得して、インターネットに接続された! pingとかnslookupとか、tracerouteとかして、とにかくつながっていることを確認した。しかしである。VIAの方が認識しない。デバイス名はvr0である。起動時のメッセージは「dmesg」コマンドで拾うことができる。「dmesg|grep vr0」とすると、

vr0: <VIA VT3043 Rhine I 10/100BaseTX> port ......(省略) irq 11 at device 9.0 on pci0
vr0: Ethenet address: 08:04:00:00:04:41
vr0: MII without any phy!
device_probe_and_attach: vr0 attach returned 6

となる。「ifconfig -l」では、rl0は出てきても、vr0は出てこない。つまり、PCIカードの認識はしているけど、MII、つまり物理的なデバイスとのコネクションが確立できないということだと思う。もちろん、通信は全然できない。カーネルにドライバは統合されているため、これ以上は手は出せない。(2000/6/25)

いったんあきらめたが、ナカガワメタルのそのネットワークカードのフロッピーを見ると、FreeBSDというフォルダがあり、ソースが入っている! ラッキーと思ってカーネルの再構築からやった。フロッピーの利用からすでにコマンドが必要で、フロッピーの説明通りには行かない。自分でコマンドを探し、説明の間違った箇所を修正しながらのインストール作業を試みた。しかしながら、結果はダメ。まず認識しないので、あれと思ってやり直してみたが、どうやらカーネルのコンパイル前のコンフィグレーションですでにエラーが出る。VIAのドライバのソースを正しく認識できないらしい。どうも、他のソースと見比べてみたが、ドライバのソースの形式がVIAのソースをつくったときから変わっているのではないかと思わせる節がある。ソースをいろいろさがしたが、結果的には見つからなかった。もちろん、VIA Tech.のWebも探したけども、見つからなかった。(2000/7/1)

ということで、ソースを発見するも、ぬか喜びだった。ここで、FreeBSDはあきらめて、Linuxに挑戦することにした。特に最新版でなくてもいいし、ちょうど手元に「逆引き日本語redhat Linux 5.2」(うちの会社で出版しています)という書籍があったので、redhat 5.2を入れることにする。


From: 新居雅行 <msyk@mac.com>
To: catv-internet@egroups.co.jp
Subject: [catv-internet] redhat Linux 5.2でインストール
Date: Sun, 16 Jul 2000 02:40:02 +0900

今週はえらく忙しかったので、毎日ちょっとずつどころか、全然テキストが書けませんでした…

●redhat Linuxでうまくいった

FreeBSDで挫折したところで、ふと、Linuxならうまくいくのではないかと思いたった。ちょうど、昨年に出版された「逆引きredhat Linux 5.2」があり、CD-ROMにディストリビューションがあったので、これをインストールしてみることにした。最新版ではないけど、まあいいだろうということで。以前、Turbo Linux 3.0のインストール経験はあるのだが、その他のLinuxは初体験ということで、作業を始めてみた。

やっぱり、CD-ROMで起動できるので、とっても楽だ。画面が出てきたが、Turbo Linuxのときとほとんど同じようなものであり、日本語でしっかり対話的にインストールができるので、これは楽ちんだ。だけど、ネットワークの設定で詰まった。選択肢に、装着したネットワークカードが2枚ともないのである。うーむ、またダメかと思い始めてしまった。だけど、とりあえず、適当なカードを選んで後でその設定を変えることをやろうとしたけどだめだった。選択したネットワークカードがあるかどうかをインストーラがしっかり確認する。結局、インストーラでのネットワークカードのセットアップはあきらめた。ネットワークカードのドライバは何も指定しない状態で、とりあえずインストールは終了した。

もちろん、この状態では、ネットワーク作業は一切できない。まずは、ドライバの組み込みをどうするかを考えないといけない。ソースを入手してカーネルの再構築という手段があるのを聞いていたが、ほかにモジュールを使ってドライバを組み込むという方法もあることが分かった。まずは簡単そうなモジュールを使う方法を試すことにした。p196を参照し、調べることで、以下のディレクトリに、ネットワークカードのドライバのモジュールがありそうなことが判明した。/lib/modules/2.0.36-3/net

このディレクトリ一覧を見ると、次のようなものである。

3c501.o bsd_comp.o epic100.o new_tunnel.o smc-ultra.o
3c503.o de4x5.o eql.o ni52.o smc-ultra32.o
3c509.o de600.o eth16i.o ni65.o smc9194.o
3c515.o de620.o ewrk3.o pcnet32.o tlan.o
3c59x.o depca.o hp-plus.o plip.o tulip.o
8390.o dgrs.o hp.o ppp.o via-rhine.o
ac3200.o dummy.o hp100.o rcpci.o wd.o
apricot.o e2100.o ibmtr.o rtl8139.o yellowfin.o
arcnet.o eepro.o lance.o shaper.o
at1700.o eepro100.o ne.o slhc.o
atp.o eexpress.o ne2k-pci.o slip.o

まず、「rtl8139.o 」が見つかった。これは、どう考えても、RealTek 8139に違いない。そして、「via-rhine.o」もあるが、これはVIAのものだろう。うまく行くことを願い、これらの2つのドライバを使うことにする。

さて、ドライバを稼働させる方法は、さすがにLinuxの世界ではドキュメントが豊富にきっちりとあるため、いろいろ調べているうちに、/etc/conf.modulesというファイルに記載することで、モジュールを組み込み、それをデバイスとして動作させるようにできることが分かった。conf.modulesというファイル名はドットの前後が逆なように思うが、まあ気にせずそのファイルの中身は次のようにした。

========================/etc/conf.modules
alias eth0 via-rhine
alias eth1 rtl8139
========================================

1列目はalias、2列目はデバイス名、3列目はドライバ名だが、.oは抜きにする。これにより、VIAのドライバを使ったEthernetカードは、eth0としてシステムは認識できるようになる。

こうしてネットワークアダプタがアクティブになったら、これにさまざまな設定を加える必要がある。基本的なレベルでは、ifconfigコマンドを使うのであるが、redhat Linuxでは、ちょっと違うプロセスを使っている。/etc/sysconfig/network-scriptsというディレクトリに、ifcfg-(デバイス名)というファイルを作り、そこに設定を記述するのである。それぞれ、以下のように作成した

======================/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
IPADDR=192.168.0.1
NETMASK=255.255.255.0
ONBOOT=yes
======================/etc/sysconfig/network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=dhcp
ONBOOT=yes
==============================================================

いずれも、DEVICE=に続いてデバイス名を記述する。なんだかファイル名でデバイス名が決まるのなら2重に設定しているような気もするが、まあいいとしよう。eth0、つまりVIAのネットワークカードは、内部ネットワーク側に接続する。そのため、IPアドレスは固定で、192.168.0.1とする。IPアドレスとネットマスクの指定がある。一方、eth1、つまりRealTekのネットワークカードは、ケーブルモデムと接続する。そして、DHCPクライアントになって、ケーブルテレビのネットワークからIPアドレスの配給を受けて、IPアドレスなどが決まるようにしたい。そのために、BOOTPROTO=dhcpという記述を加える。いずれの設定も、起動時にアクティブになるように、ONBOOT=yesという記述を設定している。

また、ネットワーク設定で重要なのは、/etc/sysconfig/networkというファイルだ。最終的には以下のように設定を行った。最初は「NETWORKING=yes」だけが有効な設定だったが、いろいろやるために、以下のような設定になった。

================================/etc/sysconfig/network
NETWORKING=yes
FORWARD_IPV4=true
HOSTNAME=msykhome.msyk.dyndns.org
DOMAINAME=msyk.dyndns.org
======================================================

以上の、network、ifcfg-eth0、ifcfg-eth1ファイルは、起動時に実行されるさまざまなスクリプトによって読み込まれるものだ。もちろん、スクリプトの動作はそれも興味深いことだが、書籍の第3章で解説されている。ここでは、必要な措置だけをまとめてみた。

これで、再起動してみる。起動時によく見ていると、DHCPクライアントになって、IPアドレスを取得しているところが分かる。起動メッセージの流れがとまるからだ。そして、再起動後に、ifconfigコマンドで設定を見ると、次のようになっている(実は、このコマンド結果はもっと後から作成したもので、インストール直後ではない)。つまり、eth0とeth1という2枚のEthernetカードがあり、それらにIPアドレスが割り当てられているという点に注目してもらいたい。

lo Link encap:Local Loopback
inet addr:127.0.0.1 Bcast:127.255.255.255 Mask:255.0.0.0
EtherTalk Phase 2 addr:0/0
UP BROADCAST LOOPBACK RUNNING MTU:3584 Metric:1
RX packets:1853 errors:0 dropped:0 overruns:0 frame:0
TX packets:1853 errors:0 dropped:0 overruns:0 carrier:0
collisions:0

eth0 Link encap:Ethernet HWaddr 08:04:00:00:04:41
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
EtherTalk Phase 2 addr:65280/112
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:136139 errors:0 dropped:0 overruns:0 frame:0
TX packets:129431 errors:0 dropped:0 overruns:0 carrier:0
collisions:80
Interrupt:11 Base address:0x6400

eth1 Link encap:Ethernet HWaddr 00:48:54:50:AF:C9
inet addr:203.165.29.11 Bcast:203.165.29.255 Mask:255.255.255.0
UP BROADCAST NOTRAILERS RUNNING MULTICAST MTU:1500 Metric:1
RX packets:79810 errors:0 dropped:0 overruns:0 frame:0
TX packets:70062 errors:0 dropped:0 overruns:1 carrier:0
collisions:3
Interrupt:12 Base address:0x6500

eth1の方はケーブルモデムに接続されているため、このLinuxマシンからは外部にすでに接続できるはずだ。もちろん、ping msyk.locus.co.jpなどとやってみたが、もちろんうまく行った。

ちなみに、ネームサーバ情報を入れるresolv.confは以下のようになっている。DHCPクライアント機能が自動的に設定するようだ。

=================================resolv.conf
domain urawa1.kt.home.ne.jp
nameserver 203.165.8.40
===========================================

ルータについては、一般的には、/etc/sysconfig/networkファイルで「GATEWAY=XXX.XXX.XXX.XXX」「GATEWAYDEV=eth0」のように指定をするのであるが、やはりDHCPクライアント機能で自動的に取得しているようだ。だけど、routeの設定は次の通りで、デフォルトの指定が見当たらない。これについては、理由は定かではないが、いずれにしても、Linuxマシンから外部のネットワークには接続できている。

Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
all-ones * 255.255.255.255 UH 0 0 30 eth0
192.168.0.0 * 255.255.255.0 U 0 0 129 eth0
203.165.29.0 * 255.255.255.0 U 0 0 210 eth1
127.0.0.0 * 255.0.0.0 U 0 0 10 lo


From: 新居雅行 <msyk@mac.com>
To: catv-internet@egroups.co.jp
Subject: [catv-internet] DHCPクライアント機能
Date: Mon, 17 Jul 2000 02:05:15 +0900

IPマスカレーディングの前に、DHCPクライアントの機能でもう少し分かったことがあるので、それを書きます。

●DHCPクライアント機能はどうなるか

redhat Linux 5.2で、DHCPクライアントの結果がどうなるかをもう少し詳しく調べてみた。なお、DHCPサーバとしては、dhcpdというデーモンがある。一方、クライアントとしては、dhcpcdというソフトウエアがある。名前が良く似ているので混同してしまうが、これらはまったく別物である。というか、気をつけていないと訳が分からなくなるので注意をしよう。ここでは、dhcpcdについて説明しよう。

さて、起動時に、/etc/sysconfig/network-scripts/ifcfg-ethN(Nは0や1)というファイルがあれば、ethNのネットワークカードでバイスの設定が、そのファイルに記述した通りに行われる。このファイルの中に、「BOOTPROTO=dhcp」という記述があれば、そのネットワークカードからの接続ではDHCPクライアントになり、サーバに接続して、IPアドレスの配給を受けるわけだ。こうした動作が行われる理由は、起動時にあるスクリプトが実行され、そのスクリプトが上記のファイルを参照するように動作するからである。スクリプトの記述を追えば、設定ファイルにBOOTPROTO=dhcpの記述があると、そのアダプタに対して、/sbin/dhcpcdが起動されることが分かる。その結果、設定ファイルのあるネットワークカードがDHCPサーバに接続してIPアドレスを取得し、ネットワークカードなどの一連の設定が自動的になされるようである。そして、/etc/dhcpcというディレクトリに設定の結果を残す。以下の2つのファイルが作られ、ファイルの中身は次のようになっていた。

===============================/etc/dhcpc/hostinfo-eth1
LEASETIME=1800
RENEWALTIME=900
REBINDTIME=1575
IPADDR=203.165.29.11
NETMASK=255.255.255.0
BROADCAST=203.165.29.255
ROUTER=203.165.29.1
===============================/etc/dhcpc/resolv.conf
domain urawa1.kt.home.ne.jp
nameserver 203.165.8.40
=========================================

hostinfo-eth1では、DHCPサーバから取得した情報が見られる。つまり、IPアドレスやルータのアドレス、リースタイムなどがこのファイルから得られることになる。また、ネームサーバの情報は、resolv.confに残される。これらのファイルは、dhcpcdが自動的に作成する。

なお、起動時のスクリプトによって、dhcpcdが起動されるとき、dhcpcdの-cオプションを使って、正しく処理を終えた後に実行するスクリプトも指定されている。スクリプト中の記述から判断すると、DHCPクライアントの動作が正しく行われることで、/etc/sysconfig/network-scripts/ifdhcpc-doneというスクリプトが続けて実行される。このスクリプトは、上記の/etc/dhcpc/resolv.confのファイルをそっくりそのまま、/etcディレクトリにコピーする。つまり、こうして、/etc/resolv.confというファイルが作られることになる。一般にはリゾルバは、/etc/resolv.confファイルにある設定を見て、ネームサーバに接続するので、このようにファイルをコピーしておく必要があるわけだ。

DHCPクライアントとしてどのように設定されているかを確認する方法は以上の通りだが、ルータの設定がどうなるかということまではやはり分からないままである。

なお、DHCPのサーバの利用方法については、また回を改めることにする。

それで、やっとIPマスカレードの設定に行こう。ということで、また次回に…


From: 新居雅行 <msyk@mac.com>
To: catv-internet@egroups.co.jp
Subject: [catv-internet] redhat LinuxでIPマスカレード
Date: Fri, 04 Aug 2000 00:07:20 +0900

redhat Linux 5.2でのルータ設置についての続きです。間があいてしまいましたが、よろしくです。

●IPマスカレードを稼動させる

2枚のネットワークカードを稼動させたことが確認できれば、その状態で、IPマスカレードができるようにします。IPマスカレードにより、プライベートネットワーク(192.168.0.0)にある複数のパソコンから、ケーブルモデムを経由して、インターネット接続ができるようになります。以下の方法は、「逆引き日本語redhat Linux 5.2」に従って作業を行いました。

こうしたネットワーク処理は、Linuxではデーモンを起動させて行うのではなく、OSに統合された機能を利用すると考えてよいようです。そのため、以前だと指定されたカーネルオプションを有効にして、カーネルの再構築が必要でした。しかしながら、redhat 5.2では、ケーブルテレビ環境でIPますカレードするのに必要なオプションは設定されて、カーネルが構築されているので、再構築は必要ありません。つまり、そのまま設定を行えばいいということです。

それで、ftpなど一部のサービスを利用する時のためにモジュールのロードが必要となります。/etc/rc.d/rc.modulesというファイルに、以下のように記述しておきます。redhat 5.2ではrc.modulesは最初は存在しないので、root権限などで作成することになりますが、作成後、chmodコマンドで権限は755に変更しておきます。

/sbin/depmod -a
/sbin/modprobe ip_masq_cuseeme.o
/sbin/modprobe ip_masq_ftp.o
/sbin/modprobe ip_masq_irc.o
/sbin/modprobe ip_masq_quake.o
/sbin/modprobe ip_masq_raudio.o
/sbin/modprobe ip_masq_vdolive.o

これらはモジュールをロードしておいて自動的に利用できるようにする一連のコマンドです。たとえば、ip_masq_ftp.oは、ftpのサービスが問題なく利用できるようにするモジュールのようですが、これれら6つのモジュールは/lib/modules/2.0.36-3/ipv4/というディレクトリにあります。ftp以外は、ReadAudioだとか、CuSeeMeだとかサービスごとに対応モジュールが用意されているということでしょう。

ちなみに、起動時には、/etc/rc.d/rc.sysinitというスクリプトが呼び出されますが、その中から、rc/modulesも呼び出され、上記のrc.modulesのコマンドは起動時に処理されるという仕組みになっています。ですが、rc.sysinitというスクリプトを見ると、rc.modulesがあれば呼び出すというのは以前のバージョンとの互換性を取るためのものとなっているため、今後は異なる方法を利用するのがいいのではないかと思われます。

また、マスカレーディングの機能を有効にするには、/etc/sysconfig/networkというファイルに、

FORWARD_IPV4=true

という行を付け加えておきます。すでにこの設定が含まれているのならそれでOKです。falseとかになっていたら、もちろん、trueに書き換えます。

rc.modulesを作成して再起動し、そして、以下のコマンドを入力します。ipfwadmは、IP Firewall and accounting ADMinistrationという意味だそうで、つまりは「設定ツール」ということです。

ipfwadm -F -a m -S 192.168.0.0/24 -D 0.0.0.0/0ipfwadm -F -p deny

最初のコマンドに「-F -a m」という設定があり、これは、IPマスカレードの設定を行うということを意味しています。-SはソースのIPアドレスということで24はネットマスクです。24というのは1が頭から24個連続しているということで、255.255.255.0と同じことです。192.168.0.0/24ということは、IPアドレスに255.255.255.0をANDした結果が192.168.0.0のものが対象となります。たとえば、192.168.0.1や192.168.0.100といったIPアドレスから来たものが、IPマスカレードの対象になります。-D以降はそれら対象となっている通信をどこに送信するのかという指定ですが、このように0.0.0.0/0とすることで任意のアドレスということになるようです。言い換えれば、もともとの通信の送信先がそのまま指定される設定と見てよいでしょう。IPマスカレードの機構として、-Sで指定したIPアドレスから受け取ったデータの送信者を自分自身のIPアドレスに置き換えて通信を行うわけですが、-Dの後の指定は、おそらくは「送信先を変更しない」という意味の指定ではないかと思います。

「ipfwadm -F -p deny」は指定以外の処理は受け付けないということを意味します。以上の2つのコマンドを、/etc/rc.d/rc.localファイルの最後に書いておけばよいでしょう。このスクリプトの一番最後に、if文の最後を示すfiがあるので、その行の前に行を確保して、上記の2行を書いておきます。そして再起動をしておきます。

なお、現在の設定を確認するには、

/sbin/ipfwadm -F -l

とコマンド入力します。次のような表示がされ、192.168.0.0ネットワークからの送信データがマスカレードされるように設定されている様子を確認できます。

IP firewall forward rules, default policy: deny
type prot source destination ports
acc/m all 192.168.0.0/24 anywhere n/a

実際に通信を行っている時に、以下のコマンドを入れてみます。使用中は適当なアカウントからログインするので、/sbinにパスは通っていないため、/sbinから手入力します。

/sbin/ipfwadm -M -l

すると、次のように、IPマスカレーディングを行っている様子を見ることができます。ちなみに、以下の作業をしたときには、プライベートアドレスにあるWindowsマシンで、FrontPage 2000を使ってファイルを発行しながらWebにアクセスしているときです(抜粋です)。

prot expire source destination ports
tcp 14:59.29 192.168.0.100 gemini.mita.cc.keio.ac.jp 1473 (63327) -> ftp
tcp 00:04.09 192.168.0.100 gemini.mita.cc.keio.ac.jp 1487 (63341) -> ftp-data
tcp 00:03.33 192.168.0.100 gemini.mita.cc.keio.ac.jp 1486 (63340) -> ftp-data
tcp 14:59.88 192.168.0.100 news.msn.co.jp 1607 (63459) -> http
tcp 14:59.98 192.168.0.100 news.msn.co.jp 1606 (63458) -> http

より細かい説明や詳しい説明については以下のサイトも参考になるかと思います。なお、Linuxカーネルのバージョン2.2では、ipfwadmではなく、ipchainsというコマンドに変わっています。redhat Linux 6.xではカーネルは2.2なので注意してください。

<プライベートネットワーク内他のパソコンの設定>

さて、この段階で、すでに、プライベートネットワーク側のパソコンからインター ネット接続ができます。まだ、DHCPは稼動していないので、各パソコンは次の方針 で設定を行います。

IPマスカレードしているマシンをルータとして指定するのは雰囲気が分かるとは思いますが、そのサーバに対してネームサーバとしても指定します。実は、redhat 5.2はそのままネームサーバが使える状態になっています。ただし、「キャッシュモード」と言って、名前解決の要求を、そのマシンが利用していネームサーバに中継するだけの設定になっています。その設定で使う限りは特に何もしなくても動いています。

あと、デフォルトのドメインなどの設定がありますが、上記の設定だけで、基本的にはOKです。デフォルトドメインはなくても利用できますし、言い換えれば設定しない方がいいと思います。

DHCPを動かして、ネームサーバもうまく設定して、プライベートネットワーク内にサーバをたてて実験するような場合にも対処できるようにしてみたいと思います。それらはまた次回ということで。

<なんで、ipfwadmの-Dに0.0.0.0/0を指定するかについての考察>

-Sのパラメータを考えてみます。考え方としては、-S addr1/mask1のように指定し た場合、外部から入ってきたアドレスに対してmask1をビット単位でAND演算を行い ます。その結果がaddr1と同じであれば、対象とするアドレスだと判断するわけで す。同じように、-Dつまり送信先アドレスについて考えてみます。-D addr2/mask2と 指定したとします。このとき、「マスクというのはその指定のどのビットが有効か」 というものを指定するのだと考えたとしましょう。たとえば、-D1.2.3.4/255.255. 255.0の場合は、マスクが1のビットはパラメータで指定したもの、マスクが0は実 際のパケットに含まれている送信先アドレスを取ると考えるわけです。送信先が101. 35.35.56の場合、1.2.3.56に変換されると考えればいいのだと思います。そうすれ ば、マスクは0なので、パケットの送信アドレスがそのままマスカレーディングし た後の送信アドレスになるということが考えられるというわけです。言い換えれば、 -Dパラメータのマスクに0を指定している限りは、送信先アドレスには一切手をつ けないということになります。実際、

/sbin/ipfwadm -F -a m -S 192.168.0.1 -D 1.2.3.4/0

のように指定を行っても、何の問題もなく処理は行われます。また、-D 0.0.0.0/0はDパラメータを省略したときの既定値でもあります。従って、

/sbin/ipfwadm -F -a m -S 192.168.0.1

のように指定しても、やはり問題なく指定されます。結果的に、-Dのサブネットは 0でないと機能しないような気もします。適当なアドレスに変換されるかをやって みたのですが、変換される形跡がありません。IPマスカレードで送信先アドレスを 変更するという需要はまったくないと思いますが、やってみてできないのは、結局は送信先は変換せずにそのまま使うという指定しか有効ではないのではないかと思 います。


From: 新居雅行 <msyk@locus.co.jp>
To: catv-internet@egroups.co.jp
Subject: 内部ネットワーク用にDHCPサーバを立ち上げる
Date: Mon, 14 Aug 2000 20:18:29 +0900

redhat Linux 5.2で、IPマスカレードして、家庭内サーバーを立ち上げる話の続きです。しかしまあ、5.2でもないなぁというところですが、お許しを。

●内部ネットワーク用にDHCPサーバを立ち上げる

redhat Linuxを稼動するマシンで、2つのネットワークの間をIPマスカレードによってルーティグできるところまでを説明しました。その状態では、プライベートネットワーク側の各パソコンでは、ルーティングしているマシンがDNSが単なるキャッシュとして動いているので、ルーティングをしているマシンをネームサーバに指定すればいいですし、もちろん、そのマシンがゲートウエイです。つまり、ネームサーバもゲートウエイも、192.168.0.1を指定し、後はIP番号を手入力にして、それぞれ異なるものをつければいいわけです。

だけども、日常的な作業をもっと楽にするには、DHCPサーバを立ち上げたいところです。ということでいろいろ試行錯誤をしてみました。まず、最初の状態、つまり、redhat Linux 5.2を入れた段階で、DHCPサーバ機能はすでに組み込まれています。起動のためのスクリプトは、/etc/rc.d/init.d/dhcpdというのがあります。通常はRunレベルは3なので、/etc/rc.d/rc3.dにあるシンボリックリンクをチェックします。S65dhcpdのように、dhcpdという名前のあるファイルの先頭がSになっていればDHCPは起動しますが、Kになっていると起動しません。これはLinux起動時に自動的にデーモンを起動するための設定で、後から手作業で起動するにはこうした処置は必要ありませんが、管理手間のこともありますので、通常は起動時にDHCPを起動したいところです。

だけど、このままだと、2枚のEthernetカードの両方のネットワークに対して、DHCPサーバーになってしまいます。自分的にはそれでもいいのですが、これは、もしかすると、ケーブルテレビの他のクライアントにIPアドレスの配給をしてしまうとか、問題が出そうです。だから、どうしても、プライベートネットワーク側の方にだけDHCPサーバとして稼動させたいというわけです。

DHCPサーバの設定は、/etc/dhcpd.confで行います。しかしながら、このファイルには、利用するEthernetアダプタの選択項目はありません。man dhcpdで調べたところ、hdcpdのコマンドラインオプションで、利用するアダプタを指定することができることが分かりました。ちなみに、eth0がプライベートネットワーク、eth1がケーブルモデムに接続する外側のアダプタになっています。

で、どうしようか考えたのですが、あまりスマートではないものの/etc/rc.d/init.d/dhcpdファイルを修正することにしました。そのファイルに、

daemon /usr/sbin/dhcpd

という部分があり、ここでDHCPサーバのデーモンを起動しています。そこの行に、DHCPサーバをアクティブにしたいEthernetアダプタを次のように指定します。

daemon /usr/sbin/dhcpd eth0

これで、プライベートネットワーク側にだけ有効なDHCPサーバとして機能します。

それで、/etc/dhcpd.confファイルは次のように設定をしました。もし、dhcpdをそのまま起動すると、eth0だけでなくeth1側の設定もdhcpd.confに入れないとエラーになりますが、ここではeth0側の設定だけで問題なく機能します。

server-identifier msyk.dyndns.org;
option domain-name "msyk.dyndns.org";
option domain-name-servers 192.168.0.1;
shared-network MSYKHOME {
option subnet-mask 255.255.255.0;
default-lease-time 6000;
max-lease-time 72000;
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.100 192.168.0.220;
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
}
}

設定はいろいろな本などの受け売りですね(笑)。要は、ドメインネームサーバが「option domain-name-servers」で指定される192.168.0.1です。そしてsubnetによって192.168.0.0のネットワークに対して、末尾が100から220までのアドレスを割り振るということです。ルータは192.168.0.1ということになります。リースタイムなどの設定項目もあります。MSYKHOMEや最初のmsyk.dyndns.orgについては識別名のため動作には影響しない様です。option domain-nameはデフォルトのドメイン名を指定します。

もし、eth1ネットワーク側にもDHCPを有効にするなら、subnet XX.XX.XX.XX { } の記述が増えるということになります。

また、/etc/dhcpd.leasesというファイルを作っておきます。スーパーユーザ、つまりrootで「touch /etc/dhcpd.leases」などとコマンド入力をしておけばOKでしょう。アクセス権は、rootが所有者のままでかまわないようです。デーモンはroot権限のようですしね。

ところで、最初はこれで動いていたのですが、いろいろやっているうちに動かなくなっていました。それで、/var/log/messagesには、以下のようなメッセージが残っていました。

Jul 12 20:13:50 msykhome dhcpd: DHCPDISCOVER from 00:d0:09:1e:64:dd via eth0
Jul 12 20:13:51 msykhome dhcpd: DHCPOFFER on 192.168.0.100 to 00:d0:09:1e:64:dd via eth0
Jul 12 20:13:51 msykhome dhcpd: sendpkt: Network is unreachable

いくつかの書籍やWebサイトを見ていると、いろいろなところで「エラーが出たらこうしなさい」というのが書いてありました。

まず、/etc/hostsファイルに

255.255.255.255 all-ones

という行を加えます。さらに、/etc/rc.d/rc.localファイルの最後に

/sbin/route add -host 255.255.255.255 dev eth0

という記述を加えます。ipfwadmコマンドの直後で、fiコマンドの前がいいでしょう。これで、ブロードキャストを集めるそうです。この設定を行うと、DHCPサーバーがきちんと動き出しました。


←ケーブルテレビでインターネット・ホームに戻る