授業用ネットワークシステム構築のお話(5)

目次

公開日 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で動作チェックを行うことにしました。

一人で何台もやると混乱して忘れ物をするので、手順書をつくりました。また、箱や袋、説明書などは分別して置く場所を決め、小さくまとめると効率が上がります。

  1. マザーボードにCPU, CPUファン, メモリを取り付け
  2. ケースのHDD,CDの金具をはずし,リセットボタンのトップをはずし,FDの板をはずす。
  3. MB付属のバックパネルの1394,COMをふさぐ部分をとり,所定の位置にとりつけ
  4. ケース前面パネル用のオーディオ,USB,HDDLED,PWSW,RESET,SPなどのコネクタを先にマザーボードに取り付け
  5. マザーボードをケースに取り付け。
  6. 電源を配線(マザー2カ所,ファン2個)
  7. CDの仮取り付け(IDEケーブルと電源のみ)
  8. KB,Mouse,ディスプレイ,LAN,電源を接続し,KnoppixをCDから起動する。
  9. BIOS設定,時刻あわせはしていない。
作業日 台数 備考
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

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が正しい相手に中継します。

10/8ネットワークのアドレス内部規則

クラスAの広い空間なので、2バイト目を用途に、3バイト目を設置場所にするというルールを作りました。

固定 用途 場所 個別
10 guest5 1~254
生徒用10 実習室1(南)10
教師用20 実習室2(北)20
サーバ30 情報室30
プリンタ40進路室40

DNS

zebedeeには内部DNSと外部ウェブアクセス用のproxyサーバーを入れてありました。これをmosesに交代させることを考えました。

DNSは同じBINDですが、FreeBSDのやり方がすこと異なります。jailという仕組みもあって迷いながら、これを使わずに設定しています。

BINDは9になっていて、セグメントごとに異なるふるまいをする view という仕組みが導入されていたので、使ってみました。生徒側からはstサブドメインしか引けないようにし、教員側からはst側も引け、外部はプロバイダのDNSにフォーワードするという設定にしてあります。

当時の記録からそのまま写しておきます。ちょっとおかしいところもあるかもしれませんが、当時の設定直後のものです。雰囲気だけ見てください。

/etc/named.conf
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の設定です。

DHCP

生徒側はすべて固定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-がついていたということでした。これを見つけて、なんとか導入しました。

設定の必要だったファイルの名前と、位置です。

/etc/rc.conf
dhcpd_enable="YES" などを記述
/usr/local/etc/dhcpd.conf
リース要件などを記述
/usr/local/etc/rc.d/isc-dhcpd.sh
起動のためのスクリプト。後ろに start, stop, restart などと入れる
/var/db/dhcpd/var/db/dhcpd/dhcpd.leases
リースされたアドレスが記録される

これも、よくわかっていない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ファイルの記録を元に一覧を作ったのだと思います。

proxyサーバー

mosesをproxyにする予定だったのですが、Free-BSDのソフトウェアの選定とインストールには時間がかかりそうだったので、しばらくはzebedeeを残して今までどおりsquidでの運用をすることにしました。

それでも、自アドレスの変更やルーティング情報、使用するDNSなど、squid.conf 以外にも変更作業はたくさんあります。

squid.confはほとんど変更は必要ありません。/etc/squid/squid_allowed_hosts をシェルスクリプトにより書き換えてproxy動作を制御しています。この部分も記録がありません。

/etc/squid/squid.conf
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の事情です。

/usr/local/sbin/allowsq.sh
#!/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は、次のようになっています。

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は、

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なのでレジストリの結合かもしれません。

http://www.st.seiai.ed.jp/proxy.pac
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";
}