2013年3月10日日曜日

CentOS で 宅内 DNS の構築

開発機のアドレスが正しくアサインされてなかったことに気づいてあわててルーターの設定を直していたのですが、そのときにいつも http://192.168.0.1 と打ってまして、これなんとかならないのかなぁと思っておりました。よく使うマシンとかは hosts に書いてるんですが、家には何台かマシンがあり、全部のファイルを管理するのは嫌なので。そこでせっかく Linux マシンがあることだし、宅内用に DNS を構築してみることにしました。

まずはいつものように
# yum install bind

(snip)

Installed:
  bind.x86_64 32:9.8.2-0.17.rc1.el6.3
でインストールします。設定ファイルは /etc/named* と /var/named/* に配置されます。まず /etc/named.conf の options に以下のエントリを追加してローカルネットにのみ使用されるようにします。
        allow-query{
                127.0.0.1;
                192.168.0.0/24;
        };
        allow-recursion{
                127.0.0.1;
                192.168.0.0/24;
        };
        allow-transfer{
                127.0.0.1;
                192.168.0.0/24;
        };
次にLAN内以外の名前解決のため、ほかの(もともと使っていた)DNSサーバーを指定します。うちの場合はルーターを指定すればよいので以下のようになります。
        forwarders {
                192.168.0.1;
        };
さて解決したいアドレス群たちは別ファイルにします。named.conf で directory のところに指定されたディレクトリ、恐らく /var/named になっていると思いますが、そこにファイルを作成することになります。named.conf にはそのエントリだけです。
zone "mydomain.net" {
        type master;
        file "mydomain.net";
};

zone "0.168.192.in-addr.arpa" {
        type master;
        file "0.168.192.in-addr.arpa";
};
です。もちろん mydomain.net はご自分のドメインに書き換えてくださいね。

さてそれぞれのファイル自身の書き方が難しいです。named やら named.conf やらの man を見たんですが見つかりませんでした。このへんを参考にさせていただいて書いてみました。まずは正引き、つまり名前をIPアドレスに変換するほうです。
$TTL 1D
@       IN SOA  server.mydomain.net. root.server.mydomain.net. (
                                        2013030901      ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN NS   server.mydomain.net.
        IN MX 10        server.mydomain.net.
router  IN A    192.168.0.1
server  IN A    192.168.0.2

なにやら呪文のようですが・・・。アドレスの最後の . が結構肝みたいです。このファイル自体が "mydomain.net" 用というのを named.conf で指定したので、省略が利用できます。たとえば @ はそれ自身、つまり mydomain.net そのものの代わりです。また、 . で終わらないもの(上では router とか)は後ろに .mydomain.net がつくと解釈されます。なので、router の行では 「router.mydomain.net を 192.168.0.1 とする」という定義になります。

今度は逆引き、つまりIPアドレスを名前に変換するほうです。記法は基本一緒です。
$TTL 1D
@       IN SOA  server.mydomain.net. root.server.mydomain.net. (
                                        2013030901      ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
        IN NS   server.mydomain.net.
        IN PTR  mydomain.net.
        IN A    255.255.255.0

1       IN PTR  router.mydomain.net.
2       IN PTR  server.mydomain.net.

ここでも同じです。さきほど 0.168.192.in-addr.arpa 用に定義したファイルなので、1 とかは 1.0.168.192.in-addr.arpa を定義したことになります。

これらのファイルが記述できたら、ツールで確認ができます。
# named-checkzone mydomain.net /var/named/mydomain.net 
zone mydomain.net/IN: loaded serial 2013030901
OK
# named-checkzone 0.168.192.in-addr.arpa 0.168.192.in-addr.arpa
zone 0.168.192.in-addr.arpa/IN: loaded serial 2013030901
OK
よさそうですね。いざ起動します。
# service named start
一応 /var/log/message を確認して大丈夫なことを確認して・・ってあれれ?
Mar  9 23:25:37 named[11531]: zone 0.168.192.in-addr.arpa/IN: loading from master file 0.168.192.in-addr.arpa failed: permission denied
Mar  9 23:25:37 named[11531]: zone 0.168.192.in-addr.arpa/IN: not loaded due to errors.
なるほど、ほかのファイルたちは group が named になってるのに私は root のままにしてました。
# chgrp named mydomain.net 
# chgrp named 0.168.192.in-addr.arpa 
# service named restart
今度は無事起動したようです。/etc/resolv.conf のエントリを /etc/sysconfig/network-scripts 等から変更し、ネットワークの再起動をします。確認します。
# nslookup router
Server:  127.0.0.1
Address: 127.0.0.1#53

Name: router.mydomain.net
Address: 192.168.0.1

# nslookup 192.168.0.1
Server:  127.0.0.1
Address: 127.0.0.1#53

1.0.168.192.in-addr.arpa name = router.mydomain.net.

# nslookup www.google.com
Server:  127.0.0.1
Address: 127.0.0.1#53

Non-authoritative answer:
Name: www.google.com
Address: 173.194.38.81
Name: www.google.com
Address: 173.194.38.82
Name: www.google.com
Address: 173.194.38.83
Name: www.google.com
Address: 173.194.38.84
Name: www.google.com
Address: 173.194.38.80

内部のアドレス、外部のアドレスとも問題なく解決されました。あとはこのサーバーをDNSサーバーとしてクライアントに登録するだけで利用できます。

実際に使ってみたところだめでした。 orz
原因の1つめは named.conf をよーく見ると
listen-on port 53 { 127.0.0.1; };

とありました。つまりそのサーバーだけでしか使えなくなっています。 上のテストはサーバー上だったので使えていたのですね。 まずはこれを修正します。 そうしたら一応使えてるっぽいんですが、なぜか1度目は失敗します。
C:\>nslookup www.formula1.com
サーバー:  server.mydomain.net
Address:  192.168.0.2

DNS request timed out.
    timeout was 2 seconds.
DNS request timed out.
    timeout was 2 seconds.
*** server.mydomain.net への要求がタイムアウトしました

C:\>nslookup www.formula1.com
サーバー:  server.mydomain.net
Address:  192.168.0.2

権限のない回答:
名前:    pc-b.bitgravity.com
Address:  64.185.181.238
Aliases:  www.formula1.com
          f1tata.pc.cdn.bitgravity.com
また /var/log/messages に戻ると、大量のエラーが。
Mar 10 00:14:14 named[13184]: validating @0x7fe418008ea0: . NS: got insecure response; parent indicates it should be secure
どうもルーターが dnssec に対応してないようですね。どうせLAN内だから別にいいか。(本当はどうかわからないですが。)/etc/named.conf の dnssec-validation を no に変えたところ無事動きました。

ネットワークの設定はいろいろ大変ですね。ここまでやってようやく http://router でルーターの管理画面に入れたわけですが、そこまでの価値があったのかどうかw まあ自己満足でOKとします。

2013年3月9日土曜日

外でスカパーが見たい(3)

えー、続報ですw

宿泊を予約してたんですが、子供たち用に夕食に「唐揚げ」を追加してくださいとお願いしていたところ、唐揚げとは鶏でしょうかというメールが来ましたw サイトで確認したところ確かにほかの唐揚げもありました。失礼しました。

その返事ついでに「ところでインターネット接続のサービスはありますか?」と問い合わせたところ「無線LANがございます」との返事が!Last one mile もつながりそうです。願わくは 2Mbps ぐらい出てくれるとうれしいですね。

これにて宿泊先からインディの開幕戦を見ることができそうです。最後に宿でAM1時に起きれるかという難問が残ってますけどw

2013年3月6日水曜日

外でスカパーが見たい(2)

続きです。おととい力尽きた時点では
  • ロケーションフリーを起動できた
  • 室内でちゃんと映像が見れることが確認できた
  • 外からは見れないが恐らくルーターが二重になっているせい
という状況でした。 それを解決すべく再度挑戦です。

まずはNTTのルーターの説明書を引っ張り出してきました。なぜか?管理画面に入る方法を思い出すためですw 説明書読んでいたら無事思い出して管理画面に入れました。たしかにこっちのルーターが一番外ですね。さてこのルーターをルーター機能を止めてただのモデムとして使うことができるのか・・・と思っていたら「PPPoE ブリッジ」なる機能を発見。ほほうこれはいけそうですね。そもそもこの機能は最初からオンになっていました。

内側のルーターの管理画面に入り、接続の方法をこれまでの「ローカルルーター」「DHCP」から「PPPoE」に変更します。そして接続をすると

WAN側IPアドレス 223.###.###.###

おおお、プライベートアドレスではなくなりましたね!

ロケーションフリーの管理画面に戻り、NetAV テストというメニューに進むと

「成功」

やりました~。この後 iPhone のテザリングでつないでみましたが、ちゃんと映像を見ることができました。めでたしめでたし。





・・・いまさらですが実は宿泊先にはインターネット接続サービスがないんじゃないか疑惑がw 続報を待て!(待たなくていいですw)

2013年3月4日月曜日

外でスカパーが見たい(1)

突然ですが、さる用事のために3月24日に外泊することとなりました。それ自体は別にいいんですが、問題が起こりました。この日は佐藤琢磨選手が参戦しているインディーカーシリーズの開幕戦の日じゃありませんか!去年もいろいろ興奮させてもらいましたが、今年もテストでトップタイムをたたき出すなど既に興奮気味なのです。なのにその開幕戦がライブで見れないとは!もちろん外泊のほうを調整できれば一番なのですが、来客ですし子供たちの予定も考えるとこの日しかないので・・・。うーむ。

こうなったらここはITで解決しましょう! しかし今回みたいなケースのために何かを買うのもなんなので、ここは戸棚に眠っていたロケーションフリー君を引っ張り出してきました。この製品はもはや伝説的ですよね。捨てないでおいてよかった。

早速接続してみます。無事起動しました。問題はソフトのほうですが、当時はまだ Windows 7 、しかも 64bit などなかった時代なので動かない危険性もありましたが、こちらも無事インストール完了しました。いざ起動!すると「既にほかのコンピューターで登録されています」という表示が。そうか、既に処分したパソコンで使ってたもの、と思ってヘルプを見ると管理画面から削除できるとのこと。よーし、いざログイン・・・パスワードなんて覚えてないです。 orz

困っていろいろ探っていたら、リセットボタンを押せば工場出荷時の状態に戻るとのこと。すばらしい。早速ペン先でリセットして再挑戦。そしてキター!
砂嵐w

もちろんアナログ時代の製品なので今はアンテナつないだとしても映らないわけです。ビデオ入力だけが使えればいいので問題はないですが。無事見れることが確認できました。

次の問題は、外から見れるのか、です。同一ネットワーク内では直接接続できてても外からだとルーターをはさむので必ずしもつなげるとは限らないわけです。それをどう確認するか?昔は emobile やら WiMAX やら持っていましたが、今は持ってないので確認が難しいですね。・・・と思ったら、iPhone があるじゃないですか!テザリングですよ奥さん!(古

このブログ読まれてる方はご存知かも知れませんが、私のは iPhone 4S の SIM フリー版で、SIM には楽天ブロードバンドLTEのものをさしています。なのでいけるはず。モバイルネットワークの設定にインターネット共有という項目があってそこに APN やら何やらを入力します。1つ戻って「インターネット共有」のところで「オン」にすると、パソコンから見えるようになりました。接続すると

来たぜぇ~w

これでパソコンは室内にあるけどネットワーク的には外になりました。いざ接続テスト!・・・だめでした。 orz

当然ポート開けてないからだろ、というのは当然の意見ですよね。はいそうでしょう。ってポート何番だろう。そう思って管理画面に行くと、便利なものがありました。簡単設定なる項目です。なんていい製品なんだ。ここから設定すると勝手にDDNSサービスにも登録してくれて、UPnP なる規格によってルーターにポートを開けてその機器に転送してくれるように設定してくれるんですね(いまさら知ったw)。すばらしいなぁ。接続できたなぁ・・・

いやできてませんでしたw

原因のところに「二重にルーターをはさんでいませんか?」「グローバルIPは割り当てられていますか?」とかいろいろ理由が書いてありました。そんなの当然なんだけどなぁ。ほら、ルーターの設定画面には・・・

WAN側状態

IPアドレス/ネットマスク 192.168.1.2/24

!?はさんでる!ww

引っ越したときにそんな設定にしてたの忘れてました。1つは自分で買ったやつで、そのルーターからフレッツのルーターにつないでたんでした。なんでそうしたんだったかな?ルーター機能がオフにできないとかだっけな?ちょっと記憶が定かではないですが・・・。

というわけで明日以降フレッツのルーターの説明書引っ張り出して再挑戦します。なんとしても見てやる!

2013年2月28日木曜日

CentOS 6 に apache maven を入れてみる

いまさら感のある方も多いかもですが、表題のとおりです。仕事で少し使ってみていまいち使い方がわかりきらなかったので、自宅に導入してみます。どうせ yum でちょちょいだろうと思ったのですが、これがそうもいかなかったのでここに手順を記載。jpackage とかで入れるのもできそうな感じですが、きれいにはいかなそうなので。

さてそもそも apache maven とは何者か。
Apache Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
とあります。つまりざっくり言ってしまえば ant とかで書いてたビルドスクリプトをより便利にできるツールって感じでいいんですかね。まだそれほど使ってないので間違ってる可能性は大ですが。

ではインストールします。公式に飛んでバイナリを落としてきます。今回はこの時点で最新の apache-maven-3.0.5.bin.tar.gz をとりました。Java が必要だそうですが、もちろん既に入っています。公式にあるように /usr/local/apache-maven に展開します。
# mkdir /usr/local/apache-maven
# tar zxf apache-maven-3.0.5.bin.tar.gz
環境変数を指定します。
export M2_HOME=/usr/local/apache-maven/apache-maven-3.0.5
export M2=$M2_HOME/bin
export PATH=$M2:$PATH
これで・・・
$ mvn --version
Apache Maven 3.0.5 (r01de14724cdef164cd33c7c8c2fe155faf9602da; 2013-02-19 22:51:28+0900)
Maven home: /usr/local/apache-maven/apache-maven-3.0.5
Java version: 1.6.0_24, vendor: Sun Microsystems Inc.
Java home: /usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "2.6.32-279.22.1.el6.x86_64", arch: "amd64", family: "unix"
おおお!動きましたね!w

2013年2月16日土曜日

開発機を壊しましたw

えー、文字通りですw

発端はそろそろデュアルディスプレイにしたいなーと思ったことでした。もともとマザボにはデジタル出力2つ(DVI+HDMI)があるんですが、このうちHDMI入力は画面にはつないでないんですが利用してまして(詳細は伏せますw)、 ディスプレイをつなぐとしたらもう1つ出力が必要になるわけです。で、マザボによるとオンボードの出力とビデオカードの同時出力もできそうだったので、安いビデオカードを買ってきて試してみたのです。すると、
まったく映らねぇぇぇ
な状態でした。いろいろ試行錯誤したんですがまったく見える気配もなく。そしてビデオカードを抜いたり戻したりしていたら、急に青画面を出すようになり、その後ははずしても起動せず・・・。

というわけでマザーボードを壊してしまったようです。しかたなく新しいのを買ってきました。サーバーのほうを ASRock にしたせいで両方とも ASRock になってたので、今度は開発機のほうは ASUS の P8H77-V というのを選びました。そして再インストールから行い、無事デュアルディスプレイも完成。今回はせっかく入れなおすので、 UEFI に挑戦。おおお、快適に・・・なった気はしませんが、とりあえず気分でw

これで問題ないと思い少しずつ復旧していたところ、1つだけ問題が。このマシンには GV-D4VR というキャプチャがついてるんですが、これがまったく動いてない。インストール等は普通に終わるんですが、プレビューでも真っ暗、録画押しても0バイトのファイルを作るだけ。これは困りました。心当たりは特にありません。

とかれこれ3時間ぐらい断線を疑ったり出力側を疑ったり実験したんですが問題はなさそうでした。カードがささっているスロットを変えたりしても変化はない。前のパソコンとそうそう変化はないはず・・・と思ったとき1つ思いつきました。もしや UEFI

ググったところ同じ症状を書き込んでる方を見つけました。あー、これはだめだきっと。UEFI をオフにして泣く泣くまた1から入れなおしたところ無事キャプチャできるようになりました。やれやれ。

というわけで、あとはのんびりアプリケーション等を復旧するだけです。マザボが壊れて引きずられてOSもやられただけなので、データは問題なく、インストーラーを必要とするアプリケーションだけ1つ1つ戻すだけです。これはゆっくり進めていきます。

2013年2月10日日曜日

824年に一度

ご無沙汰しております。ツイッター等で既にご存知かもしれませんが、出張からは無事帰ってきました。体調的にはかなり悪くて楽しめたとはいえない出張でしたけどね・・・。出張で土日つぶしてるのに代休とかも取れないとか労 (ry

そんなわけで(?)あまり遊ぶ時間もなく書くネタもなかったのですが、少しだけ。今日ツイッターでこんなツイートが回ってきました。(以下の内容のため一応元は伏せます。)
今月は土曜日、日曜日、月曜日が5日ずつある、824年に一度しかない風水で言う金袋という椿事で・・・(以下略)
ほほう、そんなめでたい月なのですか、と1秒ぐらい思いましたが、今月って2月ですよね。週の連続した3つの曜日が5日ずつあるためには、少なくとも31日ある月じゃないと成り立たない。 しかも土、日、月であるためには当然1日は土曜日である必要がある。今月は1日は金曜日だし、2月なので31日なわけもなく、どちらも満たしてないでしょうよ。

と思って基本スルーなのですが、そもそも感覚的に「1日が土曜日で始まる31日まである月」が824年に一度なわけないのでは?と思いますよね。長い期間で計測したとして、ざっと1日が土曜になる確率は1/7として、そのうち31日である月は1,3,5,7,8,10,12月で7月あるので7/12です。掛け合わせると7/84になり、月のうち実に8.3%の確率で起きます。年単位に直すならば12を掛けて100%、つまりほぼ毎年起きます!?(実際には1/7のとことかがぶれるので起きない年もあるはずです。)

なのでベタに今年から100年前まで数えてみました。もちろん手・・・ではなくコンピューターでw
import java.util.Calendar;


public class CalendarTest {
 public static void main(String[] args) {
  Calendar cal = Calendar.getInstance();
  cal.set(Calendar.MONTH, Calendar.DECEMBER);
  cal.set(Calendar.DATE, 1);
  final int end = cal.get(Calendar.YEAR)-100;
  int count = 0, satisfied = 0;
  int year;
  while ((year = cal.get(Calendar.YEAR)) > end) {
   count++;
   do {
    if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY &&
      cal.getActualMaximum(Calendar.DAY_OF_MONTH) == 31) {
     satisfied++;
     cal.set(Calendar.MONTH, Calendar.JANUARY);
    }
    cal.add(Calendar.MONTH, -1);
   } while (year == cal.get(Calendar.YEAR));
  } 
  System.out.println(satisfied + " years satisfied in " + count + " years");
 }
}
答えは
86 years satisfied in 100 years
という感じでした。つまりそんな月が起きない年は100年中14年、むしろない年のほうがはるかに珍しいですね、といいつつ14%じゃそれほど珍しくもないw

しかし何をどうすると824年なる数字が出てくるんですかね。むしろその数字の原因を探したかったんですが、特にそんなヒントは得られず。適当に選ばれたのかな。