2002年8月20日火曜日

USB 1.1 vs USB 2.0 Benchmark



「USB 1.1 vs USB 2.0 Benchmark ~ Storage deviceの場合 ~」



http://his.luky.org/doc/usb-bench.html


Ver0.3 2002-08-20 Copyright(C) 2002, Hisaaki Shibata/柴田 尚明@福岡市
shibata@luky.org


LinuxでUSBインタフェースを利用して外付HDDを接続してみました。
外付HDDそのものは「USB 2.0対応」と明記されていたので、
手元のノートPC内蔵のUSB 1.1と PC card の USB 2.0 インタフェースに
接続して非常に簡単な性能比較を行なってみました。



ご意見は、
柴田までメールでお願いします。

尚、本ドキュメントは全文丸ごとであればどこへでも転載可能/リンク可能です(^^)






目次



0 .来歴・トピックス

1 .経緯

2 .関連情報/参考文献

3 .用意したhardware

4 .用意したsoftware

5 .性能測定


6 .いくつかの問題点

7 .TODO

8 .謝辞





0.来歴・トピックス


[次へ][目次へ]


2002-08-20 Ver. 0.3



  • CardBus USB2.0インタフェースカードのチップ記述追加
  • PCI USB2.0インタフェースカード経由の性能測定結果追記

2002-08-17 Ver. 0.2

  • 写真やリンク追加

2002-08-16 Ver. 0.1

  • 新規作成






1.経緯

[次へ][前へ][目次へ]


「ディスクが足りない。」この問題は、いつまでたっても付きまといます。
たとえノートPCの内蔵ディスク容量が1年毎に倍になったとしても、
何故か足りません。

私がメインで業務に利用しているノートPC Hitachi FLORA 220FX も
内蔵ディスク容量が20GBと一昔前では考えられないほどの容量になっても、
気がつくと使用率が90%を超しています。

これでは日々降り注ぐ添付ファイル付のメール豪雨を乗り切る事は出来ません(^^;



と、言う理由でUSB接続の外付HDDを購入する事にしました(^^;;

外付ケースにはどれも一長一短あったのですが、ドライブベイタイプとしても使えるものが比較的安く、しかも USB 2.0とあったので、購入してみました。



ついでと言っては何なのですが、ノートPC内蔵インタフェースであるUSB 1.1経由と、CardBusのUSB 2.0アダプタ経由で性能比較を行なってみました。






2.関連情報/参考文献

[次へ][前へ][目次へ]








3.用意したhardware

[次へ][前へ][目次へ]


性能を計った事もあり、ある程度正確にモデル名を示すようにします。


  • ノートPC 日立FLORA 220FX NP2のPentium III 750MHzモデル
  • 2.5インチハードディスクケース Century CDC25U2/35I左側が上蓋で、右側がHDDを内蔵したケースです。

    尚、このカードのUSBコントロールチップは、lspciの結果NEC製らしい事がわかりました。

    hong:/home/shibata# lspci
    00:00.0 Host bridge: Intel Corp. 440BX/ZX - 82443BX/ZX Host bridge (rev 03)
    中略
    00:0a.0 CardBus bridge: Texas Instruments PCI1410 PC card Cardbus Controller (rev 02)
    中略
    02:00.0 USB Controller: NEC Corporation USB (rev 41)
    02:00.1 USB Controller: NEC Corporation USB (rev 41)
    02:00.2 USB Controller: NEC Corporation: Unknown device 00e0 (rev 01)

  • 2.5inch HDD IBM Travelstar 40GN(IC25N040ATCS04) 40GB 4200rpm

  • USB2.0 CardBus PC Card RatocREX-CBU2



FLORA 220FX NP2
USB1.1インタフェースを内蔵しているのですが、USB2.0は非対応であるため、
CardBusのUSB2.0インタフェース
REX-CBU2
を利用しました。



CDC25U2/35Iへの給電は、USBのバスパワーが基本なのですが、足りない場合に備えてPS/2インタフェースから5Vを取り出すケーブルが添付されています。今回もこのケーブルを利用しました。




尚、
CDC25U2/35I
の中にはHDDのATAインタフェースに接続する小さな基板


が入っているだけのシンプルなものです。

その基板上には

in-system

と書かれたインタフェース変換らしいチップが載っていました。

探してみたところ、CypressのISD300A1のようです。





4.用意したsoftware

[次へ][前へ][目次へ]


4.1 Linux ディストリビューション



どのようなディストリビューションでもいいと思います。

今回はDebian GNU/Linux 3.0(woody)で行ないました。



4.2 linux-2.4.19.tar.bz2 or later



2.4.19からUSB2.0(ehci)が正式サポートされた事もあり、
ソースからmakeしたカーネルを利用しました。






5.性能測定

[次へ][前へ][目次へ]


5.1 ls -lR



USB経由でfsck,mke2fsを行なった外付HDD上に数万個以上のファイルをコピーし
ました。ノートPCにmountした上でmountしたトップディレクトリから


# time ls -lR|tail

を実行した結果を示します。

multi user modeで動作させたままでしたが、
他には特段重たいプログラムは動かしていない状態での測定です。












USB 1.1USB 2.0

real 14m49.500s

user 1m10.140s

sys 0m19.560s


real 9m11.731s

user 1m10.800s

sys 0m20.150s



このテストでは、USB2.0の場合はUSB1.1に比べて約1.6倍高速化されました。

5.2 find and cat



同じく100kbytes程度の数千個以上のファイルがある外付HDD上の
ディレクトリ上で


# time find . -type f -exec cat {} \; > /dev/null

を実行した結果を示します。

multi user modeで動作させたままでしたが、
他には特段重たいプログラムは動かしていない状態での測定です。












USB 1.1USB 2.0

real 24m52.944s

user 1m52.160s

sys 0m22.390s


real 4m7.810s


user 1m52.460s

sys 0m23.360s


このテストでは、USB2.0の場合はUSB1.1に比べて約6.0倍高速化されました。


尚、それぞれのテストはUSB1.1→USB2.0の順番で実施しましたが、
USB1.1のテスト終了後に外付ドライブは一度unmountし、別のmount pointに
マウントした後に測定しています。

また、find & catでのusb2.0でのテストの後にもう一度usb1.1でテストを
行ないましたが、real で3秒程度の差しかなく、ファイルバッファの影響は
排除できているのではないかと判断します。



ディスクを同じくIBMの
Travelstar

シリーズの
IC25N020A
に変更し、Pentium III 673MHz x 2の自作SMPマシンに
GIGABYTEのUSB2.0インタフェースカードである
GC-USB20N
に変更して同じファイル群での性能測定も行ないました

ドライブそのものは一世代前のものなので、性能は低くなるかと
思ったのですが、まずはその結果を以下に示します。








USB 2.0

real 2m7.539s


user 0m8.080s

sys 0m14.160s


CPUパワーがあるのが効いたのか、PCIバスのUSB2.0インタフェースカードが
効いたのか、Note PCにCardBusインタフェースの更に2倍程度の性能に
なっています。





6.いくつかの問題点

[次へ][前へ][目次へ]



CardBusのUSB2.0インタフェースカードは、以前のカーネルではきちんと認識してくれなかったのですが、linux-2.4.19ではすんなり認識しehci-hcdモジュールが組み込まれたのですが、USB2.0インタフェースを利用した後にCardBusを抜去すると、カーネルごと固まってしまいます(^^;

手動でehci-hcdモジュールをrmmodした後に抜去すると問題ありません。

もう少し調査してみようと思います。




7. TODO

[次へ][前へ][目次へ]


7.1 必ずやる


(1)bonnie++などの
ベンチマークソフトウエアを用いて、内蔵HDDも含めた比較を行ないます。


(2)ファイルサイズを変えてみてテストを行なう。

7.2 気が向いたら...


(1)その他のマシンでも測定してみる。
(2)ファイルサイズ別のアクセス結果をグラフの形でまとめる。

7.3 お金があったら...


(1)IEEE1394インタフェースの外付HDD箱との比較をしてみたいが、
箱を買うお金が...



8.謝辞

[次へ][前へ][目次へ]


私がLinuxを使えるようにしてくださったすべての方に感謝いたします。


また、この文書作成にあたっては、JFをはじめとする多くのドキュメントを参考にさせて頂いています。ありがとうございますm(_|_)m


以上


[玄関へ]
[総本店へ]

Last modified: Tue Aug 20 02:43:15 JST 2002


2002年5月18日土曜日

Happy Linux Home-LAN with ADSL, rp-pppoe, ipchains, ipmasqadm, Dynamic DNS



「幸せな家庭内LANへのメモ ~ ADSL, rp-pppoe, ipchains, ipmasqadm, Dynamic DNS ~」


http://his.luky.org/doc/adsl.html



Ver0.3 2002-05-18 Copyright(C) 2002, Hisaaki Shibata/柴田 尚明@福岡
shibata@luky.org


Linuxを家庭のゲートウエイとしてADSLでInternet接続する場合の各種設定に関してメモにまとめました。

思い返せば1996年5月に

「IP masqueradeとkerneldによるon-demand PPPで幸せな家庭内LANへのメモ」

からはや5年経ち、Internetへの接続環境も大きく変わりました。

当時は個人での常時接続は一部のリッチなユーザのものでしたが、現在は月額数千円でMbitオーダの接続回線が手軽に使えるようになりました。

これらをより使いこなすためにLinuxを使って簡単に設定できるところをまとめます。

ご意見は、柴田までメールでお願いします。


尚、本ドキュメントは全文丸ごとであればどこへでも転載可能/リンク可能です(^^)





目次



0 .来歴・トピックス

1 .経緯

2 .関連情報/参考文献

3 .用意したhardware

4 .用意したsoftware


5 .動作確認をしたもの

6 .いくつかの問題点

7 .TODO

8 .謝辞





0.来歴・トピックス


[次へ][目次へ]


2001-09-16 Ver. 0.1


  • 新規作成

2001-10-09 Ver. 0.2

  • 誤記訂正/ADSL種別の記述追加

2002-05-16 Ver. 0.3

  • 誤記訂正とその後の経過を追記





1.経緯

[次へ][前へ][目次へ]


家庭内LANもすっかり定着・安定してきたわが家ですが、ここ5~6年の間に
外部接続は28.8kbpsでのモデム接続からISDNによるオンデマンドダイヤルアップ、
さらにはフレッツISDNによる常時接続へと進化してきました。



これらの進化は、接続時間を伸ばして常時接続にするという方向での進化でした。
家庭内のクライアント向けのサービスとしては、多少遅くても常時接続が出来ている
と言うことが重要であり、ほぼ要求を満たすものでした。



一方、外部へのサービスを行うというニーズに対しては、ある程度高速な接続が必要であり、外部の太いネットワークに接続されているところにサーバをハウジングしなければなかなか難しいものでした。



しかしここに来て、ADSL、CATV、無線接続、FTTHといった高速接続環境も広く普及が始まっています。

こうなると、自宅のサーバを公開することも夢ではなくなりました。

ハウジング先に「リセットスイッチを押してくださいm(_|_)m」とお願いすることも
必要ありませんし、ディスクを増やすのも自由自在です。

��お金が続く限りにおいてですが(^^;




この文書では、サーバ公開をする上で必要な各種設定についてLinuxで実現する方法を順に示していきます。

手順としては、まず接続(PPPoE)、家庭内を守るファイヤーウォール(ipchains)、
サーバを公開する方法(ipmasqadm)、公開したサーバにhost名を割り振る方法(BINDでのDynamic DNS)と言う流れで説明します。

間違いや、より良い方法などありましたら教えてください。






2.関連情報/参考文献

[次へ][前へ][目次へ]










3.用意したhardware

[次へ][前へ][目次へ]



  • 複数台のPC+NIC
  • HUB
  • UTP Cable
  • ADSL modem



実際の自宅のネットワーク構成(の一部(^^;)を下図に示します。


ちなみに、わが家はもともとISDNを引いており、ADSLを引く機会に、若干のコスト低減をもくろんで、メタル回線に戻そうとしたのですが、電話番号が変わると言われたため、そのままISDNを残しています。(タイプ2接続と呼ばれているものです。)



タイプ2だとISDNとの干渉が問題になるかとも心配したのですが、今のところ退官できるような不具合は全くありません。


割り当てられるIPアドレスが、接続都度変更になるのは何とかしてほしいけど...

ADSL modemはNTT西日本のレンタルであり、modemとマシンA(hets)の間は10B-Tですが、家庭内は100B-Tです。


家庭内LANを使う場合、プライベートaddress空間を使うべきですね。
私は、192.168.0.0/24を使っています。

今回の主役は、ゲートウェイとなっている下図中のノートPC機であるマシンA(hets)です。





Internet<-->ISP
|
NTT
|
[ADSL modem]
|
|eth0
.------+-----. .------------.
|A NIC | |B |
| |eth1 | |
| NIC+--------------+ +-------------+NIC |
|Note PC |192.168.0.123 | | 192.168.0.12| |
`------------'hets | | `------------'hat
| |
.------------. .--+--+--. .------------.
|C | | | |C |
| NIC+-----------+ +----------+NIC |
| | | HUB | | |
| | `--------' | |
`------------'hawk `------------'hill



各マシンの概略仕様はそのうち追記します。

すべてLinuxを使っています。ライセンス上の問題は何もありません(^^)。





4.用意したsoftware

[次へ][前へ][目次へ]



以下のソフトウエアや設定は、ADSL modemに接続されたマシンAで実施します。



4.1 Linux ディストリビューション



どのようなディストリビューションでもいいと思います。

最近、「楽だなぁー」と思うのはVineです。redhat用の豊富なrpmが使える上に、
debianで確立されたaptが使えます。

rpmの取得には堀尾さん@北九州が砂場で運営している
ftp.rpmlinux.com
がおすすめですね。

いじり倒すなら相変わらずSlackwareかPlamoだと思います。
Debianもきっちり作るにはおすすめです。



最近の自宅内のマシンはほとんどがDebian/Gnu Linux woodyになってしまいました。

一度apt-getの楽さを知ってしまうと「もう他ではだめ」なのかも知れません(^^; (2002-05-18)



4.2 linux-2.2.19.tar.bz2 or later



2.4系のカーネルは、自宅内の実験マシンでは既に実用的に使えていますが、
ゲートウェイとして安定的に使うのは、自分の慣れの意味もあり2.2系にしました。

カーネルはディストリビューション付属のものではなく、自前で再構築しています。


カーネルも自宅内のマシンのほとんどは2.4.xです。(2002-05-18)



4.3 rp-pppoe-3.3 or later



PPPoEの実装はいくつかありますが、2.2系列で良く使われるのはrp-pppoeです。

本家は

http://www.roaringpenguin.com/pppoe/

です。

lukyでも公式にミラーしていて

http://roaringpenguin.luky.org/pppoe/

からもとれます。


redhat系のディストリビューションをお使いであれば、rpmを持ってきてそのまま


rpm -i

するか、srpmを持ってきて

rpm --rebuild

としてrpmをつくってからインストールしてください。

tar.gzのソースを持ってきた方はtar xvfzした後に、展開されたディレクトリにcdして

./go

で構築できます。



実は、NTT西日本はフレッツADSLを契約すると各OS用の接続キットを
CD-ROMに詰め込んで送ってくれて、Linux用のPPPoEのキットもソース込で
付いてくるのですが、MTUの設定関連でアクセスできないWebサイトがあるとか
いろいろと不都合があり、結局はrp-pppoeに落ち着きました。

今では安定して動いています。




次に以下の設定fileを作ります。

専用の adsl-setup と言うコマンドでもある程度作れます。

詳しくは

how-to-connect.txt

を見てみましょう。




/etc/ppp/options.pppoe




lock
noipdefault
holdoff 10 # wait 10 secs before trying to reopen connection

lcp-echo-failure 4 # Connection is timedout after 4 failed echo requests
lcp-echo-interval 0 # Send an lcp echo request every 30 secs.
mtu 1454 #required PPP transmit frame size for PPPoE to fit in 1500
mru 1454 #required PPP receive frame size for PPPoE to fit in 1500
receive-all #permits some flexabililty in converting ethernet frames
noauth #AC will not have to authenticate itself to your system
#nopcomp #RFC-2516 pcomp NOT RECOMMENDED. If they ask, ok to allow.
noaccomp #RFC-2516 MUST NOT ask for ACFC



/etc/ppp/pppoe.conf


コメント行は除きました。



ETH='eth0'
#「ユーザID」と「ISPのドメイン名」は各人の設定に合わせてね
USER='ユーザID@ISPのドメイン名'
DEMAND=no
DNSTYPE=SPECIFY
USEPEERDNS=no
# 「DNS1」「DNS2」もISPから指定があったサーバのIPアドレスに合わせてね
DNS1=10.0.0.1
DNS2=10.0.0.2
CONNECT_TIMEOUT=30
CONNECT_POLL=2
ACNAME=
SERVICENAME=
PING="."
CF_BASE=`basename $CONFIG`
PIDFILE="/var/run/$CF_BASE-adsl.pid"
SYNCHRONOUS=no
CLAMPMSS=1412
LCP_INTERVAL=20
LCP_FAILURE=3
PPPOE_TIMEOUT=80
FIREWALL=NONE
LINUX_PLUGIN=
PPPOE_EXTRA=""
PPPD_EXTRA=""




/etc/ppp/pap-secrets


このファイルのオーナはroot、パーミッションは600すね。



# PAP secrets file
# Format:
#name remote secret
"ユーザID@ISPのドメイン名" * "パスワード"



/etc/ppp/chap-secrets


このファイルのオーナもroot、パーミッションは600すね。




# CHAP secrets file
# Format:
#name remote secret
"ユーザID@ISPのドメイン名" * "パスワード"




とりあえず、この状態でredhat系ならば


chkconfig --add adsl

その他の場合は

/usr/sbin/adsl-start

で接続するはずです。

redhat系以外の場合は /etc/rc.d/rc.local の最後の方にでも /usr/sbin/adsl-start
を追記すると良いでしょう。



接続状態での/sbin/ifconfigの結果は以下のようになります。

尚、ADSL modem側のNIC(Eth0)のIPアドレスは、この場合あまり意味がありません。
(と、言うかifupしなくても良いようです。)



eth0 リンク方法:イーサーネット ハードウェアアドレス 00:80:C8:87:53:3B
inetアドレス:10.0.0.1 ブロードキャスト:10.0.0.255 マスク:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:103766133 errors:0 dropped:0 overruns:0 frame:0
TX packets:88349239 errors:0 dropped:0 overruns:0 carrier:0
衝突(Collisions):1709 TXキュー長:100
RX bytes:734847061 (700.8 Mb) TX bytes:916605863 (874.1 Mb)
割り込み:9 ベースアドレス:0x300
eth1 リンク方法:イーサーネット ハードウェアアドレス 00:E0:98:05:05:6D
inetアドレス:192.168.0.123 ブロードキャスト:192.168.0.255 マスク:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:75336055 errors:3 dropped:1806 overruns:0 frame:489
TX packets:91333879 errors:0 dropped:0 overruns:0 carrier:0
衝突(Collisions):0 TXキュー長:100
RX bytes:1423775122 (1357.8 Mb) TX bytes:1926202346 (1836.9 Mb)
割り込み:10 ベースアドレス:0x340

lo リンク方法:ローカルループバック
inetアドレス:127.0.0.1マスク:255.0.0.0
UP LOOPBACK RUNNING MTU:3924 Metric:1
RX packets:166174 errors:0 dropped:0 overruns:0 frame:0
TX packets:166174 errors:0 dropped:0 overruns:0 carrier:0
衝突(Collisions):0 TXキュー長:0
RX bytes:10578912 (10.0 Mb) TX bytes:10578912 (10.0 Mb)

ppp0 リンク方法:Point-to-Pointプロトコル
inetアドレス:61.xxx.yyy.zzz P-t-P:211.aaa.bbb.ccc マスク:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1454 Metric:1
RX packets:2082098 errors:0 dropped:0 overruns:0 frame:0
TX packets:1799927 errors:0 dropped:0 overruns:0 carrier:0
衝突(Collisions):0 TXキュー長:10
RX bytes:2090397793 (1993.5 Mb) TX bytes:192075749 (183.1 Mb)




psの状況も示します。



PID TTY STAT TIME COMMAND
1 ? S 0:41 init [3]
[中略]
1968 ? S 0:00 /usr/sbin/pppd pty /usr/sbin/pppoe -p
/var/run/pppoe.conf-adsl.pid.pppoe -I eth0 -T 80 -U -m 1412
noipdefault noauth default-asyncmap defaultroute hide-password
nodetach local mtu 1492 mru 1492 noaccomp noccp nobsdcomp
nodeflate nopcomp novj novjccomp user ユーザ名@ISPドメイン名
lcp-echo-interval 20 lcp-echo-failure 3
1969 ? R 35:42 /usr/sbin/pppoe -p /var/run/pppoe.conf-adsl.pid.pppoe
-I eth0 -T 80 -U -m 1412
[以下省略]






4.4 ipchains 1.3.10 or later



Linuxのポートフィルタもipfw -> ipfwadm -> ipchainsと進化しています。

2.4系のカーネルではさらに機能豊富なiptablesを使うようです。

2.2系のカーネルを採用したほとんどのディストリビューションで
ipchainsは採用されているようなので、インストールに関しては省略します。



シンプルな設定に関しては2 .関連情報/参考文献
示してある文献を参考にして設定すれば十分でしょう。


以下は、私がマシンAで設定しているものです。

穴を見つけたら、教えてください(^^;




#!/bin/sh
#
# fire wall setting on hets.luky.org /etc/rc.d/rc.ipchains
# last updated: 2001-04-21 Hisaaki Shibata
# last updated: 2001-02-15 Hisaaki Shibata
# original: 2000-07-09 Hisaaki Shibata

#<参考文献>
# Linux IPCHAINS-HOWTO by Rusty Russell
# v1.0.8, Tue Jul 4 14:20:53 EST 2000
# http://www.linuxdoc.org/HOWTO/IPCHAINS-HOWTO.html
#
# Top Ten Blocking Recommendations Using ipchains
# Paul Tiedemann August 8, 2000
# http://www.sans.org/infosecFAQ/firewall/blocking_ipchains.htm
#
# TrinityOS: A Guide to Configuring Your Linux Server for
# Performance, Security, and Managability
# David A. Ranch, dranch@trinnet.net October 15, 2000
# http://www.ecst.csuchico.edu/~dranch/LINUX/TrinityOS/cHTML/\
# TrinityOS-101500c.html
#
# 森岡さんの設定
# Message-Id: <20010120120521084.OZC.13014.t-mta2.odn.ne.jp@mta2.odn.ne.jp>

#<ネットワーク接続図>
# Flets ADSL経由で The Internet へ
# |
# ppp0 | Dynamic Address Assign 0.0.0.0/255.255.255.255
# +-----+-----+
# | |
# | | eth0
# | +----- PPPoE用インタフェース(ADSLモデムへストレート接続)
# | | 10.0.0.1/255.0.0.0
# | |
# +-----+-----+
# eth1 | 192.168.0.123/255.255.255.0
# |
# 家庭内部LANへ

#<下記のipchainsの設定ポリシー>
#

# ・input chainsは、必要なもののみACCEPTにして、それ以外は最後にDENY。
# ・output chainsは、全てACCEPTにする。(つまりdefaultのまま)
#
#
# ・PPPoE-LANに対してはipmasqueradeもroutingも行わない
# ・全てDENYにする。
#
#
# ・内部LANに対してはroutingを行う
# ・input chainsは、必要なもののみACCEPTにして、それ以外は最後にDENY。
# ・input chainsで許可したアクセスで且つ外部LANへのforward chainsは、
# 全てACCEPTにする。
# ・output chainsは、全てACCEPTにする。(つまりdefaultのまま)

#
#IPCHAINS="/sbin/ipchains -v "
IPCHAINS=/sbin/ipchains

# 結局、1024: 以降の全てが、リモートホストの短命ポート
# reph_portとは、remote ephemeral portの略
reph_port=1024:
echo "local ephemeral port=" $reph_port

#
# ping -bに答えない
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Enable bad error message protection
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# ipmasqのためにroutingする
echo 1 > /proc/sys/net/ipv4/ip_forward
# source routing禁止
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 0 > /proc/sys/net/ipv4/conf/default/accept_source_route
# IP defrag
echo 0 >/proc/sys/net/ipv4/ip_always_defrag
# TCP SYN Cookie Protection
echo 1 >/proc/sys/net/ipv4/tcp_syncookies
# source address 確認
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f
done
# ICMP Redirect 受付けない
for f in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo 0 > $f
done
# source routed packets 受付けない
for f in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo 0 > $f
done
# spoofed, source-routed, redirect packets のロギング
for file in /proc/sys/net/ipv4/conf/*/log_martians; do
echo "1" > $file
done

####################################################
# 2001.06.02 shibata@luky.org
/sbin/insmod ip_masq_ftp
/sbin/insmod ip_masq_irc
/sbin/insmod ip_masq_raudio
/sbin/insmod ip_masq_portfw

####################################################
#
# リモートからのオペレーションチョンボを行ったときに
# 困るので(^^;、default policyはACCEPTにしておく。
# (堅くしたい人はDENYにしてもいいけど)
# また、再設定時にも有効になるようにルールをフラッシュする。
$IPCHAINS -X
$IPCHAINS -P input ACCEPT
$IPCHAINS -F input
$IPCHAINS -P output ACCEPT
$IPCHAINS -F output
$IPCHAINS -P forward ACCEPT
$IPCHAINS -F forward

# まず最初に、スクリプト起動時に筒抜けになるのを防止するため、
# local loop back以外の全ての入口を閉じて forwarding も禁止する。
# 最後にこのinput chainをdeleteしないと何もできなくなる(^^;
# こうするべきであるが、スクリプトにチョンボがあって最後まで行かないと
# 困るので、初期ポリシーは素通しにしておく。

# local loop backに関しては全開
$IPCHAINS -A input -i lo -j ACCEPT

# 全ての戻りtcpパケット(localの短命ポート向けでSYNが立っていないもの)は許可
# ソースポートも縛る方がいいかもしれないが、コネクションが確立していない
# はずなので、これでよしとする
# ftpのPASVモードについては、もっと下の方で許可している
# ログ残さない
$IPCHAINS -A input -p tcp --dport $reph_port ! -y -j ACCEPT

# for home network
# eth1がsourceで、192.168.0.0/24からのもの
$IPCHAINS -A input -s 192.168.0.0/24 -i eth1 -j ACCEPT

# IP spoofing防止 (local loop back , private addr., local link ddr.)
# 下記の192.168.0.0/16からのパケットで、eth1からの正しいものは
# 直上のルールでACCEPTされているから、ここで弾かれるのはspoofing
# みてる暇がないのだが、統計情報取得のためログ取ってステ
$IPCHAINS -A input -b -s 127.0.0.0/8 -j DENY -l
$IPCHAINS -A input -b -s 10.0.0.0/8 -j DENY -l
$IPCHAINS -A input -b -s 172.16.0.0/12 -j DENY -l
$IPCHAINS -A input -b -s 169.254.0.0/16 -j DENY -l
$IPCHAINS -A input -b -s 192.168.0.0/16 -j DENY -l
$IPCHAINS -A input -b -s 240.0.0.0/5 -j DENY -l
$IPCHAINS -A input -b -s 255.255.255.255/32 -j DENY -l

# IP spoofing防止 (内部LAN)
# eth1 からで、ソースアドレスが 192.168.0.0/24以外のパケットはログ取ってステ
$IPCHAINS -A input -s ! 192.168.0.0/24 -i eth1 -j DENY -l

# やたら来るものもログ取って捨てる
# UDP echo Broadcast
$IPCHAINS -A input -p udp --dport 7 -j DENY -l
# Incoming NETBIOS Broadcast
$IPCHAINS -A input -p udp --dport 137:139 -j DENY -l
# Incoming RIP Broadcast
$IPCHAINS -A input -p udp --sport route --dport route -j DENY -l
# Incoming BOOTP Broadcast
$IPCHAINS -A input -p udp --dport bootps:bootpc -j DENY -l
# ICMP router discovery
$IPCHAINS -A input -p icmp --sport 9:10 -j DENY -l
# SUNRPC
$IPCHAINS -A input -p tcp --dport 111 -j DENY -l

# 全てのネットワークに対して開放するサービス
# ICMPは限定して通す
# ICMP echo
$IPCHAINS -A input -p icmp --sport 0 -j ACCEPT
# ICMP destination unreachable
$IPCHAINS -A input -p icmp --sport 3 -j ACCEPT
# ICMP source quench
$IPCHAINS -A input -p icmp --sport 4 -j ACCEPT
# ICMP echo request
$IPCHAINS -A input -p icmp --sport 8 -j ACCEPT
# ICMP time exceeded
$IPCHAINS -A input -p icmp --sport 11 -j ACCEPT
# ICMP parameter problem
$IPCHAINS -A input -p icmp --sport 12 -j ACCEPT

# IGMP
$IPCHAINS -A input -p igmp -j ACCEPT

# 全てのネットワークに対して開放するサービス
# ssh,DNS,www,https,smtp,ftp,ftp-data,auth,rsync,ntp,snmp,irc

# ftp-data 20 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 20 ! -y -j ACCEPT -l
$IPCHAINS -A input -p tcp --sport 20 --dport $reph_port -j ACCEPT
# for pasv transfer mode
$IPCHAINS -A input -p tcp --sport $reph_port --dport $reph_port ! -y -j ACCEPT

# ftp 21 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 21 -j ACCEPT -l

# ssh 22 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 22 -j ACCEPT

# 禁止だけど、一応エントリだけ書いておく
# # telnet 23 (tcp)
# $IPCHAINS -A input -p tcp --sport $reph_port --dport 23 -j ACCEPT

# smtp 25 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 25 -j ACCEPT

# time 37 (tcp+udp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 37 -j ACCEPT
$IPCHAINS -A input -p udp --sport $reph_port --dport 37 -j ACCEPT

# domain 53 (tcp+udp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 53 -j ACCEPT
$IPCHAINS -A input -b -p udp --sport $reph_port --dport 53 -j ACCEPT
$IPCHAINS -A input -p udp --sport 53 --dport 53 -j ACCEPT

# www 80 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 80 -j ACCEPT

# pop-3 110 (tcp)
# ssh経由でlocalhostからのみ許可なので、エントリだけ書く
# localhostからは、何でもありなので、書かない。
#$IPCHAINS -A input -p tcp --sport $reph_port --dport 110 -j ACCEPT

# auth 113 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 113 -j ACCEPT

# ntp 123 (tcp+udp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 123 -j ACCEPT -l
$IPCHAINS -A input -p udp --sport $reph_port --dport 123 -j ACCEPT -l
$IPCHAINS -A input -p tcp --sport 123 --dport 123 -j ACCEPT -l
$IPCHAINS -A input -p udp --sport 123 --dport 123 -j ACCEPT -l

# snmp 161 (tcp+udp)
#$IPCHAINS -A input -p tcp --sport $reph_port --dport 161 -j ACCEPT
#$IPCHAINS -A input -p udp --sport $reph_port --dport 161 -j ACCEPT

# snmp-trap 162 (udp)
#$IPCHAINS -A input -p udp --sport $reph_port --dport 162 -j ACCEPT

# irc 194 (tcp+udp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 194 -j ACCEPT
#$IPCHAINS -A input -p udp --sport $reph_port --dport 194 -j ACCEPT

# https 443 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 443 -j ACCEPT

# rsync 873 (tcp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 873 -j ACCEPT

# ircd 6660-6668 (tcp+udp)
$IPCHAINS -A input -p tcp --sport $reph_port --dport 6660:6668 -j ACCEPT
#$IPCHAINS -A input -p udp --sport $reph_port --dport 6660:6668 -j ACCEPT

# 家庭用ipmasq
$IPCHAINS -A forward -s 192.168.0.0/24 -d 0/0 -j MASQ

# 最後に、上記のchainsに該当しない input パケットを全てDENYする。
# forward パケットもDENYする。
# ログを残す
$IPCHAINS -A input -i ! lo -j DENY -l
$IPCHAINS -A forward -j DENY -l

# end of rc.ipchains




4.5 ipmasqadm-0.4.2 or later




ipmasqで囲ったプライベートアドレス空間上のサーバを外部に公開する方法として
ipmasqadmを使ったポート転送(port forwarding)を使う方法があります。

man pageにもport forwardingに関して詳しい記述はないですが、簡単な使い方は
/usr/sbin/ipmasqadm portfw -h を実行すると、下記のように表示される。





Usage: portfw -a -P PROTO -L LADDR LPORT -R RADDR RPORT [-p PREF] add entry
portfw -d -P PROTO -L LADDR LPORT [-R RADDR RPORT] delete entry
portfw -f clear table
portfw -l list table
portfw -n no names

PROTO is the protocol, can be "tcp" or "udp"
LADDR is the local interface receiving packets to be forwarded.
LPORT is the port being redirected.
RADDR is the remote address.
RPORT is the port being redirected to.
PREF is the preference level (load balancing, default=10)


単純なポートの転送だけでなく、重みをつけて複数の転送を定義できることも
わかります。



ここでは、外部からマシンAのポート80(www)へのアクセスに対して、
家庭内のマシンB(192.168.0.12)のポート80へ単純に転送する、
つまりマシンBを外部に公開する例を示します。


コマンドレベルだと以下のようになります。



/usr/sbin/ipmasqadm portfw -f
/usr/sbin/ipmasqadm portfw -a -P tcp -L ppp0のIPアドレス 80 -R 192.168.0.12 80




しかし、これをこのままスクリプトに埋め込むことはできません。

と言うのも私が契約しているISPはADSLユーザに対して固定IPアドレスを割り振らず、
接続毎にダイナミックにIPアドレスを割り振るため、接続都度IPアドレスが
変わるからです。

また、こちらから故意にISPへの接続を切らない場合でもどういうタイミングだか
わかりませんが、接続が切られる事があります。
再接続後は全く別のIPアドレスが割り振られています。

(再接続するようなrp-pppoeの設定にしているからまだ良い方なのですが)




ISPから割り振られたIPアドレスは /usr/sbin/ifconfig ppp0を実行すると、
下記のように表示されますので、これをipmasqadmの引数として渡せば良さそうです。



ppp0 リンク方法:Point-to-Pointプロトコル
inetアドレス:61.xxx.yyy.zzz P-t-P:211.aaa.bbb.ccc マスク:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1454 Metric:1
RX packets:2091425 errors:0 dropped:0 overruns:0 frame:0
TX packets:1809497 errors:0 dropped:0 overruns:0 carrier:0
衝突(Collisions):0 TXキュー長:10
RX bytes:2092322201 (1995.3 Mb) TX bytes:193103042 (184.1 Mb)





最も手間をかけずにやるときは、私はsedやawkをshellと組み合わせて使います。

例えば、下記のような感じです。



#!/bin/sh
echo "/usr/sbin/ipmasqadm portfw -f" > /tmp/ipmasqfw.sh
LANG=c /sbin/ifconfig ppp0|grep inet|\
sed 's/ *inet addr:/\/usr\/sbin\/ipmasqadm portfw -a -P tcp -L /;
s/ P-t-P.*/ 80 -R 192.168.0.12 80/;' >> /tmp/ipmasqfw.sh

. /tmp/ipmasqfw.sh
/bin/rm -f /tmp/ipmasqfw.sh





もっと最適化したやり方があるとか、本当はテンポラリなファイルを作らない方が
良いとか、セキュリティ上/tmpじゃない方が良いとか、エラー時にはそれなりの
報告をするとかいろいろありますので、その辺りのチェック/変更を加えれば
尚良いかと思います。



また、ftpサーバを公開したい場合のコマンドラインは



/usr/sbin/ipmasqadm portfw -f
/usr/sbin/ipmasqadm portfw -a -P tcp -L ppp0のIPアドレス 20 -R 192.168.0.12 20
/usr/sbin/ipmasqadm portfw -a -P tcp -L ppp0のIPアドレス 21 -R 192.168.0.12 21


となります。これらも設定したい方はちょっとした変更で応用できます。





4.6 BIND-8.2.4 or later




今までの所で家庭内LANのサーバを外部に公開するまでは出来ましたが、
ダイナミックに割り振られるIPアドレスをどうやって人に伝えるのかという
問題があります。

また、IPアドレスをURIとして人に伝える事ができたとしても、
次のタイミングでIPアドレスがわかることがあるので、
ドキュメントとして残すことはできません。

これらを解決する方法としてDynamic DNSと言うものがあります。



世の中にはDynamic DNSのサービスを無償で提供しているプロバイダもあるようですが、
ドメイン名はそのプロバイダのものであり、サブドメイン部分またはホスト名部分だけ
が自前のものであるのは、私はちょっと頂けません。



外部にDNSに関して自由になるサーバがある事が前提(^^;になりますが、自前でDynamic
DNSサーバをあげてみましょう。

最近のBINDは非常に簡単にDynamic DNSが実現できます。



まず、静的なIPアドレスを持つDNS サーバをあげてみましょう。


以下のような設定を例とします。

より詳細な設定に関しては
2 .関連情報/参考文献

bind-8 のインストールメモ

などを参照してください。


/etc/named.conf




options {
directory "/etc/named.db";
/*
* If there is a firewall between you and nameservers you want
* to talk to, you might need to uncomment the query-source
* directive below. Previous versions of BIND always asked
* questions using port 53, but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
};
//
// boot file for name server
//
// NOTE: unconverted directive 'type domain source host/file backup file'

zone "." {
type hint;
file "named.root";
};

// NOTE: unconverted directive 'domain luky.org'

zone "localhost" {
type master;
file "localhost.d";
};

zone "0.0.127.IN-ADDR.ARPA" {
type master;
file "localhost.rev";
};
zone "UriUri.com" {
type master;
file "uriuri.com.zone";
allow-update { 127.0.0.1; 211.8.90.175;};
allow-transfer { any; };
allow-query { any; };
};



上記のポイントは allow-update のエントリです。

zone ファイルのエントリ更新を許可する host の IP アドレスを記述します。

この例では localhost の IP アドレスと、その DNS サーバのIPアドレスを記述しています。

(あちこちから勝手に更新されてはひどいことになりますので。)



固定アドレスで割り当てるzoneファイルは下記のように普通に作成します。

/etc/named.db/uriuri.com.zone




;BIND DUMP V8
$ORIGIN com.
UriUri 172800 IN MX 10 hoop.uriuri.com. ;Cl=2
172800 IN NS hoop.uriuri.com. ;Cl=2
172800 IN SOA hoop.uriuri.com. root.hoop.uriuri.com. (
2001091007 7200 1800 1209600 172800 ) ;Cl=2
$ORIGIN UriUri.com.
hoop 172800 IN MX 10 hoop.uriuri.com. ;Cl=2
172800 IN A 211.8.190.175 ;Cl=2
localhost 172800 IN A 127.0.0.1 ;Cl=2
mail 172800 IN MX 10 hoop.uriuri.com. ;Cl=2
www 172800 IN CNAME hoop.uriuri.com. ;Cl=2
hets 1200 IN A 61.xxx.yyy.zzz ;Cl=2
ns 172800 IN CNAME hoop.uriuri.com. ;Cl=2
ftp 172800 IN CNAME hoop.uriuri.com. ;Cl=2



上記のうち、hetsの行は、Dynamic DNSによって付け加えられたエントリーです。



動的なエントリの追加削除はnsupdateコマンドで実現できます。

試しに上記のサーバにloginして実行してみます。



root@hoop(6)$ nsupdate
> update delete hets.uriuri.com A
> update add hets.uriuri.com 300 A 61.xxx.yyyy.zzz
>




update addの後は、空リターンを実行し、その後はctrl-dで抜けます。



エラーも出なくてうまく行っているようだったら、nslookupしてみます。



root@hoop(14)$ nslookup
Default Server: hoop.uriuri.com
Address: 211.8.190.175

> hets.uriuri.com
Server: hoop.uriuri.com
Address: 211.8.190.175

Name: hets.uriuri.com
Address: 61.xxx.yyy.zzz

> exit


良い感じですね。




念のためlogも見てみます。

この場合のlogは/etc/named.db/uriuri.com.zone.logになります。



;BIND LOG V8
[DYNAMIC_UPDATE] id 47831 from [211.8.190.175].4991 at 1000640318 (named pid 1346):
zone: origin UriUri.com class IN serial 2001091007
update: {delete} hets.uriuri.com. IN A
update: {add} hets.uriuri.com. 300 IN A 61.xxx.yyy.zzz


きちんと出来ているようです。



後は、ADSLゲートウェイとなっているマシンA側のIPアドレス割り当てに変更が
あったときに、DNSサーバ上で上記コマンドを実行すれば良いことがわかります。



ここで問題になるのは、二つの点です。


どうやってIPアドレスが変わったことを検知するのかという事と、変更後のIPアドレス
を持つマシンAからDNSサーバ上でnsupdateを実行するかという事です。



これに関するスマートな解は

ねぎ式: Dynamic DNS で固定ホスト名にして遊ぼう

に書かれていますので、これを利用する方が良いでしょう。



私も、先に知っていれば上記のやり方をそのままパクっていたと思いますが、
私はもっと泥臭いやり方でやってます(^^;



まず、マシンA側でIPアドレスの変更を検知する方法ですが、
cronで1分毎にppp0に割り当てられているIPアドレスをチェックしています。

検知方法自体はipmasqadmのところで実現していますから、
これをちょっと修正すれば良いことがわかります。


具体的にはcrontabに下記のような記述をしています。



* * * * * /home/shibata/check_ip.sh




check_ip.shは以下のようなものです。すごく泥臭いですね(^^;

/home/shibata/check_ip.sh




#!/bin/sh
/bin/mv -f /tmp/pppoe_ip.now /tmp/pppoe_ip.old
/sbin/ifconfig ppp0|grep inet > /tmp/pppoe_ip.now
diff /tmp/pppoe_ip.old /tmp/pppoe_ip.now > /tmp/pppoe_ip.diff
if [ -s /tmp/pppoe_ip.diff ]; then
/bin/mail -s hets.pppoe-ip_change 携帯電話のメールアドレス < /tmp/pppoe_ip.diff
RSYNC_PASSWORD=hogehoge /usr/bin/rsync -av -e ssh /tmp/pppoe_ip.now nameduser@hoop.euqset.org::named)
fi
echo > /dev/null
#end



アドレスに変更があると、携帯電話にメールが来るようにしています。

これは、一応知っておきたいという事と、携帯からさらに普通のe-mailに
転送することで、どういうタイミングでアドレスの再割り当てが発生しているかの
ログを残すためです。

さらに、DNSサーバ側にはrsyncでファイルを転送しています。

(メールでの転送からprocmail私に変えようかとも思って途中まで出来ているのですが、
ねぎ式を越えるのはなかなか難しそう。)



もちろんDNSサーバ側ではrsync --daemonを動かしておく必要があります。

ここではrsyncを動かすのに必要な/etcrsyncd.confの例だけを示しておきます。

/etc/rsyncd.conf





#
# /etc/rsyncd.conf
# for hoop.uriuri.com
#

#global
uid = nobody
gid = nogroup
use chroot = no
max connections = 2
syslog facility = local5
pid file = /var/run/rsyncd.pid

[named]
path = /home/named
comment = hoop.uriuri.com /home/named
read only = no
hosts allow = 61.0.0.0/8,hoop.uriuri.com
auth users = nameduser
secrets file = /etc/rsyncd.secrets




さて、DNSサーバ側では以下のような設定にしてます。これまた泥臭い(^^;

まず、crontabです。



* * * * * /home/named/dnsup.sh





上記で起動しているdnsup.shも示します。

dnsup.sh




#!/bin/sh
/bin/cat /home/named/hets.uriuri.com-templ > /home/named/hets.uriuri.com-ip
/bin/cat /home/named/pppoe_ip.now|\
sed 's/.* addr:/update add hets.uriuri.com 300 A /;
s/ *P-t-P.*//'>>/home/named/hets.uriuri.com-ip
echo >>/home/named/hets.uriuri.com-ip

/usr/bin/nslookup hets.uriuri.com hoop.uriuri.com|tail -2|head -1|sed 's/Address: *//' > /home/named/dns.now
/bin/cat /home/named/pppoe_ip.now|sed 's/.* addr://;s/ *P-t-P.*//' > /home/named/dns.next
/usr/bin/diff /home/named/dns.now /home/named/dns.next > /home/named/dns.diff

if [ -s /home/named/dns.diff ]
then
/usr/bin/nsupdate /home/named/hets.uriuri.com-ip
/usr/bin/nslookup hets.uriuri.com hoop.uriuri.com|\
mail -s "hets.uriuri.com IP change" shibata@luky.org
else
echo >/dev/null
fi






5.動作確認をしたもの

[次へ][前へ][目次へ]




  • 家庭内LANの複数のhostから外部アクセスが出来ている
  • IPアドレス割り当ての変更があったことがDynamic DNSに反映される
  • 家庭内LAN上のWebサーバが、外部から参照できる



6.いくつかの問題点

[次へ][前へ][目次へ]


手間ひまをかけるよりも、安価な家庭用のブロードバンドルータと呼ばれるものが
出てきている(^^;



7. TODO

[次へ][前へ][目次へ]



7.1 必ずやる


(1)Dynamic DNSでのIPアドレス変更通知方式をもう少しまともにしたい


メールでの通知を行う方法も実施しました。簡単なので今は省略。(2002-05-18)

(2)外部向けのサーバの構築を急ぐ。具体的にはストリーミング系のサービスを行いたい。

こちらも、一時期自宅にUSBカメラを置いて灰皿と温度計を監視し、灰皿から煙が立ち上っていないか、またPC内の温度が上がりすぎていないかを外部から監視できるようにしていました。(2002-05-18)

7.2 気が向いたら...


(1)プロキシ(squid)やIRCエージェント(plum)、時刻同期サーバ(xntpd)なども
動かしているので、これらも追記するか別文書にまとめる。

(2)現在ノートPCで実現しているゲートウエイをOpenBlockSに移行する。



OpenBlockSでも動いたのですが、移行が面倒なのでそのままにしています。

また、その後B-Fletsに移行したのを期に専用BBルータであるCentury Systems社XR-300に移行しました。
XR-300のハード構造はOpenBlockSSと同じであり、OSもLinuxで動いています。iptablesの定義などもそのまま行けるので楽しちゃいました。(2002-06-18)

(3)bootable CD-ROMとFDの組合わせで今回の仕組みを実現する。


XR-300に移行しちゃったので、なしですm(_|_)m (2002-06-18)

(4)外部からのアタックレポートを公開する。


これはやめとこ(^^; (2002-06-18)

7.3 お金があったら...



(1)Bフレッツに移行。

実は既に申し込み済です。(2001-10-09)

上記に書いたように、現在B-Flets + XR-300環境です。

でもお金はありません(^^;; (2002-06-18)




8.謝辞

[次へ][前へ][目次へ]


私がLinuxを使えるようにしてくださったすべての方に感謝いたします。


また、この文書作成にあたっては、JFをはじめとする多くのドキュメントを参考にさせて頂いています。ありがとうございますm(_|_)m



尚、今回のADSL対応サーバ構築においては、九州ギガポッププロジェクト:qgpopにおけるADSL実験として、複数ISPでの比較をする機会を頂きました。

特にqgpopリーダの平原様と、ISITにてADSL実験を取纏めて下さった大部様に感謝の意を表します。


以上


[玄関へ]
[総本店へ]



Last modified: Sat May 18 11:48:22 JST 2002


2002年5月1日水曜日

OBS写真

OpenBlockS(S) photo index






























































[photo/batt/OBS-batt-1.jpg]
photo/batt/OBS-batt-1.jpg
36819 bytes
582 x 411
[photo/batt/OBS-batt-2.jpg]
photo/batt/OBS-batt-2.jpg
32728 bytes
496 x 452
[photo/batt/OBS-batt-3.jpg]
photo/batt/OBS-batt-3.jpg
36107 bytes
495 x 402
[photo/batt/OBS-batt-4.jpg]
photo/batt/OBS-batt-4.jpg
28519 bytes
491 x 347
[photo/batt/OBSS-batt-1.jpg]
photo/batt/OBSS-batt-1.jpg
33985 bytes
353 x 392
[photo/batt/OBSS-batt-2.jpg]
photo/batt/OBSS-batt-2.jpg
47234 bytes
492 x 384
[photo/batt/OBSS-batt-3.jpg]
photo/batt/OBSS-batt-3.jpg
39867 bytes
478 x 327
[photo/fan/OBS-newFAN-1.jpg]
photo/fan/OBS-newFAN-1.jpg
29843 bytes
515 x 411
[photo/fan/OBS-newFAN-2.jpg]
photo/fan/OBS-newFAN-2.jpg
24772 bytes
452 x 346
[photo/fan/OBS-newFAN-3.jpg]
photo/fan/OBS-newFAN-3.jpg
31028 bytes
570 x 348
[photo/fan/OBS-newFAN-4.jpg]
photo/fan/OBS-newFAN-4.jpg
35487 bytes
495 x 360
[photo/fan/OBSS-newFAN-1.jpg]
photo/fan/OBSS-newFAN-1.jpg
33922 bytes
457 x 427
[photo/fan/OBSS-newFAN-2.jpg]
photo/fan/OBSS-newFAN-2.jpg
28292 bytes
475 x 308
[photo/fan/OBSS-newFAN-3.jpg]
photo/fan/OBSS-newFAN-3.jpg
25411 bytes
541 x 287
[photo/fan/OBSS-newFAN-4.jpg]
photo/fan/OBSS-newFAN-4.jpg
18039 bytes
514 x 231
[photo/fan/OBSS-newFAN-5.jpg]
photo/fan/OBSS-newFAN-5.jpg
25158 bytes
530 x 298
[photo/fan/OBSS-newFAN-6.jpg]
photo/fan/OBSS-newFAN-6.jpg
33931 bytes
455 x 301
[photo/obs/3cards.jpg]
photo/obs/3cards.jpg
41251 bytes
425 x 395
[photo/obs/BACK.jpg]
photo/obs/BACK.jpg
28391 bytes
506 x 304
[photo/obs/BRIDGEcard.jpg]
photo/obs/BRIDGEcard.jpg
33827 bytes
517 x 314
[photo/obs/CASE-disk.jpg]
photo/obs/CASE-disk.jpg
28649 bytes
492 x 367
[photo/obs/CF-MAINcards.jpg]
photo/obs/CF-MAINcards.jpg
22243 bytes
255 x 348
[photo/obs/CFcard-back.jpg]
photo/obs/CFcard-back.jpg
27892 bytes
528 x 351
[photo/obs/CFcard.jpg]
photo/obs/CFcard.jpg
35996 bytes
497 x 341
[photo/obs/FRONT-CASE.jpg]
photo/obs/FRONT-CASE.jpg
42346 bytes
640 x 480
[photo/obs/FRONT.jpg]
photo/obs/FRONT.jpg
31677 bytes
445 x 327
[photo/obs/HDD-MAIN.jpg]
photo/obs/HDD-MAIN.jpg
28203 bytes
290 x 383
[photo/obs/MAINcard-back.jpg]
photo/obs/MAINcard-back.jpg
56449 bytes
573 x 417
[photo/obs/MAINcard.jpg]
photo/obs/MAINcard.jpg
63040 bytes
552 x 419
[photo/obss/obss-fan.jpg]
photo/obss/obss-fan.jpg
85666 bytes
640 x 480
[photo/obss/obss-front.jpg]
photo/obss/obss-front.jpg
85855 bytes
640 x 480
[photo/obss/obss-top.jpg]
photo/obss/obss-top.jpg
85450 bytes
640 x 480




Generated by HTMLThumbnail 1.1.4




1997年9月13日土曜日

mini Watch Dog Timer with Linux

「遠くのサーバも柴犬に見張らせれば大丈夫(^^)」


Ver 0.2 Copyright(C) 1997, Hisaaki Shibata


柴田 尚明@福岡

shibata@opost1.netspace.or.jp


何らかの要因、例えば電源の瞬断などでハングアップしてしまったリモートにあるLinuxboxに対して、自動でハードウエアリセットしたり電源を落としたりして復旧させる仕組みを考えています。

公開してご意見を伺い、出来ればもうちょっと改良したいと思っておりますm(_|_)m。


1997年5月2日金曜日

Happy Linux Home-LAN with IP masquerade and kerneld


「IP masqueradeとkerneldによるon-demand PPPで幸せな家庭内LANへのメモ」


Ver0.91 Copyright(C) 1996,1997 Hisaaki Shibata


柴田 尚明@福岡

shibata@opost1.netspace.or.jp


Linuxに特有のIP masqueradeとkerneldによるon-demand PPPが

ある程度動きましたので設定の際に行った項目をメモにまとめます。

我が家におけるIP masqueradeの最大のメリットは

「端末型ダイヤルアップの契約で、ネットワーク型ダイヤルアップとほぼ同等の使い勝手が楽しめる」

ことにあります。皆さんも楽しんでください(^o^)/



ご意見は、fj.os.linuxか
メールでお願いします。

メールの方が圧倒的にレスポンスがいいはずです(^^)


尚、本ドキュメントは全文丸ごとであればどこへでも転載可能/リンク可能です(^^)





目次



0 .来歴・トピックス

1 .経緯


2 .関連情報

3 .用意したhardware

4 .用意したsoftware

5 .動作確認をしたもの

6 .いくつかの問題点

7 .そのうちやること

8 .謝辞

9 .付録A(作成/修正ファイル一覧)

10.付録B(家庭内ハードウエア仕様一覧)






0.来歴・トピックス


[次へ][目次へ]


1997/5/1 Ver. 0.91


  • linux-2.0.30での機能を追加

1996/11/4 Ver. 0.9
1996/9/21 Ver. 0.8

  • 各Softwareのバージョンアップ対応
  • 2 .関連情報に荒木さんリンク追加
  • pppdのタイムアウト記述修正(^^;

1996/9/1 Ver. 0.7

  • 各Softwareのバージョンアップ対応
  • MN128ハングアップ対策(/etc/ppp/ip-down)記述追加
  • 作成/修正ファイル一覧追加

1996/8/26 Ver. 0.6


  • 各Softwareのバージョンアップ対応
  • 全項目見直し
  • 家庭のISDN化\(^o^)/
  • BIND、sambaも動いた。次はINNとDHCP(^^)

1996/6/17 Ver. 0.5

  • 目次追加
  • 関連URL追加(星野さん、梶原さん、JF)
  • 最新バージョンでの確認
  • ISDN化計画発動
  • その他、細部修正


1996/5/31 Ver. 0.4


  • HTML化
  • /etc/hostsエントリ追加による不必要なダイアルアップ解決追加


1996/5/29 Ver. 0.3


  • /etc/rc.d/rc.inet1でのdefaultroute設定について記述追加
  • /etc/hostsエントリ追加による不必要なダイアルアップ解決
  • ipfwadm-2.1.tar.gzでの確認済み


1996/5/18 Ver. 0.2


  • NNTP,pop 動作確認追加
  • ftp動作方法追加 #Thanks to すずき@JAIST様
  • 一部ソフトウエアのNew Versionでの確認
  • その他、絵の追加や細部の語句・記述変更


1996/5/15 Ver. 0.1 新規作成



1.経緯

[次へ][前へ][目次へ]



自作AT互換機の常で、自己増殖機能により我が家のPCが3台(FullTower, DeskTop, SubNote)になったことをきっかけに、家庭内LANを始めることにしました。


#Ver 0.6時点では新規導入したMiniTowerを子供用ゲーム機にして、お古となったDeskTopをLinux専用サーバとし、計4台に増殖しました(^^;

しかし、ISPのLAN型dial-upの契約料は高いし、routerを買うお金もない。
さらにはISDNでもない、の三重苦(^^;によりあきらめておりました。


#Ver 0.6時点で我が家もISDN+テレホーダイ化しました(^o^)。OCNまでの短い命かもしれませんが....


ちょうどその頃Linux-MLでIP masqueradeが話題になり、情報を集めてみると
「まさに求めていたもの」で、早速取り掛かることにしました。

#Linux-MLでは、その後も技術的な情報がやり取りされてます。



2.関連情報

[次へ][前へ][目次へ]



IP masqueradeについてはhttp://www.kt.rim.or.jp/~akira/にやまだあきらさんのわかりやすい解説が有ります(^^)


また、最近拡充されたものとしては、
梶原 健司さんのhttp://gandalf.doshisha.ac.jp/~kaji/ip_masq/とか、
星野 明さんのhttp://www.st.rim.or.jp/~akhoshi/ipmasq.html、そして荒木さんのhttp://www.mizuno.riec.tohoku.ac.jp/~yasu/linux/ipmasq/が有りますのでこちらもぜひご覧になってくださいm(_|_)m


その他にもNET-2/3-HOWTOに解説が有ります。こじまみつひろさんの和訳もGoodです。


on-demand dial-upに関しては、dialdを使う方法もあるとのことで、そのうち気が向いたら挑戦してみます。(かなり気は向いてるけど)



#と、言いながらkerneldに満足してしまい、dialdまでいたってませんm(_|_)m。

拡充計画は

BIND+samba(済)->INN->DHCP

へ移って行きました(^^;

さらに、pppd-2.3.xでは、それ自体でon-demand dialupの機能が追加になっているようです。これももう少しβ版が安定してきたら手を出すかもしれません。


linux-2.0.0にするときに気を付ける物としてはこじまみつひろさんが訳され、吉山さんがHTML化したものがhttp://jf.gee.kyoto-u.ac.jp/JF/v2.0/Changes-2.0.htmlに有りますのでじっくり読むのが良いと思います。



また、私が使い出したMN128に関するpppのchatスクリプトについてはhttp://www.st.rim.or.jp/~kanada/ISDN/connection-scripts.htmlに金田泰さんの実例がございます。




3.用意したhardware

[次へ][前へ][目次へ]



  • 複数台のPC+NIC
  • HUB
  • UTP Cable
  • modem(アナログ回線時)
  • TA(ISDN時)

  • remote電源制御装置


ISP-->Internet
|
.------------. .------------. NTT
|192.168.0.1 | |192.168.0.5 | |
| NIC+----------+ +-------+NIC 16550+-->TA-->DSU
| | | | | | (MN128)
|
Silk | | | | Silver |
`------------'FullTower | | `------------'DeskTop
(Win95/3.1/Linux) | | (Linux)
| |
.------------. .--+--+--. .------------.
|192.168.0.2 | | | |192.168.0.3 |
| NIC+-------+ +------+NIC |
| | | HUB | | |
| Silvia | `--------' | Echos |
`------------'MiniTower `------------'Note
(Win95) (Linux/Win95)



家庭内LANを使う場合、プライベートaddress空間を使うことがお勧めです。私は、192.168.0.0/24を使いました。


#さすがにclass C x 1で足りない家庭内LANはないかと(^^;


  • 外付けTA付DeskTop機(Silver)が192.168.0.5
  • カミサン用FullTower御仕事機(Silk)が192.168.0.1
  • 子供用MiniTowerゲーム機(Silvia)が192.168.0.2
  • OS-BSでLinuxとWin95をboot selectし、AL-mail+WinVNで読み書きしているSubNote機(Echos)が192.168.0.3


各マシンの概略仕様は上記のリンクをつついてください。

家庭内のLAN接続は取り回しが容易なUTP(10B-T)ケーブルにてHUBで接続しています。
#ちなみに、今日現在ではDHCPサーバが、Silver上で動き出しており、クライアントがLinuxの場合でもWin95の場合でも動的にIPアドレスを割り振ってくれるようになりましたので、上記のIPアドレスのまま動いているのはSilverだけとなりました(^^)。
この内容はそのうちアップデートしてこの文書にも反映させます。


今後は、このon-demand機能を利用して、真夜中のテレホーダイタイムにNetNewsを自動取り込みすることを考えていますが、まだINNの設定ができてません(^^;

いろいろと教えてもらっていることもありますので、がんばりたいと思っています。
しかし、別の事にも手を出しておりまして、shutdown時の電源OFFや、外部からのダイアルアップで、自動的にPC本体の電源をいれること事などをやっております。
これにつきましては、ある程度実用になりそうなので梨もーと電源制御のところをご覧ください。



4.用意したsoftware

[次へ][前へ][目次へ]


4.1 Slackware 3.2


network関連のpackage(N)は入れましょう。


#Slackaware 3.1に3.2を上書きinstall(って言うのかな?)を行った場合は、その後に不都合が生じる場合があります。
#具体的にはkernelの再構築が出来ないようです。
#そういう時は/usr/binの中を削除してから再installしましょう(^^;



4.2 linux-2.0.30.tar.gz




Linux-2.0.30からは、kernelのコンフィグレーションにもよりますが、今までIPmasqueradeされたネットワーク上から外部のネットワークに対して不可能であったpingなどのICMPを使ったやり取りなども実行可能になっているようです。
しかも、各種パッチが統合されており、kernelの再構築とipfwadmの設定だけでIPmasqueradeが利用できるようになっています。ぜひ試してみてください。

その他、2.0.xに向けて必要なものも集めました。


IP masqueradeを使えるようにする'make config'内容はやまださんのページや、NET-2/3-HOWTO、ipfwadmのarchive内のdocumentに書かれてます。


#このメモをupdateしたときにも簡単に触れるつもりでしたが、
#和訳されたChangesができたのでそちらをご覧ください。

��ところで、2.0.0リリースおめでとう!
#でもAIC-7850では新しいaic7xxxドライバは不安定(-_-)。
PIONEERのCD-ROMがboot時にエラーをだしまくるのでサブマシンのCD-ROMドライブ(PLEXTER)と入れ替えて対策しました(^^;



私の標準手順は以下です。('# 'はpromptのつもりです。)



# cd /usr/src/linux
# make mrproper
# make menuconfig
#ここでIP masqueradeが使えるようにする。どの項目をYにするかは2 .関連情報をご覧ください。

# make dep && make clean && make zImage && make modules && make modules_install
# cd /usr/src/linux/arch/i386/boot
# /sbin/rdev -R zImage 1
# cp zImage /zImage.x.yy.z


このあと、/etc/lilo.confを修正して、boot時に今まで動いていたkernelと新しいkernelを選択できるようにします。

例えば私の場合は、


# cat /etc/lilo.conf

#fileの中身やコマンドの出力を示す場合は、以下で示します


# LILO configuration file
# generated by 'liloconfig'
#
# Start LILO global section
boot = /dev/sdb1

#rootパーティションにinstallしてます。
#boot selecterはOS-BSがお気に入りです。



#compact # faster, but won't work on all systems.
delay = 50
vga = normal # force sane state
ramdisk = 0 # paranoia setting
# End LILO global section
# Linux bootable partition config begins
image = /zImage.x.yy.z
root = /dev/sdb1
label = linux
read-only # Non-UMSDOS filesystems should be mounted read-only for checking
# Linux bootable partition config ends
# Linux bootable partition config begins
image = /zImage.2.0.29
root = /dev/sdb1
label = linux.old>
read-only # Non-UMSDOS filesystems should be mounted read-only for checking
# Linux bootable partition config ends

そして、


# /sbin/lilo


でliloを入れて、kernelの再構築はおわりです。


尚、家庭内LANで使うときには/etc/rc.d/rc.inet1でdefaultroute(gateway host)でNIC側を選択している場合は、設定行をコメントアウトしておきましょう。

そうしないと、せっかくpppでのlinkが確立しても外に出て行けなくなってしまいます。

#複数のセグメントを持つ大規模家庭内LANユーザの方(^^;は
#話が変わってきますが。




4.3 modules-2.0.0.tar.gz


kerneldを動かすためのもので、中のDocumentが役に立ちます。

本家はhttp://www.pi.se/blox/modules/index.htmlです。

構築は
# make all && make install

でおしまいでした。

#どうも、モジュールを新しくしたタイミングだと思うのですが
#sendmail-8.7.5が/etc/rc.d/rc.Mのなかでハングするように
#なりました(T_T)ので元に戻しました。



上記が終わったらarchive内のrc.hintsを元に/etc/rc.d/rc.Mにkerneldとdepmod、modprobeの起動scriptを追加します。

#簡単なので省略m(_|_)m


次に以下のppp設定fileを作ります。


# cat /etc/ppp/ip-up

#!/bin/sh
#ファイルの先頭行にこれを書いて、なおかつ実行可能フラグを立てないと
��うまく行きません。これのせいでずっとハマッてました(^^;

echo UP `date` >> /tmp/PPP-LOG
#ダイヤルアップ開始時間を記録します

sendmail -q
#送信用のqueueに溜まっているmailをflushするため


kill `cat /tmp/request-route`
#kerneldのrouting programのprocessを削除する

#/sbin/insmod ip_masq_ftp
後述するIPmasquerade下でftpを行うためのおまじないでしたが、以下の4行に置き換えてます。だから今はコメントあうとしてます。

/sbin/depmod -a
/sbin/modprobe ip_masq_ftp.o
/sbin/modprobe ip_masq_raudio.o
/sbin/modprobe ip_masq_irc.o


次にarchive内のrequest-route.shを元に以下のfileを作ります。

#どうせDNSを引きに行くのでちょっと内容をサボってます


# cat /sbin/request-route

#! /bin/sh
LOCK=/tmp/request-route
UP=/tmp/request-up
PATH=/usr/sbin:$PATH #for ppp-2.2*
export PATH
pppd
echo `date` > $UP
#家庭内LANからのon-demandダイヤルアップであることの足跡を残してます。外部からのダイヤルインではこのファイルができないはずで、それによって制御を変えるようにしてます


sleep 60 &
#この値はいろいろとチューニングの余地があるようです

sleepid=$!
echo $sleepid > $LOCK
wait $sleepid
rm -f $LOCK



4.4 ppp-2.2.0f.tar.gz


iij-pppでもよかったのですが、慣れの関係でこちらにしました(^^;


#上記にも示しましたが、ppp-2.3.xのβテストが始まってます。
#pppd単体でon-demand dialupが出来るようになっているらしいです(^^)

私の標準手順は

# cd /usr/local/src/ppp-2.2.0f
# ./configure
# make kernel
# make


#make前にppp用のlock fileのPATHを修正してました

��mgettyを使う場合です。今はmgettyの方を修正しています

��mgettyを使うのは外から自宅にdial-upするからです(^^)

# make install


このあと、以下の設定fileを作ります。

#どうせ一つのISPにしかアクセスしないでしょうから

��/etc/ppp/optionsで設定値を書いちゃいます。


# cat /etc/ppp/options


debug
lock
modem crtscts /dev/ttyS3 38400

#私のモデムはSilkのCOM4です
��最近買ったTA(MN128)はSilverのCOM1につながってます
��COM1の時は/dev/ttyS0ですね(^^)
��さらに現時点では、remote電源制御の絡みがあり、TAはCOM2(/dev/ttyS1)につながっています。COM1は電源OFF制御装置(^^;がつながりました。

��また/etc/rc.d/rc.serialでspd_vhi設定をして、DTE速度を115200bpsにしてます。
#setserialの最新バージョンは1.12のようです。
#また、SMC系のマルチI/O制御chipはDTE速度を115.2k以上に設定できるらしく、
#Win95のドライバはfjにポストされてました。

��ドライバが置いてあるftpサイトはhttp://www.yk.rim.or.jp/~gigo/over115K/です。
大きな期待がかかるのがこのドライバの作者の友人がsetserialに
#このコードを統合するつもりだとの事です(^^)。

noipdefault
netmask 255.255.255.0
defaultroute
idle-disconnect 140
#pppのトラフィックが140秒間ないとpppdが落ちる設定です。
#このドキュメントのVer0.7まで間違った記述をしており、
#参照された方にはご迷惑をおかけいたしましたm(_|_)m


domain joy.netspace.or.jp
#上の行は、不要かもしれません

name silk
#上の行は、不要かもしれません。

connnect /etc/ppp/ppp-on-script





実際に電話をかけるのは以下の部分の設定です。


(1)Rockwell系のv.34 modemの場合

# cat /etc/ppp/ppp-on-script


#!/bin/sh

# 各行末のバックスラッシュ(\)に気を付けてね
# 最終行だけバックスラッシュによる改行のエスケープ不要

exec /usr/sbin/chat -v TIMEOUT 2 ABORT '\nBUSY\r' \
ABORT '\nNO ANSWER\r' ABORT '\nRINGING\r\n\r\nRINGING\r' \
'' AT \
'OK-+++\c-OK' ATH0 \
TIMEOUT 30 \
OK ATDT電話番号 \
CONNECT '' \
ogin:--ogin: \\dユーザID \
assword: パスワード


PAPやCHAPのISPへは/etc/ppp/pap-secretsや/etc/ppp/chap-secretsを記述すれば、上記のCONNECTの行まででOKのばずです。


��その時は、最後の行末の\をはずしてね

��また、PAPの時は/etc/ppp/optionsに+uaなどの記述が必要です。


��尚、+uaの記述は推奨されているものではなくpppd-2.3.x以降では

��サポートされない事が有りそうなので、/etc/ppp/*-secretsを使用した方が

��よさそうです。



(21)MN128(非同期38.4k)の場合

http://www.st.rim.or.jp/~kanada/ISDN/connection-scripts.htmlの金田泰さんの実例をみてね。


尚、金田さんが書いているMN128のppp終了後のハングアップに関しては/etc/ppp/ip-downの後半のchatを起動する部分を下記のようにする事で、回避できています。

また、電源制御関連や、ダイヤルアップしていないときには不要なmoduleを削除する事も追加しました。


# cat /etc/ppp/ip-down


#!/bin/sh
#
# This is part 2 of the ppp-on script. It will perform the connection
# protocol for the desired connection.
#
if [ -f /tmp/request-up ]; then #家庭内LANからのダイアルアップならば
/bin/rm -f /tmp/request-up
echo DOWN `date` >> /tmp/PPP-LOG #コネクションを切った時間をlogに取る。
else #外部からのダイヤルインによるpppの起動のときは。
sync
sync
sync #転ばぬ先のsync三回(^^;
/sbin/shutdown -r now #おもむろにshutdownを動かす。
sleep 60
exit 1 #正常にshutdownが動いていれば、ここには来ないはず。
fi
#if [ `w|wc -l` -lt 3 ]; then #外部からのダイヤルイン判定の残骸
# sync
# sync
# sync
# /sbin/shutdown -r now
#fi
/sbin/rmmod ip_masq_ftp.o #不要なモジュールの取り外し
/sbin/rmmod ip_masq_raudio.o
/sbin/rmmod ip_masq_irc.o
# #MN128ハングアップ対策
exec /usr/sbin/chat -v \
TIMEOUT 3 \
ABORT '\nLINE OFF\r' \
ABORT '\nBUSY\r' \
ABORT '\nNO ANSWER\r' \
ABORT '\nRINGING\r\n\r\nRINGING\r' \
'' ATZ




また、DNS関連の記述は以下のようにしています。


# cat /etc/resolv.conf
domain joy.netspace.or.jp
nameserver 192.168.0.5
#そうです。我が家の中にもDNSサーバが立ちあがったんです(^^;
��これについては婆印度と産婆(^^;を見てください


nameserver aaa.bbb.ccc.ddd

#ISPが推奨しているDNS serverのIP addressですね


ここまでで、rebootすれば「そのLinux機上で」

$ telnet sotono.host.or.jp


とか

$ mnews -Dsotono.NNTP.server.or.jp

とかで勝手にダイヤルアップを始めるはずです(^^)

V#ISDN+テレホーダイとかだと快適ですねぇ。
#テレホーダイなら繋ぎっぱなしにする?(^^;
#他の人にも回線あげなきゃ(^^)


ダイヤルを始めているときのプロセスの状況は以下のようです。


# ps -x
PID TTY STAT TIME COMMAND
1 ? S 0:16 init[5]
[中略]
111 ? S 0:00 sh /sbin/request-route aaa.bbb.ccc.ddd
114 S3 S 0:00 pppd
115 ? S 0:00 sleep 40
116 S3 S 0:00 /usr/sbin/chat -v TIMEOUT 3 ABORT \nNO AN...
[以下省略]



上記のaaa.bbb.ccc.dddはDNS ServerのIP addressになることが多いでしょう。



4.5 ipfwadm-2.3.tar.gz


4.5.1 基本的な設定


LInux-1.3.xのあるバージョン以降からipfwではなく、これ(ipfwadm)を使うようです。

本家本元はhttp://www.indyramp.com/masq/です。

ipfwadmは

# make install


で出来ます。


私が探した限りではipfwadmの設定に関する記述はアーカイブ内のmanファイルにしかありませんでした。

#NET-2/3-HOWTOにあるように、ipfwとは記法が異なります。

私の設定は、以下です。

# tail -5 /etc/rc.d/rc.inet1

/sbin/ipfwadm -F -b -o -a masquerade -P all -S 192.168.0.0/24 -D 0.0.0.0/0

# End of rc.inet1


ここまでで、Dial-up routerと化したLinux機が出来上がりです(^^)


��RT100iはNATとやらに対応しているようですが
#複数のプライベートIP addressを一つのグローバルIP adressに
#変換する事はできないようですから、こいつはGoodです。
#しかしYAMAHAもRT100iのNATをエンハンスさせてIPmasqueradeのような機能を
#考えているようです(^^)


家庭内LAN上の全PCはdefaultrouteを192.168.0.5に向けます。

また、家庭内LAN上の全PCの/etc/hostsファイル上には全LAN内hostのエントリを追加しましょう。(DNSがあがっている現在は不要である事を確認していますが)

#さもなくば、LAN内でのtelnet/ftpなどでダイヤルアップを始めてしまいます(^^;
また、Win95の場合はNetBEUIをunloadしておかないとWin95起動時にパケットをはいてダイヤルアップを始める事があるようです

そのLAN上のhostでWinVNなどを動かすと、dial-up routerであるsilverがダイヤルを始めるはずです(^^)


4.5.2 ftpのための設定


すでに示していますが、ftpを行う場合は以下の設定の追加が必要でした。


/etc/ppp/ip-upの中に

/sbin/insmod ip_masq_ftp


を追加しました。

#これって、本来のkerneldの使い方じゃないような気がします。

��on-demandでloadできる正しい使い方をご指導ください。

この設定で、悩んでいたftpがちゃんと動作するようになりました(^^)Ver0.6

さらにip-upをdepmodを使うやり方に変更しました(^^)Ver0.9


もう一つftpをきちんと動かすためにはパッチがいる事が判明いたしました(^^;。


小さなftpやhttpだと問題にならないのですが、大きなファイルをanonymous FTPサイトから持ってきていると、きちんと終了しない事があります。この場合は
http://www.hwy401.com/achau/ipmasq/ip_masq_ftpalive.patch.gzやftp.linux.or.jpなどからip_masq_ftpalive.patch.gzを持ってきてカーネルソースにパッチを当ててください。

パッチの当てかたは普通のカーネルパッチと同じだとおもいます。


Linux-2.0.30では、不要です。




5.動作確認をしたもの

[次へ][前へ][目次へ]


家庭内LAN上のhostからIP masqueradeを利用して動作したものを示します


  • AL-mailによるWin95からのメールの送受信(SMTP,POP3)
  • WinVNによるWin95からのNewsの購読、投稿(NNTP)
  • telnet
  • WWW(HTTP)
  • netscapeなどのbrowserからの(httpでくるんだ)匿名ftp
  • ncftpを使った匿名ftp(^0^)

  • 駄目かと思ったけどすんなり動いたWin95上でのMS-NetMeeting(ユーザロケーションサービスはだめみたい(--;)
  • linux-2.0.30環境でWin95からIPmasquerade外部へのping



6.いくつかの問題点

[次へ][前へ][目次へ]


6.1 ftpできない(最終的に解決)



-> ip_masq_ftpのmoduleをinsmodでロードすることで解決(^^)@Ver0.2

-> と、思ったら、又できなくなってしまった(T_T)@Ver0.4


なぜだろう???

0.6

-> /etc/ppp/ip-upをきちんと作り直す(chmod u+xと#!/bin/shをいれる)事で解決(^^;


6.2 不要なdial-upが始まる事がある(解決->復活?)



Note上のmailer(AL-Mail)を動かしてLAN上の192.168.0.1に対して接続しようとすると、なぜかDNSを引き(?)行っているようでdial-upを始めてしまう。
#IP addressでSMTP server/POP3 serverとしてsilverを指定しても

その後の調査で、mailerやpopperには関係なくDNSを引きに行っているような状態が出ています(T_T)
#どうもWin95が何らかのタイミングでDNSを引くようです(^^;

->IP masqueradeを起動しているマシン(silk)の/etc/hostsにNote PCの


FQDNもどきのエントリを追加して何者からのアクセスかをsilkに

教えてやることで、DNSを引きにいかなくなった(^^)

0.5

->LAN内でのtelnet/ftpでもダイヤルアップを行うことが発覚し、

LAN内のすべてのhostを/etc/hostsのエントリに追加することで対策した。


0.6

->BINDを家庭内LANで運用を始めたところ、silver起動時の1回のみダイヤルアップが発生している。引き続き調査中。



6.3 回線が切れないISPがある(解決)

せっかくpppがidle時はコネクションを切るように設定しているのに、あるISPは、約30秒毎に謎のパケット(--;を送ってくるので切れてくれない。>

#port53でした。問い合わせたらRIPでした。(--;

idle-timeoutを5秒ぐらいにすると切れてくれるけど、これでは使い物にならない(T_T)

別のISPではそのようなことがなく、時間通りに切れてくれる。

受けるパケットは無視するようにできないかなぁ。

->dialdではできるそうです。

ISPにRIPにしないように改善をお願いしているところです。

->対策終了し、無事切れるようになりました(^o^)


7. そのうちやること

[次へ][前へ][目次へ]



7.1 必ずやる


(1)要所にリンクを貼り付けて、必要なもの(ファイルや文書)を取れるようにする。

->これをもって、一応m(_|_)mやった。


(2)問題点をFIXして、どこかのサイトにこの文書を置く。

->期間限定ですが、置きました。


#引き続き、引き取っていただけるところをお待ちしております。

��ご意見や情報を頂きたいのですが、よろしくお願いいたします。


7.2 気が向いたらやる



(1)絵やなんかを入れてわかりやすくする。->簡単なのを入れた(^^;


(2)dialdを使った方法を追加する。 -> ftpが解決してから->pppd-2.3.xに移行するためなしm(_|_)m


(3)Linux-MLでの技術的な裏付け情報を付録で追加

-> 私が理解してから(^^; ->いまだに把握できていない(^^;


7.3 お金があったらやる


(2)古いNote PCを入手し、PCMCIAのISDN cardとEther cardを


入れて、UPS付き(電池)低消費電力のdial-up routerを作っちゃう。


��私が持っておりますYAMAHAのPCMCIA ISDN cardのドライバ情報を


��お待ちしていますm(_|_)m

デバイスドライバを開発するための情報はここに有ります。
とりあえず入手して読みはじめたのですが素人に手が出るかどうか分かりません。どなたか共同してやりませんか?

御興味のある方はメールでお願いします。m(_|_)m

このドライバ開発に関しては、小さなMLが立ち上がり、細々ながらドライバ開発が始まっております。引き続きメンバーを求めておりますので、このアドレスまで参加希望者はメールをください。
ドライバがかけなくてもPC30iを持っていればβテストやドキュメント整備が出来るなどの特典;-)があります。





8.謝辞

[次へ][前へ][目次へ]


私がLinuxを使えるようにしてくださったすべての方に感謝いたします。


特に、この文書作成にあたっては、Linux-MLの方々と、JFによるドキュメント、および関連のドキュメントがなければできないものでした。ありがとうございます。m(_|_)m


以上


[入り口へ]
[Akkoame Home Page]




9.付録A(作成/修正ファイル一覧)

[次へ][前へ][目次へ]


この所、ディスク障害だとか、人為的チョンボとかで再installをする機会が多くて(^^;、
どのファイルをバックアップ取っとけば良いかわからなくなるんで、この際(自分のために)まとめとくものです。



(1)install時

(2)ppp+kerneld+IP_masquerade設定時

(3)BIND設定時


(4)Apatch設定時

(5)INN設定時

(6)samba設定時


[入り口へ]
[Akkoame Home Page]



10.付録B(家庭内ハードウエア仕様一覧)

[前へ][目次へ]






[玄関へ]
[総本店へ]

1997年2月23日日曜日

Remote Power control with Linux


「電話で電源いれましょ。shutdownで電源おとしましょ。」


Ver0.2 Copyright(C) 1996, Hisaaki Shibata


柴田 尚明@福岡

shibata@opost1.netspace.or.jp


Linuxでのshutdown時に自動でPCの電源を落とし、また、外部からの電話着信で自動的にPCの電源が入るものを作りはじめました。

ある程度動いてますので、公開してご意見を伺い、もうちょっと改良したいと思っておりますm(_|_)m。

ご意見は、fj.os.linuxなどの関連NewsGroupか
メールでお願いします。

メールの方が圧倒的にレスポンスがいいはずです(^^)


尚、本ドキュメントは全文丸ごとであればどこへでも転載可能/リンク可能です(^^)





目次



0 .来歴・トピックス

1 .経緯

2 .関連情報


3 .用意したhardware

4 .用意したsoftware

5 .動作確認をしたもの

6 .いくつかの問題点

7 .そのうちやること

8 .謝辞





0.来歴・トピックス



[次へ][目次へ]


1996/11/6 Ver. 0.2


  • パーツリスト追加
  • メインボードのキット情報追加
  • INSの実験結果追加(T_T)

1996/11/4 Ver. 0.1

  • 新規作成
  • アナログ回線での着信時電源ONおよび、空きCOMポートを利用したshutdown時の電源OFF確認


1.経緯

[次へ][前へ][目次へ]



ATX機が自動で電源を落とせる話を聞いたり、某社のPCではモデムに着信があると電源を入れることができるという話を聞くたびに、良いなぁ~と思っておりました。


また、会社から家に仕事のファイルを持ち帰って作業をして(^^;、そのまま忘れて会社に来たりしたことがあり、カミサンにPCの電源を入れてもらってダイヤルインしたりすることもありました(^^;;;;;;が、そうそう毎度は頼めません(^^;。

うちのサーバ機はCRTがついていないので、カミサンにはshutdown時の電源OFFのタイミングがわかりにくいという話もあります。

そういう時は普通ATX機を買うのかもしれませんが、そんなお金はないです(T_T)し、ATXのマザーと電源の相性問題(?)もまだまだあると聞いてますので、買うにしてもしばらく待ちたいところです。

で、現在使っているAT機で電源の制御をソフトウエアから行えるように無い知恵を絞ってみました。
予算は5千円以内で済ますことを目標にしました。

#ま、目標は、あくまで目標(^^;



2.関連情報

[次へ][前へ][目次へ]


ATXの電源制御仕様ってどこかに落ちてないでしょうか?

www.teleport.com/~atx/からたどっても、ろくなものは見つけられませんでした(T_T)



3.用意したhardware

[次へ][前へ][目次へ]




  • LinuxがinstallされたPC/AT互換機(シリアルポートが二つ必要)
  • modem(アナログ回線時)
  • TA(ISDN時)
  • 今回自作のリモート電源制御装置(^o^)


リモート電源制御の回路図に関しては下記をご覧ください。




    回路図と解説


  • メインボードとパワー(電源)ボードです。

  • 基本的には単純なセットリセットのフリップフロップがあるだけで、そのフリップフロップの状態でリレーを動かすシンプルなものです。

    パワーボード上のマニュアルスイッチはON(上)-OFF(中立)-ON(下)の3個所で止まるタイプのレバースイッチで、ON(上)で強制セットとなり、電源ONとなります。


    逆にON(下)では強制リセットとなり、電源OFFです。

    OFF(中立)の位置では、外部からの情報でON/OFFするautoモードです。

    #なお、このメインボードの回路が二つ分入ったものが4cm x 5cm程度のコンパクトな基板となり市販のキットとして1800円で販売されてます。
    大阪日本橋の「ワンダーキット」と言う会社のものです。
    問い合わせ先は〒556大阪市浪速区日本橋4-4-1
    TEL(06)644-4447 FAX(06)644-4448です。
    私は福岡の「カホパーツセンター」で購入しました。注意する点として、このキットにはVcc(電源電圧)が5Vのものと12Vのものがあることです。私は回路図でお分かりのように5V版を使用しました。

    私は、上記のメインボードと、パワーボード(3端子レギュレータとパイロットLED付き)とACアダプタを分解して(^^;取り出したトランス込みで、3.5"FDが10枚入るアクリルケースに詰め込んでます。そのうち写真もお見せしますね(^^;


  • セット(電源ON)ボードです。

  • モデムとPCのCOMポート(私の場合はCOM2)の間に挟まる形のものです。
    したがって図上の右側のコネクタと左側のコネクタはオス/メスになっています。
    また、すべての信号線はそのままストレートで接続しています。


    電源ONはモデムへの着信時にモデム側から出力されるCI信号のレベルの変化を見ることに因っています。外部への影響を最小限にすることと、レベルコンバータの役目をかねて、フォトカプラを使っています。
    フォトカプラに直列につないでいる抵抗値は適当です(^^;が、一応電圧レベルは規格内に入っています。

    この基板の大きさは4cm x 3cm程度です。



  • リセット(電源OFF)ボードです。

  • PCの使用していないCOMポート(私の場合はCOM1)につなげます。

    電源OFFはCOMポートからデータを出力する際に変化するDTR信号のレベルの変化を見ることに因っています。フォトカプラ周りの回路はセットボードと同じです
    この基板の大きさも4cm x 3cm程度です。

  • 各ボードの結線

  • 適当に、そこらに転がっていた撚り対線を使っています(^^;




で、パーツリストをまとめると。以下のようになります。
#線材とかパイロットLED+LED用抵抗などは省略してますm(_|_)m





































MainNameCountsMemo
1HD4140131CMOS-SSI
22SC9451Tr
31S15883Diode
41μF1Condenser
510μF1Condenser
64.7kΩ4Resister
747kΩ3Resister
8100kΩ1Resister
9G6C-11171Relay
10Universal board15cm x 4cm
PowerNameCountsMemo
1AC/DC Conv.1DC5V output
2Switch1on-off-on toggle
3Universal board13cm x 2cm
SetNameCountsMemo
19pin RS-232-C Conn. female1board mount type
29pin RS-232-C Conn. male1board mount type
3TLP521-11Photo-coupler
4470Ω1Resister
5Universal board14cm x 3cm
ResetNameCountsMemo
19pin RS-232-C Conn. female1board mount type
2TLP521-11Photo-coupler
3470Ω1Resister
4Universal board14cm x 3cm




4.用意したsoftware

[次へ][前へ][目次へ]


以下のppp設定fileを作ります。(on-demand pppの設定で既に書いてますので、関連する記述のみ示します。)


4.1 /etc/ppp/ip-up



# cat /etc/ppp/ip-up

#!/bin/sh
#ファイルの先頭行にこれを書いて、なおかつ実行可能フラグを立てないと
��うまく行きません。これのせいでずっとハマッてました(^^;

echo UP `date` >> /tmp/PPP-LOG
#ダイヤルアップ開始時間を記録します





4.2 /etc/ppp/ip-down


ip-downはshutdown時には動かないのですね。PPP-LOGを見て判明しました。
shutdown時にpppdが動いている場合は、LOGファイルに落ちた時間をかき出すようにした方が、より正確になりますね。
# cat /etc/ppp/ip-down

#!/bin/sh
#
# This is part 2 of the ppp-on script. It will perform the connection
# protocol for the desired connection.
#
if [ -f /tmp/request-up ]; then #家庭内LANからのダイアルアップならば
/bin/rm -f /tmp/request-up
echo DOWN `date` >> /tmp/PPP-LOG #コネクションを切った時間をlogに取る。
else #外部からのダイヤルインによるpppの起動のときは。
sync
sync
sync #転ばぬ先のsync三回(^^;
/sbin/shutdown -r now #おもむろにshutdownを動かす。
sleep 60
exit 1 #正常にshutdownが動いていれば、ここには来ないはず。
fi
#if [ `w|wc -l` -lt 3 ]; then #外部からのダイヤルイン判定の残骸
# sync
# sync
# sync
# /sbin/shutdown -r now
#fi



4.3 /sbin/request-route



# cat /sbin/request-route

#! /bin/sh
LOCK=/tmp/request-route
UP=/tmp/request-up
PATH=/usr/sbin:$PATH #for ppp-2.2*
export PATH
pppd
echo `date` > $UP
#家庭内LANからのon-demandダイヤルアップであることの足跡を残してます。外部からのダイヤルインではこのファイルができないはずで、それによって制御を変えるようにしてます


sleep 60 &
#この値はいろいろとチューニングの余地があるようです

sleepid=$!
echo $sleepid > $LOCK
wait $sleepid
rm -f $LOCK



4.4 /etc/rc.d/rc.6


slackware3.1でshutdown時に動くrc.6の終わりの方に/dev/cua0(COM1)へのデータ出力をechoにて行います。

# tail -15 /etc/rc.d/rc.6

# See if this is a powerfail situation.
if [ -f /etc/power_is_failing ]; then
echo "Turning off UPS, bye."
/sbin/powerd -q
exit 1
fi

sleep 15 ;echo off >/dev/cua0

echo "$message"
[ ! -f /etc/fastboot ] && echo "On the next boot fsck will be FORCED."
$command -f




5.動作確認をしたもの

[次へ][前へ][目次へ]


動作したものを示します


  • shutdownによる電源OFF
  • 外部からのmodem着信による電源ON



6.いくつかの問題点

[次へ][前へ][目次へ]



何と言ってもISDNでの自宅へのダイヤルアップIP接続です。
TAがオフフックしていないようなのでいかんともし難いです。情報をお待ちしています。



7. そのうちやること

[次へ][前へ][目次へ]


7.1 必ずやる


(1)ISDNでの着信電源ON確認

これ、やってみたんですが、うまく行ってません。YAMAHAのPC30iをグレ電につないで自宅のMN128にダイヤルしたのですが、まず、電話(といっていいのかな?)をとってくれません(?_?)。MN128の設定が悪いのだとは思いますが、なんだか引越しのどさくさでMN128のマニュアルが見つからなくて(^^;困っております。MN128で64k同期の着信できている方は、ATコマンドでの初期設定を教えてくださいm(_|_)m


7.2 気が向いたらやる


(1)ATXの電源OFF制御仕様が判れば、ボードを作ってみたい。



7.3 お金があったらやる


(1)ボードのマスクを起こしちゃう...キットがあるから無駄だな(^^;


8.謝辞

[次へ][前へ][目次へ]


まお、今回の電源制御は基本的にすべてRS-232-Cで行ってます。このあたりの情報はFA-NET-MLの皆さんと、alm-hokkai藪中さんから頂いております。


ありがとうございます。m(_|_)m


以上



[玄関へ]
[総本店へ]