Plan9 のネットワークの設定がイマイチわからないので,ネットにつながっている Debian/GNU Linux で DHCP サーバを立てて,そこからパケットフォワーディングしてインターネットに繋いでみるという作戦を取ることにした.
いや,こう書くと,明らかにオーバーキルなんですが,DHCP サーバを立てて家庭内 LAN を立ててしまえば,他にもいろいろ便利かなと.うちには光モデムがいっことデスクトップマシンとノート PC しかないので,LAN の構成はこんな感じにする予定.
the internet
|
B フレッツ VDSL modem(DHCP)
|
| eth1:global IP
Debian/GNU Linux Desktop PC (DHCP)
| eth0:private IP (192.168.0.1)
|
Plan9 ThinkPad A21e (private IP: 192.168.0.10-20)
とりあえず,この間インストール CD が欲しくて買ったのはいいけど,微妙に古くてけっこうアレだったなぁ… と後悔していた
Debian GNU/Linuxでつくる骨太システム―安全・強靱なサーバの構築と管理 sarge対応版 を引っ張りだしてみたら,Debian はデフォルトで iptables に対応しているらしく,どうやら kernel をリビルドしなくてもパケットフォワードできるっぽい.あと,iptables の設定とかも少し載っていた.思わぬところで役にたって良かった.
ほんなら,とりあえず,dhcpd さえインストールしてしまえば良いんだな.まず,eth0 (うちの設定では,こっちに ThinkPad をつなぐことになる) に,固定ローカル IP を振っておこう.
# su -
# vim /etc/network/interfaces
んで,こんなのを書いておく.
auto eth1
iface eth1 inet static
address 192.168.0.1
netmask 255.255.255.0
(参考サイト :
Debian Woody インストールメモ (be6))
んで,一回ネットワークを再起動して,ちゃんと eth0 が表示されるか確かめる.
# /etc/init.d/networking restart
# ifconfig
eth0 リンク方法:イーサーネット ハードウェアアドレス (一応 mac address は秘密のアッコちゃん)
inetアドレス:192.168.0.1 ブロードキャスト:192.168.0.255 マスク:255.255.255.0
...
ちゃんと表示されてるっぽいので,次に /etc/network/options を書き換える.
ip_forward=yes # noからyesに
dhcpd をインストールする.いろいろ注意されたので,言われた通りにする.
# apt-get install dhcpd
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
注意、dhcpd の代わりに dhcp を選択します
以下のパッケージが新たにインストールされます:
dhcp
アップグレード: 0 個、新規インストール: 1 個、削除: 0 個、保留: 0 個。
110kB のアーカイブを取得する必要があります。
展開後に追加で 233kB のディスク容量が消費されます。
取得:1 http://ftp.jp.debian.org testing/main dhcp 2.0pl5-19.4 [110kB]
110kB を 0s で取得しました (122kB/s)
未選択パッケージ dhcp を選択しています。
(データベースを読み込んでいます ... 現在 54896 個のファイルとディレクトリがイン ストールされています。)
(.../dhcp_2.0pl5-19.4_i386.deb から) dhcp を展開しています...
dhcp (2.0pl5-19.4) を設定しています ...
Generating /etc/default/dhcp...
Please note that if you are installing the DHCP server for the first time you need to configure it first. Please stop (/etc/init.d/dhcp stop) the DHCP server daemon, edit /etc/dhcpd.conf to suit your needs
and particular configuration, and restart the DHCP server daemon (/etc/init.d/dhcp start).
You also need to edit /etc/default/dhcp to specify the interfaces dhcpd should listen to. By default it listens to eth0.
NOTE: dhcpd's messages are being sent to syslog. Look there for diagnostics messages.
Starting DHCP server: dhcpd failed to start - check syslog for diagnostics.
# /etc/init.d/dhcp stop
Stopping DHCP server: dhcp.
# /etc/dhcpd.conf
しかし,ここで dhcp.conf の設定でしばらく悩む… うちが契約している OCN では,固定 DNS がプライマリ 202.234.232.6,セカンダリ 221.113.139.250 で提供されているのだけど… これを dhcp.conf に書いても良いモノなのか ?
というのも (管理人はネットワークについてはド素人以下なのだが),これはモバイルやダイアルアップ接続用のやつなので,B フレッツなどでは,たぶん動的に DNS を取得するのが正しいはず.
… しかしまぁ,私はよくわかってないので,pppoeconf の時とかに固定 DNS を直に指定しているから,どのみちその二つしか使われてないようだ.
ふーむ,やっぱり.
DNSサーバのリレーしかし,他の dhcp.conf の設定例とか見ていると,みんな DNS 直打ちのような ?
う〜ん,他の,OCN で dhcpd 使って家庭内 LAN 組んでいる人達は,いったいどうしているのだろう… ? みんながみんな,OCN みたいな巨大 AS 内で,みんながみんな高々二つの DNS を固定で指定したら,パンクしそうな気もするけど… ? 大丈夫なのかなぁ… まぁ,そもそも LINUX とか使っている人は極小数なので,全然問題無いのかもしれない.
# もし,ものすごく駄目なことをしていたらどうしよう… 教えて ! > 識者
というわけで,設定ファイル /etc/dhcpd.conf はこんな感じにしてみた.
option routers 192.168.0.1;
option domain-name "myhomelan";
option domain-name-servers 202.234.232.6, 221.113.139.250;
option subnet-mask 255.255.255.0;
default-lease-time 600;
max-lease-time 7200;
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.10 192.168.0.20;
}
# 余談 : 最初,セミコロンを忘れていて,dhcp が起動しなかった… 怒られたとおり /var/log/syslog とかを tail して見てデバッグした.
んで,適当に参考リンク先の sh スクリプトを書き換えて (eth0 を eth1 にしただけ)
#!/bin/sh
# -- start
IPTABLES=/sbin/iptables
# -- flush
$IPTABLES -F INPUT
$IPTABLES -F FORWARD
$IPTABLES -F OUTPUT
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT
# -- masquerade
$IPTABLES -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth1 -j MASQUERADE
# -- log
$IPTABLES -A INPUT -i eth1 -m state --state INVALID,NEW -j LOG
$IPTABLES -A FORWARD -i eth1 -m state --state INVALID,NEW -j LOG
# -- drop
$IPTABLES -A INPUT -i eth1 -m state --state INVALID,NEW -j DROP
$IPTABLES -A FORWARD -i eth1 -m state --state INVALID,NEW -j DROP
/etc/init.d/iptables save active
# -- end
実行して,それを保存.
# chmod +x iptables.sh
# ./iptables.sh
iptables: No chain/target/match by that name
./iptables.sh: line 27: /etc/init.d/iptables: そのようなファイルやディレクトリはありません
ありゃ… 怒られた.というわけで,/etc/init.d/iptables を,骨太 Debian を参考にしつつ作ろう…
と思ったら,/usr/share/doc/iptables/ 以下に,examples/oldinitdscript.gz なんて存在しないぞ… orz
おまけに,なんかこの本怪しい.makedir って何だよ.mkdir だろ.
あと,iptables: No chain/target/match by that name とか…
[fol] iptablesの設定についてstate モジュールを使いたかったら,kernel の再構築がやっぱり必要らしい.う〜ん.
と思ったら…
# ls /lib/modules/2.4.27-2-386/kernel/net/ipv4/netfilter/
arp_tables.o ipt_DSCP.o ipt_length.o
arpt_mangle.o ipt_ECN.o ipt_limit.o
arptable_filter.o ipt_LOG.o ipt_mac.o
ip_conntrack.o ipt_MARK.o ipt_mark.o
ip_conntrack_amanda.o ipt_MASQUERADE.o ipt_multiport.o
ip_conntrack_ftp.o ipt_MIRROR.o ipt_owner.o
ip_conntrack_irc.o ipt_REDIRECT.o ipt_pkttype.o
ip_conntrack_tftp.o ipt_REJECT.o ipt_recent.o
ip_nat_amanda.o ipt_TCPMSS.o ipt_state.o
ip_nat_ftp.o ipt_TOS.o ipt_tcpmss.o
ip_nat_irc.o ipt_ULOG.o ipt_tos.o
ip_nat_snmp_basic.o ipt_ah.o ipt_ttl.o
ip_nat_tftp.o ipt_conntrack.o ipt_unclean.o
ip_queue.o ipt_dscp.o iptable_filter.o
ip_tables.o ipt_ecn.o iptable_mangle.o
ipchains.o ipt_esp.o iptable_nat.o
ipfwadm.o ipt_helper.o
あきらかにデフォルト kernel には存在してるよなぁ.
なんか Debian の変化が激しいなぁ.
というわけで,手動で sh スクリプトで全て起動することにした.男は init.d なんかに頼っていてはいけない (嘘です.助けてくださーい (世界の中心で iptables を叫ぶ))
iptablesの起動および設定 も参考にしつつ,こう書き換えた.
#!/bin/sh
##モジュールをロードする
/sbin/modprobe iptable_nat
echo 1 > /proc/sys/net/ipv4/ip_forward
IPTABLES=/sbin/iptables
# -- flush
$IPTABLES -F INPUT
$IPTABLES -F FORWARD
$IPTABLES -F OUTPUT
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -P OUTPUT ACCEPT
# -- masquerade
$IPTABLES -t nat -A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth1 -j MASQUERADE
# -- log
$IPTABLES -A INPUT -i eth1 -m state --state INVALID,NEW -j LOG
$IPTABLES -A FORWARD -i eth1 -m state --state INVALID,NEW -j LOG
# -- drop
$IPTABLES -A INPUT -i eth1 -m state --state INVALID,NEW -j DROP
$IPTABLES -A FORWARD -i eth1 -m state --state INVALID,NEW -j DROP
とりあえず,エラーは出なくなった.
# ちなみに,最近話題になっていたファイルを空にする技 :> file が,さっそく何度も役に立った :-)
う〜ん… しかし,うまくいかない.
dhcpd -f -d とかしてみると,DHCPDISCOVER DHCPOFFER とかでてて,ThinkPad を eth0 で捕まえて,IP を割り当てているところまでは確認できるんだけど…
んで,plan9 側で
term% cat /dev/sysname
とかすると,最初は空白なんだけど,
term% ip/ipconfig
をやると,debian 側の dhcpd が反応して,その後
term% cat /dev/sysname
すると,192.168.0.12 とか,ホスト名が割り振られているのが確認できる.
ここで,
term% /bin/ip/ping -n 2 204.278.31.2(ベル研) とか,
term% hget http://www.google.co.jp
とかすると,
hget: too many errors with no progress cs: can't translate address '/srv/dns' file does not exist
とかでる.
term& ndb/dns -r
とかテキトーにすると,上記のエラーは出なくなるけど,パケットは届かない.192.168.0.1 には届くけど (とりあえず,NIC の動作は確認できたね ♪).
なんか dns がおかしいっぽいけど… もしかして,domain-name-servers で指定してるのが違うのかな ?
それとも,もっと根本的なところなのかも.
あー,ping とか http とか,そもそも通ってないんじゃない ? アホだな,俺.
/sbin/iptables -t filter -A FORWARD -m state --state ESTABLISHE,RELATED -j ACCEPT
## pingの通過および応答を許可
/sbin/iptables -t filter -A FORWARD -i eth0 -p icmp -j ACCEPT
/sbin/iptables -t filter -A INPUT -i eth1 -p icmp -j ACCEPT
## DNS問い合わせの通過および応答を許可
/sbin/iptables -t filter -A FORWARD -i eth0 -p udp --dport 53 -j ACCEPT
/sbin/iptables -t filter -A INPUT -i eth1 -p udp --dport 53 -j ACCEPT
## wwwの通過および応答を許可
/sbin/iptables -t filter -A FORWARD -i eth0 -p tcp --dport 80 -j ACCEPT
/sbin/iptables -t filter -A INPUT -i eth1 -p tcp --dport 80 -j ACCEPT
でも,これを足しても駄目だ.もうわからんね.寝てないので眠い.レポートもまだ終ってないのに,何やってんだ…
(生活ペースが狂いすぎて不眠症管理人)
ちなみに,USB マウスは,とりあえず 9fat: して /n/9/plan9.ini に usbstart とか書いておけば使えるようだ.ちゃんと設定してないから,時々 I/O エラーとか起きるみたいだけど.
あと,本当にいまさらだけど,端末でプログラムが暴走したときとか,普通のシェルだと Ctrl + c とかで割り込みをかけて停止させるけど,Plan9 の場合は Delete キー (ちなみに補完も Tab じゃなくて Insert キー).
これがわかるまで苦労した…
Plan9日記 ■ [Tips] intrはCtrl-cではなくDEL初心者が確実にハマる罠にまんまとはまってしまったようです.
もう 10 時だよ.ていうか,もう朝どころか,昼だよ.もう僕は死んだほうが良いな.もったいないから死なないけど,本当に世間のルールよすいません ☆
ていうか,そもそも固定 IP 割り付けで良かった罠.
ディストリごとに作法が違う罠.
微妙に人によってオプションとかの付け方や iptables の書き方が違う罠.
情報が軒並古い罠.
それ以前に Plan9 なんて使っている人がそもそもいない罠.
クライアントが 1 台しか無いから dhcpd の設定が間違っているのか plan9 の設定が足りないのかすらわからない罠.
接続ツールが無いとネットにさえ繋げないような厨が使っている時点で何もかも間違っている罠.
気が付くともう 9 月も半ばな罠.
もう金曜日じゃないか ! 曜日感覚が欠落している罠.
レポートを書かないと駄目なのに眠れなくてフラフラな罠.
かように,世の中には罠がいっぱいなのだ.
Linux は素晴らしい,Windows は素晴らしい.
みんな気を付けようぜ !
(罠に詳しい管理人)