ルータ
情報実験室を独立したネットワーク空間にするためには ルータの設置が必要です。 ここでいうルータはネットワークを複数枚インストールして、 パケットをフォワードするように設定した普通のPCです。
ルータの設置
- 今回はルータとして旧情報実験機活用プロジェクトの
情報実験機 #06 (qjoho06) を転用した。
- Pentium4 2.4GHz (single thread)
- 512 Mbyte DDR-266 RAM
- 80GB HDD, Seagate ST380011A
- NIC: e1000 x 2, tulip x 1
- 設置場所として、サーバラックの news サーバの箱を使用
- 余り物品のハードディスクを1つ使用した
- インストールと管理用に CPS 裏ネットから線を引いた
ルータのOSインストール
- CPS裏ネットワークから squeeze のインストーラを起動
- とりあえず 10.0.16.6/16 でインストール
- ssh とベースシステムのみ入れる
ルータの設定
ホスト名
- /etc/hostname を書き換える
- /etc/hosts の2行めを書き換える
- /etc/mailname を書き換える
sudo
- # apt-get install sudo
- # visudo
- システムユーザに対して ALL=(ALL) ALL と設定
ssh
- /etc/ssh/sshd_config の PermitRootLogin を without-password に変更
- /root/.ssh というディレクトリを作って、その下に 自分のパブリックキーを authorized_keys というファイル名でコピー
sysctl
- /etc/sysctl.conf の以下の項目を変更
net.ipv4.tcp_syncookies=1 net.ipv4.ip_forward=1
ネットワーク
- インターフェース
- eth0
- Intel (e1000) #1, 133.87.45.35/24
- eth1
- Intel (e1000) #2, 192.168.16.1/24
- eth2
- ADMtek (tulip), 10.0.16.6/16
- /etc/network/interfaces を変更
- ネットマスクを適切に設定
- eth0 のみ上位ルータの設定
- /etc/udev/rules.d/70-persistent-net を変更
- eth 番号の調整をする
iptables
- 192.168.16.0/24 -> 133.87.45.35 へ NAT する
- 10.0.0.0/16 -> 133.87.45.35 へ NAT する
- ローカルアドレスへは NAT せず drop する
- todo: どうしてもと要望があれば,もう一枚NICをさして 既存 192.168.16 系にルーティング
- iptables については固定ファイルで運用する.
- todo: mac address でルーティングする/しないを設定
- /etc/network/interfaces の eth0 に以下を追加
post-up /bin/sh /etc/network/iptables.sh
- /etc/network/iptables.sh を作成
不要パッケージの削除
- 消すパッケージ (aptitude purge)
- nfs-common
- portmap
- at
- lwresd
- 確認
- netstat -lntu で確認
- 開いているポートを 22 と 25 だけにする
- ps axuww で確認
- dbus とか avahi とかがないか確認。あったら消す
- netstat -lntu で確認
exim4
- dpkg-reconfigure exim4-config で設定
- smarthost にして対象を jupiter.hokudai.in-cps とする
- 試しにメールを出してみる
cron
- cpsの設定に習う
- cronlocal.tar.bz2 を /etc/cron.local 以下に展開
- /etc/crontab を設定
6 4 * * * root cd / && run-parts --report /etc/cron.local/daily | mail -s "`hostname -f` daily run outputs" root@hokudai.in-cps 36 4 * * 7 root cd / && run-parts --report /etc/cron.local/weekly | mail -s "`hostname -f` weekly run outputs" root@hokudai.in-cps
gate ユーザーの登録
- ユーザー登録
# addgroup gate --gid 500 # adduser gate --uid 500 --gid 500 # mkdir /home/gate/.ssh # cp /root/authorized_keys /home/gate/.ssh/ # chown -R gate:gate /home/gate
- とりあえず gate で ssh してみる
- orange の ~gate/.ssh/id_rsa.pub を authorized_keys に登録
from="133.50.160.51",no-port-forwarding,no-X11-forwarding,no-agent-forwarding ssh-rsa AAAA...(以下長いので省略)
- ~/.shosts に orange を登録
gate更新通知受け取りデーモン
- inetd でやると簡単だけど、とりあえず自作
- gate2dhcpd.conf 作成
- とりあえず通知受けとるだけ
#!/bin/sh # translate gate database to dhcpd.conf # 2011/09/20 anouda GATE_DIR=/home/gate export LC_CTYPE=C LC_ALL=C LANGUAGE=C LANG=C DATE=`date` echo "[${DATE}] $$:gate knocked" 1>&2 echo "info: sorry, constructing now" exit 0
- rmd.c をコンパイル
gate@qjoho06$ gcc -Wall -W -Os -o rmd rmd.c gate@qjoho06$ chown 6755 rmd
- rmd-gate-startup.sh 作成
#!/bin/sh /home/gate/rmd -p 8888 -e /bin/sh -l /home/gate/gate.log sh /home/gate/gate2dhcpdconf.sh
- /etc/rc.local に登録
- 出力を /dev/null にリダイレクトしないと 起動時に余計なプロセスが残るので注意
/home/gate/rmd-gate-startup.sh > /dev/null 2>&1
- 確認
- telnet qjoho06 8888 で確認
dhcpd
- とりあえず何でも受け入れるサーバーとして設定
- # apt-get install isc-dhcp-server
- /etc/default/isc-dhcp-server に以下を書く
INTERFACES="eth1"
- /etc/dhcp/dhcpd.confを書く
# # dhcpd.conf # dynamic host configuration protocol, configuration file # for joho3N+1, joho3N+2 network # option domain-name "ep.sci.hokudai.ac.jp"; option domain-name-servers 133.87.45.70, 133.87.45.66, 133.87.1.11; default-lease-time 600; max-lease-time 7200; ddns-update-style none; log-facility local7; use-host-decl-names on; include "/etc/dhcp/dhcpd-gate.conf";
- /home/gate/dhcpd-any.conf を gate 権限で作成
# # IP addresses are distributed to all hosts, without check # subnet 192.168.16.0 netmask 255.255.255.0 { pool { range 192.168.16.10 192.168.16.254; option routers 192.168.16.1; option broadcast-address 192.168.16.255; } }
- $ ln -s dhcpd-any.conf dhcpd-gate.conf を実行
- # ln -s /home/gate/dhcpd-gate.conf /etc/dhcp/dhcpd-gate.conf を実行
- sudoers に以下を設定
gate ALL=NOPASSWD: /etc/init.d/isc-dhcp-server
- 確認
- gate 権限で /etc/init.d/isc-dhcp-server start としてみる
仮運用
- しばらく運用してみて様子をみる
本線ルータが時々見えなくなる問題
- 問題発生:ネットワークの調子が悪くなった
- とりあえず qjoho06 の電源を切って隔離したら治った
- arp でみると、時々知らないMACアドレスが返される
linux カーネルの初期設定で、 複数のネットワークインターフェース を持つ場合には, arp のアドレス解決要求に対し、パケットを受け取って いない方のインターフェースのものであっても 知っているものがあれば何でも返してしまうという仕様による。
隔離したつもりがそうできていなかった。
回避方法は、sysctl のパラメータを以下のように設定
net.ipv4.conf.eth0.arp_ignore = 1
同一ブロードキャストドメインを持つ別のネットワークにまたがる ホストを構築するときには注意が必要
gate スクリプト書き
gate のデータベースが手に入ったので gate 情報から dhcpd.conf を作るシェルスクリプトを書いた
#!/bin/sh # # gate database to dhcpd.conf # direct conversion # exec >&- <&- GATE_DIR=/home/gate export LC_CTYPE=C LC_ALL=C LANGUAGE=C LANG=C DATE=`date` echo "[${DATE}] $$:gate knocked" 1>&2 DIR=${GATE_DIR}/pipdb/stable TMP=${GATE_DIR}/dhcpd-gate-pip-test.conf FILE=${GATE_DIR}/dhcpd-gate-pip.conf cat <<EOF>${TMP} subnet 192.168.16.0 netmask 255.255.255.0 { } group dhcpclients { EOF for i in ${DIR}/* do FCHAR=`echo $i | rev | cut -d/ -f1 | rev | cut -c1` LCHAR=`echo $i | rev | cut -c1` if [ ${FCHAR} = '.' ]; then continue; fi if [ ${FCHAR} = '#' ]; then continue; fi if [ ${LCHAR} = '~' ]; then continue; fi # IP=`cat $i | egrep -i "^ip:" | cut -c5- | sed 's/192\.168\.16\./192.168.17./'` IP=`cat $i | egrep -i "^ip:" | cut -c5-` MAC=`cat $i | egrep -i "^eth:" | cut -c6-` HOST=`cat $i | egrep -i "^hostname:" | cut -c11-` if [ "x${IP}" = 'x' -o "x${MAC}" = 'x' -o "x${HOST}" = 'x' ]; then continue fi cat <<EOF>> ${TMP} host ${HOST} { hardware ethernet ${MAC}; fixed-address ${IP}; } EOF done echo "}" >> ${TMP} # check dhcpd.conf /usr/sbin/dhcpd -cf ${TMP} -t > /dev/null 2>&1 if [ "x$?" != "x0" ]; then echo "dhcpd.conf: syntax error: cannot update dhcpd.conf" exit 1; fi # update dhcpd.conf cp ${TMP} ${FILE} # restart dhcpd # please register sudoers, with NOPASSWD sudo /etc/init.d/isc-dhcp-server restart 1>&2 #EOF
設定の調整と確認
- gate が host based authentication で入れるようにする
- 最低限度の設定で済ませる
- /etc/ssh/sshd_cofnig にホストベース認証の設定をする
HostbasedAuthentication yes
- 以下を実行して ssh_known_hosts を作成
qjoho06# echo -n "orange.ep.sci.hokudai.ac.jp " > /etc/ssh/ssh_known_hosts qjoho06# ssh anouda@www.ep.sci.hokudai.ac.jp cat /etc/ssh/ssh_host_rsa_key.pub >> /etc/ssh/ssh_known_hosts
- orange で gate でログインして qjoho06 に ssh してみる
- orange から telnet qjoho06 8888 を実行してみる
Todo
- 既存 192.168.* 系統との通信をしたい
- 配布するアドレスを 192.168.144.* に変更して、 ルータ用に192.168.16.* を取得してNATせずに ルーティングすることで可能だろう
- eth0 に alias をつけることで複数アドレスに対応
- 各部屋から情報実験室ネットへのルーティングは各ホストが手動で設定 (もしくは blue を改変)