公開日 2025-03-29 更新日 -
「授業用ネットワークシステム構築のお話(1)」のときの生徒用実習機は、東北データサービス製でした。これは地元のいわゆるショップブランドです。ネットワーク設計を含めてお世話になりました。「授業用ネットワークシステム構築のお話(2)」で追加導入されたのは、上からの業者指定があって同じ所にできず、EPSONのTypeSAというメーカー製のものでした。
6年経って(1)の実習機の電源が故障が始まってきたことと、CPU内蔵グラフィクスのなど性能に不満も出てきたことから、更新を考えるようになりました。この時期メーカー製のPCを選ぶとWindowsXPでした。あのカジュアルなデザインも好きになれないし、NT系のWindowsにするといろいろ不自由になりそうです。そもそも予算が足りません。そこで、OSをlinuxにすることを見据えて自作することを考えました。
PCの組み立てはすでに経験済みで、OSもWindowsMeやWindows2000を入れ直していました。機器を更新して乗り換えるのですから、ライセンス的にも問題はありません。しかし、このあとマイクロソフト社はこれに制限をかけていきます。この点からもlinuxへの乗り換えが急がれました。
今回も業者の指定があったのですが、メーカーの製品ではなく部品を入れてもらうように頼み込んで了解をもらいました。マザーボード、CPU、メモリ、電源付きのケースのみを購入。ハードディスク、CDドライブ、キーボード、マウス、ディスプレイ、スピーカーは、古いPCから流用します。圧倒的に安く仕上がります。
仕様 CPU Sempron 2800+ MB K8KM800-MLVF メモリー 512MB DDR 400 ケース CS-CG2012 ENERMAX CS-CG2012
部品が揃ったのは7月でした。夏休みの25日から組み立てを開始しました。作業時間が見通せないので、稼働中の実習機にはまだ手を付けないことにしました。
第一段階では新しい部品のみで組み立て、CDドライブとディスプレイ、キーボードなどを仮づけしてKnoppixというCD起動のlinuxで動作チェックを行うことにしました。
一人で何台もやると混乱して忘れ物をするので、手順書をつくりました。また、箱や袋、説明書などは分別して置く場所を決め、小さくまとめると効率が上がります。
作業日 | 台数 | 備考 |
---|---|---|
2006-07-25 | 4 | |
2006-07-26 | 4 | |
2006-07-27 | 15 | 助っ人あり3台 |
2006-07-28 | 6 | |
2006-07-29 | 4 | |
2006-07-31 | 1 | |
2006-08-01 | 7 |
このときのKnoppixは、産総研、アルファシステムズ、東北学院大学工学部で開発、無料配布されている KNOPPIX-Edu 5 でした。KDEデスクトップ環境で起動し、Firefox, Thunderbird, OpenOffice, C言語, FORTRUN, Java, GIMP などのソフトウェアも試すことができます。linuxのデスクトップも使えると確信が持てました。
/media/adachi/W1T/B80Kall/judas-pub
校内のネットワークは1997年にlinuxにsambaを入れてファイル共有の実験から始まり、その経験を授業のためのネットワークへと発展させて来ました。この時点でプライベートIPアドレスによる単一のアドレス空間でした。当時は256台というのはとても広く感じられて、192.168.2.で始まるクラスCのアドレスを使いました。256のうち前半は教員用、後半は授業用としていたのですが、手狭になってきたので分けることを考えました。
教員用は固定IPにしているものがかなりあって、IPアドレスの変更は手間がかかります。生徒用はいつでも自由になりますのでこちらを 10.で始まるクラスAのアドレスを使うことにしました。
ちなみにプライベートIPアドレスの範囲は次のようになっています。CIDR以前に勉強した私は 172.16/12 prefix などと書かれるとちょっと混乱します。でもこの範囲は変わっていません。
範囲 | 別の書き方 | RFC1918での呼称 | CIDR以前の記述 |
10.0.0.0 – 10.255.255.255 | (10/8 prefix) | 24ビットブロック | 一つのクラスA |
172.16.0.0 – 172.31.255.255 | (172.16/12 prefix) | 20ビットブロック | 16の連続したクラスB |
192.168.0.0 – 192.168.255.255 | (192.168/16 prefix) | 16ビットブロック | 256の連続したクラスC |
分離前の状態が下図です。A. とあるのは、192.168.2. を略記したもので、上のクラスAのことではありません。A.129 より大きい後半の番号を生徒実習室のPCに割り当てていたことがわかります。
jonahが生徒用の認証サーバ兼ファイルサーバ、zebedeeは内部DNSと外部接続するときのproxyとして働いています。AR230EはブロードバンドルーターでADSLで上位プロバイダーに接続しています。
外部のインターネットに接続するためのルーターが共有であることと、教員側から生徒用の授業テキストや課題の作品を見られるようにするために両セグメントは完全に切り離すわけには行きません。
次のように配置しました。ここでも B. は、10.30.30. の略記です。
moses というのは、やはり自作のPCです。記録によると 2004年12月27,28日 にインストールして、その後ほとんど使っていないものです。
mosesの仕様 CPU Athron-1GHz MB AOPEN AK73Pro south:VT8237 メモリー 256MB HDD 30GB OS 15GB:windows2K / 15GB:FreeBSD 5.3Release
Windowsで使用したあと、性能的に満足できなくなってきた自作PCの後半にLinuxなどをインストールして、デュアルインストールで使いがってを試すということをよくやっていて、これもその一つでした。
それが、色々あってついに2006/8/9に役目が回ってきたことになります。FreeBSDなので設定の仕方がLinuxとは異なります。FreeBSDには慣れていませんが,ルーティングについては優れているような印象があるので使ってみたのだと記憶しています。特に問題なく機械の寿命まで働いてくれたこともあり、記録も記憶も自信がありませんが、解説してみます。わからなくなっても古いもので現物もなく調べようがありません。
まず2枚のNICを挿して設定します。
最初のインストールで挿してあったNICは、Broadcom NetXtreme Gigabit Ethernet で、接続速度の指定が自動にならず、ちょっと面倒だったようです。/etc/rc.conf に bge0 の設定として残っていました。このIPアドレスを書き換え、追加したNICの設定も追加しています。2枚目のNICの設定が自動だったのか、ifconfigコマンドを駆使したのかはわかりませんが、/etc/rc.conf への追加事項の記録は次のようになっています。
ifconfig_bge0="inet 10.30.30.1 netmask 255.0.0.0\ media 100baseTX mediaopt full-duplex" ifconfig_rl0="inet 192.168.2.10 netmask 255.255.255.0"
これだけで、mosesの端末からpingを打てば、10/8側も192.168.2/24側も返答が帰ってきます。
ルーティングを確認すると、
moses# /usr/bin/netstat -rn Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire 10 link#1 UC 0 0 bge0 10.10.10.1 00:c0:26:26:63:e5 UHLW 0 3 bge0 583 127.0.0.1 127.0.0.1 UH 0 0 lo0 192.168.2 link#2 UC 0 0 rl0 192.168.2.35 00:50:bf:21:78:bc UHLW 0 915 rl0 833 192.168.2.129 00:d0:b7:1c:55:2e UHLW 0 36 rl0 878
この後に IPv6 が出ていますが、省略します。
デフォルトルートを加えないと、外部インターネットに通信できません。
moses# route add -net default 192.168.2.2 add net default: gateway 192.168.2.2
確認します。defaultの他に192.168.2.2 も自動的に加えられています。192.168.2 が設定されていればいらないような気もしますが、こうなっています。
moses# /usr/bin/netstat -rn Routing tables Internet: Destination Gateway Flags Refs Use Netif Expire default 192.168.2.2 UGS 0 0 rl0 10 link#1 UC 0 0 bge0 127.0.0.1 127.0.0.1 UH 0 0 lo0 192.168.2 link#2 UC 0 0 rl0 192.168.2.2 link#2 UHLW 1 0 rl0 192.168.2.35 00:50:bf:21:78:bc UHLW 0 1097 rl0 1025 192.168.2.129 00:d0:b7:1c:55:2e UHLW 0 38 rl0 1173
再起動時のために /etc/rc.conf に書き加えて置きます。
moses# vi /etc/rc.conf ... hostname="moses.st.seiai.ed.jp" ifconfig_bge0="inet 10.30.30.1 netmask 255.0.0.0\ media 100baseTX mediaopt full-duplex" ifconfig_rl0="inet 192.168.2.10 netmask 255.255.255.0" defaultrouter="192.168.2.2" inetd_enable="YES" ...
申し遅れましたが、いままでのドメインは seiai.ed.jp のサブネットの形にして in.seiai.ed.jp としていました。分けるときに 10/8の方は st.seiai.ed.jp としました。ルーターとして挟まっているmosesは、moses.in.seiai.ed.jp でもあり、moses.st.seiai.ed.jp でもあるのですが、ここではstの方を書いています。これでいいのかはよくわかりません。
ちなみにseiai.ed.jpは本校で取得したドメインです。サブドメインは外から見えるようにはしていません。ブロードバンドルーターを通してNATで通信をしますから、これでOKです。
mosesの中からなら両方のサブネットに通信できますが、mosesを通過して双方で通信するにはあと2つ設定が必要です。
(1)moses の /etc/rc.conf にgateway_enableの設定を追加
# -- sysinstall generated deltas -- # Mon Dec 27 20:36:32 2004 # Created: Mon Dec 27 20:36:32 2004 # Enable network daemons for user convenience. # Please make all changes to this file, not to /etc/defaults/rc.conf. # This file now contains just the overrides from /etc/defaults/rc.conf. hostname="moses.st.seiai.ed.jp" ifconfig_bge0="inet 10.30.30.1 netmask 255.0.0.0\ media 100baseTX mediaopt full-duplex" ifconfig_rl0="inet 192.168.2.10 netmask 255.255.255.0" defaultrouter="192.168.2.2" gateway_enable="YES" # Set to YES if this host will be a gateway. inetd_enable="YES" keymap="jp.106" linux_enable="YES" moused_enable="YES" nfs_client_enable="YES" nfs_server_enable="YES" rpcbind_enable="YES" saver="blank" scrnmap="NO" sshd_enable="YES" usbd_enable="YES" # This file now contains just the overrides from /etc/defaults/rc.conf. # Please make all changes to this file, not to /etc/defaults/rc.conf. # Enable network daemons for user convenience. # Created: Sat Jan 22 21:19:59 2005
(2)AR230Eにルーティングの設定
192.168.2.2 のAR230Eに、10/8 へのパケットをどこに送ればいいか教える必要があります。
詳細設定 / スタティックルーティングテーブル で次のように設定しました。
ネットワークアドレス | サブネットマスク | ゲートウェイ | インターフェース | |
◎1 | 10.0.0.0 | 255.0.0.0 | 192.168.2.10 | LAN Ethernet |
これで、10/8 のネットワークのPCに、デフォルトルートとして moses(10.30.30.1) を指定しておけば、moses が 192.168.2/24 宛のパケットは直接送信し、それ以外は moses のデフォルトルーターである AR230E に投げます。AR230Eに戻ってきた返答は 10/8 宛てなら moses(192.168.2.10) に投げられて、mosesが正しい相手に中継します。
クラスAの広い空間なので、2バイト目を用途に、3バイト目を設置場所にするというルールを作りました。
固定 | 用途 | 場所 | 個別 | ||
10 | guest | 5 | 1~254 | ||
生徒用 | 10 | 実習室1(南) | 10 | ||
教師用 | 20 | 実習室2(北) | 20 | ||
サーバ | 30 | 情報室 | 30 | ||
プリンタ | 40 | 進路室 | 40 |
zebedeeには内部DNSと外部ウェブアクセス用のproxyサーバーを入れてありました。これをmosesに交代させることを考えました。
DNSは同じBINDですが、FreeBSDのやり方がすこと異なります。jailという仕組みもあって迷いながら、これを使わずに設定しています。
BINDは9になっていて、セグメントごとに異なるふるまいをする view という仕組みが導入されていたので、使ってみました。生徒側からはstサブドメインしか引けないようにし、教員側からはst側も引け、外部はプロバイダのDNSにフォーワードするという設定にしてあります。
当時の記録からそのまま写しておきます。ちょっとおかしいところもあるかもしれませんが、当時の設定直後のものです。雰囲気だけ見てください。
acl "stnet" { { 10/8; 127/8; }; }; acl "innet" { { 192.168.2/24; }; }; options { directory "/etc/namedb"; //実は/var/named/etc/namedb pid-file "/var/run/named/pid"; dump-file "/var/dump/named_dump.db"; statistics-file "/var/stats/named.stats"; allow-transfer { 192.168.2.1; 192.168.2.129; 10.30.30.2 }; }; view "st" { match-clients { stnet; }; zone "." { //ローカル限定 type master; file "named.root.moses"; }; zone "0.0.127.in-addr.arpa"{ //ループバック type master; file "master/localhost.rev"; }; zone "10.in-addr.arpa" { //逆引きseiai.stゾーンデータ type master; file "master/10.rev"; }; zone "st.seiai.ed.jp" { //正引きst.seiaiゾーンデータ type master; file "master/st.zone"; }; }; view "in" { match-clients { innet; }; zone "." { type hint; file "named.root"; }; zone "0.0.127.in-addr.arpa"{ //ループバック type master; file "master/localhost.rev"; }; zone "10.in-addr.arpa" { //逆引きseiai.stゾーンデータ type master; file "master/10.rev"; }; zone "st.seiai.ed.jp" { //正引きin.seiaiゾーンデータ type master; file "master/st.zone"; }; zone "2.168.192.in-addr.arpa" { type slave; file "slave/192.168.2.rev"; masters{192.168.2.1;}; }; zone "in.seiai.ed.jp" { type slave; file "slave/in.zone"; masters{192.168.2.1;}; }; };
両方のviewにデフォルトではいっていたipv6のローカル設定は省略しています。IPv6にはまだ間のある時代でしたが、早くから準備されていて目にしています。
教員側はjudasというサーバーでDNSを動かしているので、slaveの設定です。
生徒側はすべて固定IPアドレスで運用していました。ホスト名とも関係づけて管理していました。たとえば、最初の40台はホスト名がsheep01からsheep40でIPアドレスは、192.168.2.131 から 192.168.2.170 でした。今回これを引き継ぐと 10.10.10.1 から 10.10.10.40 とすることになります。これがさらに40台あります。DHCPは各PCのNICに設定されているmacアドレスによってIPアドレスとホスト名を配布する機能がありますから、これを機会に導入することにします。
Free-BSDでのDHCPサーバーのパッケージが、5.4用はあるのに、5.3用にはないということで探しましたが、5.3までは isc-dhcp3-server とisc-がついていたということでした。これを見つけて、なんとか導入しました。
設定の必要だったファイルの名前と、位置です。
これも、よくわかっていないjailがらみのパスで、迷いがあります。dhcpd.conf.sample をコピーして参考にしながら、dhcpd.conf を作成しましたが、どのようにしたかは「あとで」としか記録していません。確認作業に追われていたのでしょう。CD起動のknoppixを使ってにはipアドレスなどが配布されることを確認しています。
ここで問題発生。既存の生徒機は192系の固定アドレスのWindowsMe機で、同じサブネットにPDCコントローラであるjonahがなければ起動できません。結局一時的にjonahにNICを追加し192系のIPアドレスを設定してもう一つのセグメントを作り、Windows機を設定を変えてからつなぎ直すことで解決しました。ただし、WindowsMeではホストのIPアドレスは自動取得にできますが、DNSのIPアドレスを自動取得にすることができませんので、10.30.30.1とmosesのアドレスを書き込む必要がありました。ホスト名も自動取得になりませんでした。WindowsMeのホスト名は先にnetbios名があってこれをIPのホスト名にも使うという流れだからでしょう。
macアドレスによるIPアドレスの配布にはmacアドレスを知る必要がありますが、これをどうしたかは記録にありません。たぶん一度接続してnetstatコマンドやdhcpd.leasesファイルの記録を元に一覧を作ったのだと思います。
mosesをproxyにする予定だったのですが、Free-BSDのソフトウェアの選定とインストールには時間がかかりそうだったので、しばらくはzebedeeを残して今までどおりsquidでの運用をすることにしました。
それでも、自アドレスの変更やルーティング情報、使用するDNSなど、squid.conf 以外にも変更作業はたくさんあります。
squid.confはほとんど変更は必要ありません。/etc/squid/squid_allowed_hosts をシェルスクリプトにより書き換えてproxy動作を制御しています。この部分も記録がありません。
cache_peer <上位proxyのURL> parent 8080 7 no-query cache_dir ufs /var/spool/squid 340 16 256 ftp_user webadmin@seiai.ed.jp dns_nameservers 10.30.30.1 <プロバイダのDNSを併記> refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern . 0 20% 4320 acl all src 0.0.0.0/0.0.0.0 acl manager proto cache_object acl localhost src 127.0.0.1/255.255.255.255 acl SSL_ports port 443 563 acl Safe_ports port 80 21 443 563 70 210 1025-65535 acl Safe_ports port 280 # http-mgmt acl Safe_ports port 488 # gss-http acl Safe_ports port 591 # filemaker acl Safe_ports port 777 # multiling http acl CONNECT method CONNECT acl sqalhosts src "/etc/squid/squid_allowed_hosts" acl localservers dstdomain st.seiai.ed.jp http_access allow manager localhost http_access deny manager http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost http_access allow sqalhosts http_access deny all icp_access allow all miss_access allow all never_direct deny localservers never_direct allow all
cache_peer <上位proxyのURL> は
never_direct の指定は、ローカルドメイン以外へのすべての要求をproxyを経由ということです。
9月になってmosesにもsquidを導入し、役割を移しました。squid.confはちょっとだけ変更です。
dns_nameservers の項目がなければmosesの使っているDNSを使うというので、不要と思い項目を削除 /etc/squid/squid_allowed_hosts のファイルのパスをmoses似合わせて書換
squid_allowed_hostsの内容をシェルスクリプトで変更してsquidにreloadをかけます。pオプションはFreeBSDの事情です。
#!/bin/sh cd /usr/local/etc/squid/allow/ case $1 in a) cp -fp allow_all squid_allowed_hosts /usr/local/etc/rc.d/squid.sh reload ;; b) cp -fp allow_both squid_allowed_hosts /usr/local/etc/rc.d/squid.sh reload ;; f) cp -fp allow_fish squid_allowed_hosts /usr/local/etc/rc.d/squid.sh reload ;; v) cp -fp allow_vine squid_allowed_hosts /usr/local/etc/rc.d/squid.sh reload ;; n) cp -fp allow_none squid_allowed_hosts /usr/local/etc/rc.d/squid.sh reload ;; t) echo "squid_allowed_hosts" cat "squid_allowed_hosts" ;; *) echo "usage allowsq mode (a b f v n t)" echo " allow to a:all b:both f:fish v:vine n:none t:test" ;; esac <
コピーされるそれぞれのファイルには許可する通信元のアドレスの範囲が書いてあります。片方の教室のみ接続を許すファイルallow_fishは、次のようになっています。
10.10.40.0/255.255.255.0 10.20.0.0/255.255.0.0 10.10.10.0/255.255.255.0
両方の教室の接続を許すファイルallow_bothは、
10.10.40.0/255.255.255.0 10.20.0.0/255.255.0.0 10.10.10.0/255.255.255.0 10.10.20.0/255.255.255.0
使い方としては、
$ sudo allowsq.sh f
などとなっています。上記のアドレス内部規則に則っています。
このプロキシーを使うという設定は、最初期にはブラウザに直接設定していましたが、後にプロキシー自動設定ファイル(pac)を使うようになりました。何回かやり方が変わって、今回の内容は以下ですが、この時期配布をどうしていたか記録が見つかりません。DHCP経由という方法もありますが、まだWindowsなのでレジストリの結合かもしれません。
function FindProxyForURL(url,host) { if ( isPlainHostName(host) || dnsDomainIs(host, ".st.seiai.ed.jp") || dnsDomainIs(host, ".in.seiai.ed.jp") ) return "DIRECT"; else if (shExpMatch(host, "10.*")) return "DIRECT"; else return "PROXY 10.30.30.1:3128; DIRECT"; }