去年の夏頃にTime Capsule 1TBモデルを買った。こいつは30kそこそこのくせになかなかの優れモノで、Time Machineとのシームレスバイアスもといシームレスなバックアップ(先にBase Stationに飛ばし、その後ディスクに書き込むため速い)はもとより、自分用/ゲスト用に別のWiFi飛ばせたり、あるいは普通のHDDとして使ったりルータとして活用したりもできる。

いまいち使いこなせている感がしないTime Capsuleだが、最近ようやく色々と弄り始めて、こーゆーものをNASって言うらしい、と買ってから知った。
Time Capsuleたんは自宅サーバ構築にも一役買ってくれた。自宅サーバめちゃ楽しい。Ubuntu 10.04をチョイスし、ちょこちょこ育てて遊んでいる。


お名前.comで独自ドメインを取得し、FreeDNSにてDDNS設定を行ってGlobal IPが変わっても自宅に繋がるようにした上で、ルータ(=Time Capsule)側でNATを設定してやって、特定ポートで繋いできたら古いWindows機(512MB)に立てたUbuntuサーバに流すようにしている。一応Apacheも動いているが、まだXenかKVMで仮想化して遊びたいので、何かコンテンツを置いて活用したりはしてない。そのうち、業務の勉強も兼ねて、FLEX+Eclipseを使ってFlash ベースのWebアプリを作って(モノによっては)公開しよう※と思ってる。夢は広がるばかりで、そして広がるだけである。


※1 ウチの会社が提供する金融系Webアプリは、FLEXで作ったFlashベースのものが多い
※2 さくらのレンサバではTomcatは利用できないので



上記の書き殴りで分かる人はいいけど分からない人のために、ミームでも出来る自宅サーバ構築のイロハ、をお送り致します。
ネットワークというかインターネットの仕組みが一通り俯瞰出来て面白いので、興味が在る人にはおすすめする。



こんてんつ




  • 1. WindowsマシンにUbuntu Serverをインストール

  • 2. サーバにネットワーク設定を行う


    • 2.1. SSHでリモートから入れるようにしておく。

    • 2.2. Apacheをインストール

    • 2.3. ローカルネットワーク内のIPアドレスを固定する


  • 3. お名前.comで独自ドメインの取得

  • 4. FreeDNSでDDNS設定を行う


    • 4.1. お名前.comの登録ネームサーバをFreeDNSのものにする

    • 4.2. FreeDNSに取得したドメインを登録、DynamicDNS設定

    • 4.3. 自宅サーバに定期実行スクリプトを置く


  • 5. TimeCapsule(ルータ)でNATの設定をする







1. WindowsマシンにUbuntu Serverをインストール



このへんまでは独力でだいたいいける、と想定。ググって分かる事はなるべく書かない方針で。

Download | Ubuntu

僕の使ったのは10.04だけど、最新版は10.10。isoファイルを落として、適当にDVD焼いてやる。
どうせ操作性の悪い無駄にでかいWindowsノートだし、リモートonlyで使う想定で、インストールはCUIだけにした。誰に言われたか忘れてしまったが、Twitterで
「X関連を入れなければCUIのみになって軽い。sshd_configだけ設定して、あとはSSHで適当なマシンから繋いでいじるといいよ」

というアドバイスを頂いたのでそれに従って見た次第。
なんか噂によると10.10はインストールが随分簡単になったとか。



2. サーバにネットワーク設定を行う



インストールが済んだら設定。


2.1. SSHでリモートから入れるようにしておく。


基本的にopensshのインストールと/etc/ssh/sshd_configの設定だけ。

参考: Ubuntuにsshログインできるようにする設定


2.2. Apacheをインストール



sudo apt-get install apache2


デフォルト、つまりただApacheが待機しているだけの設定ならこれでOK。http://サーバのローカルIP/とかやればIt Works!って言ってるはず。簡単。たぶんな。


2.3. ローカルネットワーク内のIPアドレスを固定する



はい、ここ大事ね。
192.168.*.*系とか10.0.*.*系があると思うけど、たとえばTime Capsuleルータのネットワーク10.0.10.だったら、Ubuntuの設定で


/etc/network/interfaces


に以下を追記する。


# The primary network interface
auto eth1
iface eth1 inet static
address 10.0.10.100
netmask 255.255.255.0
network 10.0.10.0
gateway 10.0.10.1
broadcast 10.0.10.255


ここで、サーバにするUbuntuのローカルIPアドレスをDHCPによる自動振り分けではなく、10.0.10.100に固定している。
後述のNAT設定で「外部から入って来たときに"この"アドレスに渡す」という設定を行うのだが、先んじてここでIPアドレスを固定しておかないと、「どのアドレスに渡すべきかその時々で変わる」という状況になって、困るわけだ。この説明でわかるかな。



3. 独自ドメインの取得



ドメイン登録サービス、どこでもいいけど個人的に僕が使ってるのは お名前.com 。ドメインを取得。日々何かしらキャンペーンをやってるので、ただ取るだけなら結構安く済む。このブログの"hash.bz"もお名前.comで取得したドメインだったりと、3,4個持ってる。強者は数十個保有してるとかしてないとか。



4. FreeDNSでDDNS設定を行う



僕はこのステップが理屈としてはわかっても今ひとつピンと来なかった。ちょっと順を追って説明してみよう。

まず、自宅からインターネットを使えるという事は、自宅のネットワークは外に対して「私はここから来ました」という出身地アドレスを提示していることを意味する。同時にその出身地アドレスは、受信するデータの宛先にもなる。確認くん あたりを使えば、比較的簡単に、「自分は今どこからアクセスしているのか」を確認する事が出来る。これがグローバルIPだ。

そして、外部(インターネット)から自宅のUbuntuサーバにアクセスするためには、自宅のグローバルIPを知る必要がある。


ところが、ExciteとかOCNとかUSENとか、プロバイダ(ISP)で自宅からネットに接続してる人はかなり多いと思うが、この場合は自宅のグローバルIPが時々変わってしまう、という問題がある。理由を勉強した気がするが忘れた。多分、契約者全員にGIPを割り振るよりも、そのとき使う人に動的にGIPを割り振った方がトータルで必要となるGIPが少なくて済むからとかそんな理由だった気がする。あ、ちなみに会社は大抵いくつかGIPを取得してます。


さて上記のような問題があるため、外から自宅にアクセスしようとしても「どこに向けて」アクセスすればいいのか、わからない。
そこで使う事になるのが、DDNS、Dynamic DNSという「あるドメイン」と「変化するGlobalIP」を一意に結びつける仕組み(?)だ。概念図を書いてみるとこんな感じ?

ddns


具体的な手順は以下の通り。


4.1. お名前.comの登録ネームサーバをFreeDNSのものにする



お名前.com にアクセスし、

cap000177


ドメインのネームサーバを「変更する」

cap000186


このように登録する。
この設定によって subdomain.yourdomain.netをDNSへ問い合わせると、名前空間をルート(.)から辿って、ns1~ns4.afraid.orgという名前のDNSサーバまで辿り着くようになる。


4.2. FreeDNSに取得したドメインを登録、DynamicDNS設定



DDNSサービスを提供しているところは色々あるけど、バーベキューで出会い稲刈りで再会した先輩エンジニアであるところの@tfmagicianにオススメされた FreeDNS を使う。

...で、説明を書こうとしたんだけど、

FreeDNSの設定で一番参考になったサイト


このサイト以上に分かりやすく説明出来る気がしないのでこっち見て下さい(ひどい)


4.3. 自宅サーバに定期実行スクリプトを置く



ここがキモ(と言いつつさっきのページ見ればわかるんだけど)。FreeDNSのDDNSのページで”wget script”を押すと


rem subdomain.yourdomain.net
wget -q --read-timeout=0.0 --waitretry=5 --tries=400 \
--background http://freedns.afraid.org/dynamic/update.php?VAAAAAAAAAAAAAAAAAAAAAAAAAAAAAy


こんなコードが落ちてきた。.batなのでwin用らしいが、必要なのは?以下のパラメータ部。あとシェルスクリプトを用意。上記のサイトよりちょいと拝借。


# From http://freedns.afraid.org/scripts/dnsactual.sh.txt

if test -f /etc/freedns/dnsactual.conf
then
CacheIP=$(cat /etc/freedns/dnsactual.conf)
fi
#echo $CacheIP
CurreIP=$(wget http://freedns.afraid.org/dynamic/check.php -o /dev/null -O /dev/stdout \
| grep Detected | cut -d : -f 2 | cut -d '<' -f 1 | tr -d " ")
#echo $CurreIP
if [ "$CurreIP" = "$CacheIP" ]
then
# Both IP are equal
echo "Update not required..."
else
# The IP has change
echo "Updating http://free.afraid.org with " $CurreIP
wget http://freedns.afraid.org/dynamic/update.php?U2NDexxxxxxxxxxxxxxxxxxxxxxxxxxxxTUy \
-o /dev/null -O /dev/stdout
echo `date` "Updating log with IP " $CurreIP >> dnsactual.log
fi
rm -f /etc/freedns/dnsactual.conf
echo $CurreIP > /etc/freedns/dnsactual.conf


上記の VAAAAAAAAAAAAAAAAAAAAAAAAAAAAAy(自分用のパラメータ) を、U2NDexxxxxxxxxxxxxxxxxxxxxxxxxxxxTUyの部分に当て込む。

こいつをcronで定期的に動かしてやればいい。


% sudo su -
rootになって
# chmod 700 dnsactual.sh
実行権限を与えておいて
# crontab -e
0,15,30,45 * * * * sh /etc/freedns/dnsactual.sh > /dev/null
cronに登録。毎時15分ごとに実行。


ちなみに、crontabの実態(ただし直接編集できない)は/var/spool/cron/crontabsに、ユーザごとにわかれて存在する。ちなみのちなみに、ユーザは/etc/passwdで定義されている。
更新ログはdnsactual.logに溜まってく。



5. NAT設定



ここまで出来てしまえば、後は受け入れ側、すなわち自宅のルータ(Time Capsule)の設定だけで事が足りる。ここで設定する"NAT"が何のかはまぁググってもらうとしてまぁ要は自宅ネットワークに到達したパケットに対して有効な"決まり"、ローカルルールである。頭に当たるとセーフとか、跳ね返ったボールを味方がキャッチしてもセーフとか、強すぎる男子は左で投げろとか、外野が内野を殺すと生き返れるとか、空中なら線を越えて投げてもアリとか、そういうやつだ。ドッジ好きだった。


4.までの設定で特定のGlobal IPめがけてアクセスできるようになっても、まだ自宅のルータで止まってしまう。ルータは内部用と外面用に二つIPを持っており、上記の設定では、定期的に「現在ルータに割り振られている外面IPアドレスまでの名前解決」を行うに過ぎない。ルータは「俺に接続されても困るんですけど…」となる。そこでルータにNATの設定をしてやる。


これは結構試行錯誤&結果オーライだった。AirMacユーティリティを起動し、Time Capsuleの設定を行う。
インターネット > NAT
から、先ほど2.3.で固定した10.0.10.100 を「規定のホスト」に指定して、「NATポートマッピング・プロトコルを使用」にチェックを入れる。

cap000183

「ポートマッピングを設定」ボタンをクリックすると
詳細設定 > ポートマッピング
に飛ぶので、そこでweb用にポート80, ssh用にポート22をあける。

cap000184

// SSHはデフォルトポートが22だが、実験が上手くいったら、Ubuntuの/etc/ssh/sshd_configのPort項目をいじってデフォルトから外しておいた方がいい。デフォルトポートから任意のポート番号に設定した瞬間、鳴っていたサーバのファン音が急に静かになった。そんなにポートスキャン来てんの?



6. 以上。



これで、ネットに繋がってさえいれば会社のPCだろうがemobileだろうがiPhoneだろうが自宅のサーバにアクセス出来る事になる。実に素晴らしい。

よく電気代がヤバいと言われますが、僕はまだ実感してません。来月怖い。

僕の今の使い方は、環境をあまり破壊的に弄れない仕事のとき、ちょっと自宅のUbuntuに入ってざくざくテストする用途。今は、先述のようにTomcatで遊ぶ事を試みたり、Xenを入れて仮想サーバ、などを実験中。
と思いきやMacbookProにVirtualBox入れてCentOS入れた方がデフォルトパッケージでXenが使えてあら簡単とういうオチ、の話はまた今度。



Special Thanks: @sotarok, @rindai87, @tfmagician