2013/04/28

Raspberry Pi + L-02A + ServersMan SIM (490円SIM) で3G接続

Raspberry Pi(ModelB, Raspbian)を3G回線に接続してみることにしました。

回線は、ServersMan SIM 3G 100 (月額490円SIM)を使います。

通信端末は、RPi界隈においては D02HWがよく使われるようですが、
今回は、docomoのFOMA-USBデータ通信カード L-02Aを使います。安く入手できたので。
(※ 尚、ServersMan SIMは、docomo FOMAのMVNO回線ですので、最近よく売っている Xi端末では利用できません。L-02AはFOMA端末です
【2013/08/08 追記】9月より、ServersMan SIMもXiのMVNO回線 (即ち、LTE)へ移行となるようです。Xi用のデータ通信カードが利用可能となります。)

Raspberry Pi (Model B) + L-02A
加えて今回は、Raspberry Pi上でnginxを起動させ、Webサーバにしてみます。
実用的なサーバを求めているわけではなく、あくまで遊びです(笑)
速度/レイテンシはともかく、動的グローバルIPアドレスが割り当てられるので、一応サーバにも使えます。
(※ DTIはそのような利用目的を推奨していませんし、私もあくまで実験であり推奨しません。自己責任でお願いします。)

【2013/08/08 追記, 2014/04/05 編集】
ServersMan SIM 100がLTEに対応し、ServersMan SIM LTE 100へ移行されることとなりました。
これに伴い、グローバルIPアドレスの提供がなくなり、
プライベートIPアドレスのみとなりましたので基本的にWebサーバなどとしては使えなくなります。
(ngrokなどを使う方法はありますが。)




まずは、WindowsのPCに、SIMカードを取り付けた状態のL-02Aを接続して、一旦設定を行なっておきます。

docomoの接続ツールをインストールします。
接続設定は、Serversman SIMのものを使い、実際に一旦接続してください。
尚、このように一旦設定を行なっておかないと、後から Linux上に接続してponする際、問答無用に"NO CARRIER"でエラーになってしまいました。

次に、Raspberry Piを起動して...
コンソールで apt-getを用いて、"pppconfig"と"eject"をインストールします。
$ sudo apt-get install pppconfig eject

続いて、L-02Aを、Raspberry PiのUSBポートに接続します。

ここで、lsusb コマンドを実行...。
$ lsusb
~~~
Bus 001 Device 007: ID 1004:610c LG Electronics, Inc.
というように、認識されていることがわかります。

ところで、L-02Aは、ゼロインストール機能があるので・・・
接続直後はCD-ROMドライブとして認識される仕様になっています.
$ ls /dev/sr* -la
brw--rw---T+ 1 root cdrom 11, 0 xxx xx xx:xx /dev/sr0
これですね。CD-ROMになっています。

これをEjectすることで、本来のデータカードとして認識されるはず...。
が!しかし...このままejectしても、実際にはうまく行きません。

モデムを/dev/ttyUSB*として認識してほしいところなのですが、
/dev/ttyACM*として認識されてしまいます。

こちらのページによると...。
Ejectを行ったあと、cdc_acmドライバの読み込みが行われるらしいのですが、L-02Aは情報がないため、その読み込みに失敗するそうです。


ですから、対策としてcdc_acmドライバが読み込まれないように設定しておきます。
$ sudo vi /etc/modprobe.d/cdc_acm-blacklist.conf
blacklist cdc_acm

さらに、udevでttyUSB*として認識してもらうための設定をします。
(引用元http://slashdot.jp/journal/491733/ubuntu-9.04-%E3%81%A7-docomo-L-02A-%E3%82%92%E4%BD%BF%E3%81%86 (ありがとうございます!))
$ sudo vi /etc/udev/rules.d/99-foma_l-02a.rules
# for FOMA L-02A
# USB Storage (Zero Installation)
KERNEL=="sr[0-9]*", ENV{ID_VENDOR_ID}=="1004", ENV{ID_MODEL_ID}=="610c", RUN+="/usr/bin/eject /dev/$kernel"

# USB Modem (ttyUSB)
SUBSYSTEM=="usb", ATTR{idVendor}=="1004", ATTR{idProduct}=="6109", RUN+="/sbin/modprobe usbserial vendor=0x$attr{idVendor} product=0x$attr{idProduct}"</del>
これでL-02Aを接続しなおしてみると...。
$ ls /dev/ttyUSB* -la
crw-rw---T 1 root dialout 188, 0 xxx  xx  xxxx /dev/ttyUSB0
crw-rw---T 1 root dialout 188, 1 xxx  xx  xxxx /dev/ttyUSB1
crw-rw---T 1 root dialout 188, 2 xxx  xx  xxxx /dev/ttyUSB2
認識されましたね( ´∀`)b!

続いて、接続設定をします。

pppconfigを実行すると、テキストベースのGUIが表示されます。
$ sudo pppconfig
まずは、[Create]を選択。
尚、都合によりスクリーンショットはターミナルからSSH接続したものですw
  • Provider name:
    ponするときの名前になりますので、適当に入力します。
    ここでは、"serversman_sim100"としました。
  • Number: "*99***1#"
  • Authentication Method: "CHAP"
  • User: "user@3gd.ynmbl.net" → "user@dream.jp" (LTEへの移行にともない変更)
  • Password: "3gd" → "dti"
  • Speed: "115200"
  • Com: "/dev/ttyUSB0"
  • DNS:"Static"を選び、適当にGoogle Public DNSでも登録しておきますw
    ("Dynamic"を選んでも良いはずなのですが、何故かうまくいかなかったので・・・。)
    • Primary: 8.8.8.8
    • Secondary: 8.8.4.4
最後に "Finished"を選択して、接続設定は完了です。

あとは、ponコマンドで接続するだけです。 (ちなみに切断するときは、poffコマンド。)
$ sudo pon serversman_sim100
これで接続されます。
尚、接続中は、L-02Aのランプ(下側)が青色に点灯します。

接続できているか、確認してみましょう。
$ ifconfig -a
ppp0 Link encap:Point-to-Point Protocol
    inet addr:xx.xx.xx.xx  P-t-P:10.64.64.64  Mask:255.255.255.255
    UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
    RX packets:xxxxx errors:x dropped:0 overruns:0 frame:0
    TX packets:xxxxx errors:x dropped:0 overruns:0 carrier:0
    collisions:x txqueuelen:x 
    RX bytes:xxxxxx (xxx.x KiB)  TX bytes:xxxxxx (xxx.x KiB)
グローバルIPアドレスが割り当てられている事が確認できます。

pingも通るようならOKですね。
$ ping google.com
さらに、自動接続できるようにしておきます。
$ sudo gpasswd -a pi dip
$ vi /etc/local.d
~~~~
pon serversman_sim100

exit 0;
接続は以上です。

...おっとw サーバにしてみよう!ということでしたね ( ゚д゚)!

とりあえず、ファイアウォールの設定を。
いつも通りにiptableを直接使ってもいいのですが、Raspbianですし、手軽にufwで。
$ sudo ufw default DENY
$ sudo ufw allow 80/tcp
$ sudo ufw enable
あとは、nginxをインストールしてお茶を濁しておきます(笑)
$ sudo apt-get install nginx
$ sudo service nginx start

これで、他のPCのブラウザから、L-02Aに割り当てられたグローバルIPアドレスにアクセスすることで、Raspberry Pi上のHTTPサーバにアクセスができます!
歴としたWebサーバの完成です∩( ・ω・)∩!w

もちろん...このIPアドレスは変動しますので、一般的な自宅サーバなどと同様に、DDNS (MyDNS.jpなど)のお世話になると良いかと思います。
また、DDNSへのIPアドレス登録には、DiCEを使わせてもらってもいいのですが、今回はもっと簡単に、”数分ごとにIPアドレスの変動をチェックしてDDNSにIPアドレス登録を行う”ようなスクリプトを書きました。

あとは切断された時に自動接続するスクリプトを書いてcrontabに入れておくとか...。
perlでゴリゴリしてみるとか、Webカメラをつないでネットワークカメラ代わりにしてみるとか、何かおもしろいセンサーをつけてみるとか...
(Raspberry Piは普通にLinuxですので大概何でもできてしまいます。夢が膨らみますね(>ω<)♪ww)

※ 最後になりましたが、前もって当然のことながら、SSH等は別途必要に応じて適切に設定しておいてください。(パスワードログインを無効化して公開鍵認証にするとか、ポート変更をするとか....その他諸々。)

2013/04/08

Google+風のフィードバック(ご意見・ご感想)機能を実装できるライブラリ

ちょっと旬からは遠ざかった気がしますが...
Google+風のフィードバック(ご意見・ご感想)機能を実装したいな〜と思い、
既存のものがあったはず...と探してみましたので、メモ程度にまとめておきます。

画面右下等に表示された"フィードバック(ご意見・ご感想)"ボタンをクリックすると、
DOMのスクリーンショットをブラウザ上で作成して、文章に添付して問い合わせできるアレです。
尚、これらのライブラリは、フィードバックの作成・送信までを行うのみですから、
バックエンド側の実装は別途行う必要があります。
(ちなみにGoogle公式では、Google Feedbackというシステムになっており、管理まで包括的に行えるようです。これが一般に開放されると、とても便利になると思うのですが。)

feedback.js
http://experiments.hertzen.com/jsfeedback/
サンプル: http://experiments.hertzen.com/jsfeedback/examples/combination/index.html
feedback.jsのサンプル。
ハイライト、塗りつぶしともに動作しました。
dom-feedback
https://github.com/jankuca/dom-feedback
サンプル: http://jankuca.github.io/dom-feedback/example/
dom-feedbackのサンプル。
しかし、私の環境ではうまく動作しませんでした。 (Google Chrome 24.0)
jQuery.sendFeedback
https://github.com/Chevex/jQuery.sendFeedback
サンプル: http://mugifly.site44.com/masanoriprog/2013-04-08_web_feedback/jquery.send_feedback/index.html
こちらは、その名のとおり、jQueryプラグインになっています。
jQuery.sendFeedbackのサンプル。
枠を描画する機能はあるものの、ハイライトや塗りつぶしは無いようです。

個人的な感想としては...今のところ、feedback.jsが最も実用できそうな感じですね。

もちろん、いずれもオープンソースですので、Pull Requestを送ったり、
これを参考にさせてもらって自分で実装するなりしても良いと思います。
(ちょうど、feedback.jsの開発者の方が公開してくださっている html2canvas を使えば、
クライアント上でJavaScriptのみでのスクリーンショット生成が簡単に行えます。)


また、有償のWebサービスですが、次のようなものもありました。

Webサービスのカスタマサポートなどに使うのであれば、検討してみても良さそうです。

2013/03/04

CPAN Testersになろう

先日、Kansai.pm ミーティングに参加して開発意欲をいただいた事もあり...
簡単なCPANモジュールを幾つかリリースしました(>ω<)/(笑)
(今まで自前のperlモジュールは作っていましたが...CPAN公開は初で...。これで私も、一応CPAN Author(><;))

さて、今回の記事は、お世話になっているCPANやCPAN Authorの皆さんに
何か僅かでも恩返し(?)を...ということで "CPAN Testersになろう!"です。

CPAN Testersというのは、CPANで公開されているモジュールのテストを行い、
レポートする活動 および CPAN上で公開されているテスト情報のことです。
新着モジュールを自ら or プログラムでチェックして積極的にレポートを送ってくださる方もいらっしゃるようです。
CPAN Testersや、perlのテストについては、Perlにおけるテストの概要/TAPとは?:Happy Testing Perlを参照させてもらいましょう。
search.cpan.prgなどで見かける、この表記。
PASS (24)は、テスト通過したレポートが24件投稿されているということ。
View Reportsをクリックすると詳細へアクセスできる。

今回は、自らのPCでCPANモジュールをインストールする際に
自動的にテスト結果をレポートするよう設定します。
・・・といっても、とても簡単です。

まずは、CPANシェル(or cpanm)で
Task::CPAN::Reporterをインストールします。

$ cpan Task::CPAN::Reporter
次に、CPANシェルでレポートのための設定を行います。
$ cpan
> o conf init test_report

Generate test reports if CPAN::Reporter is installed (yes/no)? [no] yes
Would you like me configure CPAN::Reporter now? [yes]


email_from? [] Taro Yamada

edit_report? [default:ask/no pass/na:no]

send_report? [default:ask/yes pass/na:yes]

transport? [Metabase uri https://metabase.cpantesters.org/api/v1/ id_file metabase_id.json]

Would you like to run 'metabase-profile' now to create '/home/xxxx/.cpanreporter/metabase_id.json'? [y]

Enter full name: Taro Yamada

> o conf commit
> exit
(基本的に表示のとおり進めるだけで終わります。最後に、o conf commitして、exit。)

これで完了です。
(以前はEメールの設定をして...というのが必要だったのですが、執筆現在試したところによると、不要になっているようです。)

試しに・・・CPANシェルでモジュールを何かインストールしてみてください。
※ 尚、cpanmはレポートには使えませんので、通常のCPANシェルを使います。

例えば、拙作の WebService::Zussar あたりは軽くて試すのにもってk(←←
$ cpan WebService::Zussar
~~~~
CPAN: CPAN::Reporter loaded ok (v1.2009)
Created MYMETA.yml and MYMETA.json
Creating new 'Build' script for 'WebService-Zussar' version 'v0.0.3'
(/usr/bin/perl Build.PL  exited with 0)
CPAN::Reporter: Build.PL result is 'pass', No errors.
Building WebService-Zussar
(./Build exited with 0)
CPAN::Reporter: Build result is 'pass', No errors.
  MUGIFLY/WebService-Zussar-v0.0.3.tar.gz
  ./Build -- OK
Running Build test
# Testing WebService::Zussar 0.0.3
t/00.load.t ................. ok
t/01.fetch_event.t .......... ok
t/010.online_fetch_event.t .. ok
t/02.fetch_event_user.t ..... ok
All tests successful.
Files=4, Tests=37,  2 wallclock secs ( 0.05 usr  0.01 sys +  0.83 cusr  0.11 csys =  1.00 CPU)
Result: PASS
(./Build test exited with 0)
CPAN::Reporter: Test result is 'pass', All tests successful.
CPAN::Reporter: preparing a CPAN Testers report for WebService-Zussar-v0.0.3
CPAN::Reporter: sending test report with 'pass' via Metabase
MUGIFLY/WebService-Zussar-v0.0.3.tar.gz
./Build test -- OK
Running Build install
Building WebService-Zussar
Installing /home/xxxxxx/perl5/lib/perl5/WebService/Zussar.pm
Installing /home/xxxxxx/perl5/man/man3/WebService::Zussar.3pm
  MUGIFLY/WebService-Zussar-v0.0.3.tar.gz
  ./Build install  -- OK
こんな感じで、テスト結果のログがCPANに自動送信されます。
CPAN上に反映されるには数時間〜数日かかりますが、
これだけで、自分の環境でテストを行なってレポートできます。

レポートされたテスト結果は
search.cpan.orgや、metacpan.orgの各モジュールのページからアクセスできます。
モジュールのために徹底したテストを書くということ、また、CPANを中心として、テスト環境が広く、レポートするコミュニティが確立しているということは、perlの一つの文化とも言われています。

大抵、幅ひろい環境でのテスト結果が集まることは、良いことだと思いますし、
私たちも何かしらの形で、少しでも協力できるといいですね♪

2013/02/24

Kansai.pm 第15回ミーティングに行ってきた&初LTさせてもらった

今日は、Kansai.pm 第15回ミーティングに行ってきました。
さらに図々しく、はじめてのLTもさせていただきました
主催者の若林さん(@nqounetさん)や懇親会主催者の@__papix__さんに
あらためてお礼申し上げます。ありがとうございました。 m(_ _)m♪

会場は大阪富国生命ビルにあるYahoo!さんのセミナールームでした!

早速、感想と反省文を書きたいと思います ><

私にとって今回が初の勉強会なのですが、まず...なんといっても...
刺激を受けることができ、開発意欲があがりましたw
(でも事実、自分の勉強の無さと浅さが...身に染みました...(;´д`)…。)
特に印象に残った発表を、書いていきたいと思います。

"「Webサービスのつくり方」のつくり方" @yusukebe さん

(えっと、まず、○ノアールやコメ○はノマドワークに最適という情報がww なるほどw)
http://www.slideshare.net/yusukebe/web-16710062

書籍 "Webサービスのつくり方" を執筆された話+もっと言いたかった事 でした。
この本は、perl本からのテーマ変更を経て、3年越しに実現された夢なのだとか...。
perlを使ったWebプログラミングの仕方ではなく、
自分たち(極少人数チーム)でWebサービスを立ち上げるお話になっていて...
Webサービスをいかに生み出し、それがどれだけ楽しいことか!”を教えてくれる本だそうです。

まだ私自身、この本は、Amazonのなか見検索でぱらっと見て、
目次を読んで....おもしろそうwwwと思って、ウィッシュリストに追加していた状態だったので...持っていないのです...。早速入手して読もうと思います。
(そして...読んでみたら?と本気で友人に推したい・・・。(切実))

原稿を執筆する際にMarkdownで書いてDropboxで共有管理していたこと。
Dropdownという自作アプリで原稿をHTML化して共有していたこと...。
(ちょうど、自分のLTネタでText::Markdownをにわかに使わせていただいたこともあって、タイムリーだなぁ〜...しかしアイデアが自分とは違うなぁ....(´・ω・`)とも思ったり...)

運営会社となるオモロキを立ち上げた際の話も勉強になりました。
  • 話し合いルールを暗黙の了解で。
    • みんながリーダーシップを発揮する。
    • 打ち合わせをダラダラしない。
    • 最初はメンバーの意見を否定しない。
    • マネタイズは後から。
楽しくやるのが一番.
私もやはり、そういうウェブ開発を仲間とやりとげたいなぁ...。
(ちなみに、ボケての開発はバックエンドはyusukebeさん 1人なのだとか。
プロジェクト的な
人数は7人、タイアップ企画などは3人とかで、その方がやはり意思決定が高速なのだそうです。ふむふむ。)

あと...yusukebeさんはMojolicious推しだということで!
  • Modelが不可知なのが良い
    (私も、好きなCPANモジュールを使おうという気楽さが好きです。)
  • MVCモデルで、PC/モバイルサイトを分けるときも、Modelにビジネスロジックを実装して共通化できるということ。
  • Modelの構造の組み方 (バックエンドのデータベースへのモジュール構造)も事例紹介がありました。
    (実際、私も迷っていたりするので...こういう事例はとてもありがたいんですw)
  • "Mojolicious本をKindle出版で出したい"という話も。めちゃくちゃ期待!
サーバの運用についての話もありました。
  • 当初はVPSで運用していたそうですが、VPSは2台程までがベスト
    それ以上はAWSなどクラウドのほうが良いとのこと。
    (なぜなら、管理も面倒だし、スケールするのに支払いの手間と時間が...。確かにめんどくさいですね...。)


"コピペと闘う (perlコピペコード検出器)" goccy さん


perlのソースコードを、独自のパーサで解析し、
ソースコードのコピペ(重複)部分を検出できるツールです。
検出結果はブラウザ上でもできて・・・コードに対して点数が表示され、
グラフという形で視覚的に閲覧できるというスグレモノでした。(しかも解析が高速。)

今回は、Mojoliciousと、Catalystのコードを例にして解析。
(うわっ!Riedelさ〜んwww!!>< )
Namespaceごとに解析が行われて、10秒ほどで、検出された行が出力されました。

それにしても、"Only perl can parse Perl"という言葉があるように、
Perlの構文解析は他言語より格段に難しいのですが...
そのパーサを作られたことがまずすごいww
(Perlのパーサ開発は正規表現まわりが特に辛いのだとか。この方はmixiでお仕事されているそうで。
パーサ書いちゃうってスゴイ!!のに...さらにすごい人がいっぱいいるとか...。mixi恐るべし。

ちなみに、mixiはNamespaceごとに開発してるので、問題があったNamespaceごとに、その担当グループにリファクタリングをお願いするんだそうです。)


"Cinnamon (simple deploy tool)" @shiba_yu36 さん


Capistranoがややこしいということで作られたデプロイツールだそうです。
シンプルで設定も楽、DSLで書けるぞ!!ということです。
https://github.com/kentaro/cinnamon

サンプルがこれ。
https://github.com/shibayu36/cinnamon-deploy-sample
(サーバの起動、再起動、最新状態の反映、依存モジュールのインストールなんかがサッと実行できます。)
任意のコマンドを実行するようになっているので、応用が効きそうですね。

Role=対象サーバ、Task=処理(実行したい任意のコマンド群) を定義し...
$ cinnamon production update
例えば、これで、productionなサーバに対して、アップデートTaskが一括実行できると。

実は...私、デプロイツールという言葉は知っているものの、
実際に使ったことは無かったのです。この機会に早速使ってみたいと思います。
(私など、単純に2台目以上ある〜などで、もうめんどくさくなるタイプですしw
ちなみに...あんまり”デプロイツール”を使っている人はいらっしゃらないようでした。・・・だけど、もう使わない手は無い。便利そうです。)

でも、shiba_yu36さんが言うに、
Capistranoも本当に使いこなせれば、やっぱり相当便利に使えてるのだけど、そこまでなかなか...なのだとか。



他のトークやLTも興味深いもの、面白いものがありましたww

Perl Ocean、既存や開発中のサービスにも連携したチャットサービスなどを容易に組み込めそう。
→ http://www.slideshare.net/lapis25/kansaipm15-perl-ocean

PerlはAcmeも楽しいですね!!エラーメッセージをネコにしたいwww

Unicodeな話は...私にはちょいと難しかったです(´;ω;`)

DBIx::Letency、O/Rマッパのベンチマーク!
Kansai.pmでORMのパフォーマンスチェッカの構想についてLTしてきた - ゆううきブログ
(それにしても、私のと比べものにならないくらい...役に立つ思い付きだ...。
私、若干気になるとか言いつつも他人ソース任せでしたから・・・自分でやるのは大切ですね。)


MTをCMSとしてもっと活用する。
プラグインが豊富 (&比較的難しくなく作れるらしい)
→ 一例: https://github.com/ogawa/mt-plugin-Minifier

あと、Kansai.pmの活動と、Perl入学式の話など。
特に今期(4月から)のPerl入学式には友人を誘って行ってみたいなぁ...という希望と、私も何かお手伝いできたらなぁ...と思ったり。


あ、ちなみに・・・私のLTネタは...
"半日で Markdown+SQLite3なWiki を作ってみた"でした。
普段使っているWikiクローンがMarkdownで書けないということで、そのまま話にした感じです。

約半日で、Markdown Wikiとしての基本機能は実装できました。CPANモジュール様々です! (認証機能こそ無いですが、世代管理や衝突チェックは実装済み。)

ひどいコードですが...(拙作 mojo_template についている、OAuth認証の残骸を残していたり)
https://github.com/mugifly/LtWiki

でも、Markdownのperl製Wikiクローンって見かけませんし、
SQLiteデータベースを使うものはさらに無いと思うので・・・
また時間がかかってもマトモなWikiに作り直せたらなぁ...と思ったりしています。
尚、安全性を考えた上でサンプルを一時的に公開していますが、さっさと認証機能実装して差し替えます。

まず反省から書くと・・・
  • 実は当初、ふつうにGoogle Driveのプレゼンテーションで作成していたのですが、どうもPreziが気になって...作りかけていたのを丸ごと捨ててww、初めてPreziを使いました。が、まだ自分でうまく扱えなくて...動きすぎ...見づらかったですね...。
  • ともかく、適切でない表現があったり、話す内容がまとめられていなかったりとプレゼンという面でも反省点は多かったです。内容も悪ふざけが...すみません。初なのにこのようなLTになってしまって。(また、perl本をもっと出してほしいなどと偉そうなことを言ってしまい申し訳ありませんでした。初心者故の希望です...。)
スライドを張っておきます:


それと...今回、boketeのステッカーをいただきましたw
早速、PCに貼っておきます。

あと、LTのドーナツ美味しかったです!ww

懇親会も楽しかったです。
私みたいなショボい学生ですが....。何より、エンジニアの方と話せて良かった!!
(内心、Webサービス系企業の興味が...。企画も....バックエンドも...やりたいな...。)

以上。勢いでガガッと記事を書いたら、長くなってしまいましたww
※間違い、勘違い等ありましたら、ご指摘をお願い致します。

紹介いただいたもの(特に気になったもの)は、休み中に試していけたらな〜と思います。

参加された皆さん、ありがとうございました m(_ _)m♪
次回もぜひ参加したいです。今度は...もっと勉強を深めていきます...。
(...マトモなCPANモジュールも一つでも思いついてリリースできれば...。)

p.s.
ここまで書いて、気づきましたw! 写真が一枚もないorz
カバンにコンデジ(S110)入れて持っていったのになぁ。...私としたことが。

[2013/02/24 12:00 一部追記]

2013/02/18

Jenkinsのスレーブノードを追加してみた

先日の記事(Hello, Jenkins. GitLab+Jenkins+perl(Mojolicious)でCIをしてみた)では
GitLab(Gitolite)を使っている環境に、Jenkinsをインストールして、
CIのためのシステム構築を行いましたが...
さらに他のマシンをスレーブとして追加することで、ビルドの負荷分散ができます。

今回は新しいVPSにもJenkinsをインストールして、スレーブにしてみました。
この記事では、スレーブを構築&設定する手順を、書いておきます。(自分用メモとしてw)
  • スレーブ側では、Jenkinsサービスを起動しておく必要はありません。
  • ビルドを行う度に、マスターのJenkinsがSSHを介してスレーブのシェルに接続し、スレーブ上のJenkinsの"スレーブエージェント"を実行する仕組みです。(sshを介して通信するので、特に両者間でVPNを張る必要もありません。)
    参照: Distributed builds - 日本語 - Jenkins Wiki
  • 今回、CIを行う対象のプロジェクトは、マスター上のGitLab(Gitolite)にリポジトリがあるものとします。(先日の記事の続きなので。)
尚、今回は鍵を2つ作成することになります。
  • [マスター側で作成する鍵] カギA  - 手順3で作成
    • マスターのJenkinsが、スレーブに接続するため の鍵。
    • 作成されたカギの公開鍵は、スレーブのauthorized_keysに登録します。
  • [スレーブ側で作成する鍵] カギB  - 手順5で作成
    • スレーブのJenkinsが、Gitリポジトリに接続するため の鍵。
    • 作成されたカギの公開鍵は、GitlabもしくはGitoliteに登録します。
(※ もっと良い手順がありましたら、ご教授お願いします!)


  1. [スレーブ] Jenkinsをインストール。
    (先日の記事 "Hello, Jenkins. GitLab+Jenkins+perl(Mojolicious)でCIをしてみた" を参照のこと。jenkinsサービスを開始する必要はありません。)
  2. [スレーブ] JREをインストール。
  3. [マスター] カギAを .sshディレクトリ(/var/lib/jenkins/.ssh/)に作成。
    $ sudo -u jenkins ssh-keygen
    > /var/lib/jenkins/.ssh/id_rsa_con_slave
  4. (マスター側の.sshディレクトリには既に、マスター自身のJenkinsが Gitリポジトリに接続するための鍵があるわけですので、今回は別の名前にします。)
  5. [スレーブ] カギAの公開鍵(id_rsa_con_slave.pub)の中身を、スレーブ上のJenkinsユーザのauthorized_keys (/var/lib/jenkins/.ssh/authorized_keys) に記述。
    $ sudo -u jenkins vi /var/lib/jenkins/.ssh/authorized_keys
    ssh-rsa ~~~~ jenkins@xxx
    ※ 但し、jenkinsユーザは、/etc/passwd上 で /bin/falseに設定されているので、/bin/bashに変更する。
    もしくは、他のユーザを作成する。(セキュリティ的には後者のほうが安全...か?)
  6. $ sudo -u root vi /etc/passwd
    ~~~~
    jenkins:x:xxx:yyy:Jenkins Continuous Build server:/var/lib/jenkins:/bin/bash
  7. [スレーブ] カギBを .sshディレクトリ(/var/lib/jenkins/.ssh/)に作成。
    $ sudo -u jenkins ssh-keygen
    > /var/lib/jenkins/.ssh/id_rsa
  8. [スレーブ] カギBをGitリポジトリへの接続に使えるよう、.ssh/configに記述。(先日の記事でのマスター側と同様。)
    $ sudo -u jenkins vi /var/lib/jenkins/.ssh/config
    Host example.com
        User gitolite
        Port xx
        Hostname example.com
        IdentityFile /var/lib/jenkins/.ssh/id_rsa
  9. [クライアント] カギBの公開鍵(id_rsa.pub)の中身を、GitLab(もしくはGitolite)のJenkinsユーザのSSH鍵に登録。
    (GitLabを使っているならば、先日の記事と同様に、Webブラウザからjenkinsアカウントでログインして、SSH Keys画面から鍵の追加を行います。)
  10. [スレーブ] known_hostsにGitリポジトリサーバの情報を登録するために、一旦、手動でgit cloneをします。
    $ cd /var/lib/jenkins/
    $ sudo -u jenkins git clone ssh://gitolite@example.com:xx/hoge.git
    > Are you sure you want to continue connecting (yes/no)? yes
    $ sudo -u jenkins rm hoge/ -R
    (cloneしてくるリポジトリは、jenkinsアカウントでgit cloneできるものなら何でもOK。cloneされたディレクトリは、すぐに削除して構いません。)
  11. [クライアント] マスターのJenkinsのノード管理画面で、ノードを追加する。

    • "ノード名": 適当
    • "同時ビルド数": 適当 (スレーブのコア数にするのが妥当)。
    • "リモートFSルート":  "/var/lib/jenkins/"
    • "起動方法":  "SSH経由でLinuxマシンのスレーブエージェントを起動"
    • "ホスト": スレーブのホスト名 or IPアドレス
    • "ユーザ名": "jenkins"
    • "ポート" スレーブのSSHデーモンのポート
    • "秘密鍵":  カギAの秘密鍵 ("/var/lib/jenkins/.ssh/id_rsa_con_slave")
  12. [スレーブ] 各プロジェクトのビルド環境を構築する。
    とりあえず手順9まで終えて、ビルドを実行してみると、まだ失敗することがわかると思います。
    ですので、例えば perlのプロジェクトをCIするのであれば、cpanmのインストールなり、perlのモジュールインストールなりを行います。先日の記事の後半どおり、マスター側と同様。
といった感じです。

スレーブ側では、JenkinsのWeb画面での設定も、ジョブ作成も必要ありません。
その都度、マスターのJenkinsがスレーブへ自動的に転送してくれます。

尚、さらに2台目、3台目のスレーブ...と追加していく場合には、
この記事の手順3は不要ですね。

2013/02/16

以前に作ったUNIX系サーバ用バックアップスクリプト (AmazonS3対応)

以前に作った"UNIX系サーバ用バックアップスクリプト"を公開しました。
任意のディレクトリとMySQLデータベースを、Amazon S3へバックアップできます。
一応、世代管理が可能です。また、ファイルは SquashFSでアーカイブされます。

ちょっと昔に必要に迫られて作ったものだったので...。
かなりのやっつけ仕事で...汚すぎるソースコードですが、一応、今もきちんと動きますので、公開することにしました ヘ(゚∀゚ヘ)w (CentOS 6.3で動作確認済。)
squashfs-tools と perlがあれば動きます。

https://gist.github.com/mugifly/4966246

改造してサーバのcrontabに登録するなり、印刷してゴミ箱にダンクするなり...
よろしければ、ご自由にどうぞ( ´∀`)b


このとおり、Gistに置いておきます。

2013/02/15

VPS複数台をL2TP/IPSec(xl2tpd+openswan)で接続 on CentOS 6

複数台のVPS(さくらのVPS)を、L2TP/IPSecでVPN接続することにしましたので、
自分用メモとして記事にします。今回は、とりあえず2点間接続を行います。
尚、3点間以上も同じ手順でクライアントを追加していくだけです。
(ちなみに目的は、MongoDBでReplicaSet、Shardingを行う為だったりしますw)
  • L2TPの実装: xl2tpd
  • IPSecの実装: openswan
    (昔はFreeS/WanというIPSecの実装があったそうですが、開発が止まっていて・・・。
    そこから派生して現在の主流となっているのが、openswanなんだそうです。なるほど。
サーバは、さくらのVPS (Cent OS 6.x 64bit) です。

記事の内容は試行錯誤の結果であり、間違っている可能性もあります。
もしご指摘、アドバイス等ありましたら、よろしくお願いします m(_ _)m

今回、以下の内容については、
を参考にさせていただきました。(感謝です!! m(_ _)m♪!)


まず、サーバ/クライアント共通の環境構築から。


はじめに、必要なパッケージをインストールします。
既に入っているものも多いかと思いますが...念の為。

$ sudo yum install gcc gmp gmp-devel flex bison libpcap-devel ppp
ところで、この記事では行いませんが・・・
openswanは
NSS(Mozillaによる証明書ライブラリ)による証明書認証に対応しています。後々から証明書に対応できるよう、NSSをインストールしておきましょう。
$ sudo yum install nss nss-devel nss-tools
(実際のところ、VPNを実運用するには、文字列だけでの認証では心許ないです。)

次に、openswanをソースコードからビルドしてインストールします。
(執筆時の最新版は、openswan-2.6.38です。 Amazon S3から配布されているんですね〜。
また...余談ですが、
openswanのサイトには自己署名の証明書が使われているようで、SSLエラーとなりました。ご注意を。)
$ wget https://s3-ap-northeast-1.amazonaws.com/openswanjp/openswan-2.6.38.tar.gz
$ tar zxf openswan-2.6.38.tar.gz
$ cd openswan-2.6.38/
ここでも、後々から証明書を使えるようにNSSサポートを有効にしておきましょう。
ドキュメント(docs/README.nss)によると、Makefile.incのオプションを弄るそうです。
$ vi Makefile.inc
~~~~
# Support for NSS crypto library (does not requires HAVE_THREADS)
# USE_LIBNSS uses pthreads by default.
USE_LIBNSS?=true
~~~~
(372行目付近に2箇所ありますが、USE_LIBNSS?をtrueにしておきます。)

あとはmakeしてインストールです。
$ make programs
$ sudo make install
次に、xl2tpdをビルドしてインストールします。
(執筆時の最新版は、xl2tpd-1.3.1です。ちなみに...EPELリポジトリからインストールする方法もありです。)
$ cd ..
$ wget https://github.com/xelerance/xl2tpd/archive/v1.3.1.tar.gz -O xl2tpd-v1.3.1.tar.gz
$ tar zxf xl2tpd-v1.3.1.tar.gz
$ cd xl2tpd-1.3.1/
$ make
$ sudo make install
さらに、起動用のコマンドをコピーしておきます。
$ su
# cp packaging/fedora/xl2tpd.init /etc/init.d/xl2tpd
# chmod +x /etc/init.d/xl2tpd
(※以降、シンタックスハイライトの都合上、コマンド文の色が黒色ですが、特にお気になさらずに(汗;))
また、/usr/local/sbin にインストールされたので、/usr/sbinからリンクを張ります。 
 # ln -s /usr/local/sbin/xl2tpd /usr/sbin/xl2tpd
サービスも登録しておきます。
 # chkconfig --add xl2tpd
# chkconfig --add ipsec
# chkconfig xl2tpd on
# chkconfig ipsec on
これでインストールは完了です。
(ここまで、サーバ側、クライアント側ともに同じです。)




次に、サーバ側の設定です。


まず、xl2tpd(L2PT)の設定を行なっていきます。
# mkdir /etc/xl2tpd
# cp examples/xl2tpd.conf /etc/xl2tpd/
# cp examples/ppp-options.xl2tpd /etc/ppp/options.xl2tpd
# vi /etc/xl2tpd/xl2tpd.conf
~~~~
[global]
[lnsdefault]
;ip range = 192.168.1.128-192.168.1.254
ip range = 192.168.253.128-192.168.253.254
;local ip = 192.168.1.99
local ip = 192.168.253.1
name = %L2TPNAME%
require chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
(%L2TPNAME%は適当に。以降使っていきます。
ここで指定したip rangeの範囲が、VPN上でクライアントに割り当てられます。
またlocal ipがVPN上でのサーバのプライベートIPアドレスとなります。)
# vi /etc/ppp/options.xl2tpd
name %L2TPNAME%
ms-dns ns1.dns.ne.jp
ms-dns ns2.dns.ne.jp
#ms-dns 192.168.1.1
#ms-dns 192.168.1.3
#ms-wins 192.168.1.2
#ms-wins 192.168.1.4
#noccp
auth
nobsdcomp
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
persist
#proxyarp
connect-delay 5000
refuse-pap
refuse-chap
require-mschap-v2
logfile /var/log/xl2tpd.log
(ns*.dns.ne.jpは、さくらのDNSです。それ以外のDNSサーバを使っている場合は、変更してください。
ただし、今回の場合、ms-dnsは要らないかもしれないです・・・。
 pppの各オプションの意味はググって
ドキュメントを探すか、man pppdで参照できます。)

chap-secrets(ユーザ認証)の設定も行います。
また大事なファイルなので、root以外の閲覧ができないよう権限を設定します。
# vi /etc/ppp/chap-secrets
"%USERNAME%" "%L2TPNAME%" "%CHAP-PASSWORD%" *
(%USERNAME%%CHAP-PASSWORD%も適当に。といっても管理は大切に。)
# chmod 600 /etc/ppp/chap-secrets

次に、openswan(IPSec)の設定を行なっていきます。
# vi /etc/ipsec.conf
version2.0

config setup
    dumpdir=/var/run/pluto/
    nat_traversal=yes    virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
    oe=off
    protostack=netkey
    nhelpers=0
    plutostderrlog=/var/log/pluto

include /etc/ipsec.d/l2tp-psk.conf
次に、Pre-shared Key(共有鍵)の設定も行います。
また、こちらも大事なファイルなので、権限設定します。

# vi /etc/ipsec.secrets<
%SERVER-IPADDRESS% %any : PSK "%PSK-PASSWORD%"
(%SERVER-IPADDRESS%は、サーバのグローバルIPアドレスです。)
# chmod 600 /etc/ipsec.secrets
さらに、L2PTを扱う設定も行います。
# cp /etc/ipsec.d/examples/lt2p-psk.conf /etc/ipsec.d/
# vi /etc/ipsec.d/l2tp-psk.conf
conn L2TP-PSK-NAT
    rightsubnet=0.0.0.0/0
    also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
    forceencaps=yes
    authby=secret
    pfs=no
    auto=add
    keyingtries=3
    rekey=yes
    dpddelay=40
    dpdtimeout=130
    dpdaction=clear
    ikelifetime=8h
    keylife=1h
    type=transport
    left=%SERVER-IPADDRESS%
    leftnexthop=%defaultroute
    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any

#conn passthrough-for-non-l2tp
#    type=passthrough
#    left=YourServerIP
#    leftnexthop=YourGwIP
#    right=0.0.0.0
#    rightsubnet=0.0.0.0/0
#    auto=route
最後に、sysctl.confを変更します。
# /etc/sysctl.conf
~~~~
#net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1
~~~~
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
# sysctl -p
あとは起動して・・・<
# service xl2tpd start
# service ipsec start
動作確認を行います。
# ipsec verify
エラーが出ていなければ、とりあえず問題ないということで。
iptablesも設定しておきます。
# vi /etc/sysconfig/iptables
*filter
~~~~
-P FORWARD DROP
-A INPUT -p udp -m udp --dport 1701 -i eth0 -d %SERVER-IPADDRESS% -j ACCEPT
-A INPUT -p udp -m udp --dport 500 -i eth0 -d %SERVER-IPADDRESS% -j ACCEPT
-A INPUT -p udp -m udp --dport 4500 -i eth0 -d %SERVER-IPADDRESS% -j ACCEPT
-A FORWARD -i ppp+ -o ppp+ -s 192.168.253.0/24 -d 192.168.253.0/24 -j ACCEPT
-A FORWARD -i ppp+ -o eth0 -s 192.168.253.0/24 -j ACCEPT
-A FORWARD -i eth0 -o ppp+ -d 192.168.253.0/24 -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
*nat
-A POSTROUTING -s 192.168.253.0/24 -j MASQUERADE
COMMIT
(参考元: http://www.manabii.info/2012/08/debian-gnu-linux-l2tp-ipsec-vpn-nat.html)
また、必要に応じて、VPN間でアクセス可能なポートなどを設定するといいかもしれません。


# service iptables restart
これでサーバ側の設定は完了です。


さて...次はクライアント側の設定です。


まずは、xl2tpd(L2TP)の設定を行なっていきます。
# mkdir /etc/xl2tpd
# cp examples/xl2tpd.conf /etc/xl2tpd/
# vi /etc/xl2tpd/xl2tpd.conf
[global]

[lac L2TP1]
lns = %SERVER-IPADDRESS%
require chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd.conn-1
length bit = yes

;[lns default]
;ip range = 192.168.1.128-192.168.1.254
;local ip = 192.168.1.99
;require chap = yes
;refuse pap = yes
;require authentication = yes
;name = LinuxVPNserver
;ppp debug = yes
;pppoptfile = /etc/ppp/options.xl2tpd
;length bit = yes
(lns defaultのセクションはすべてコメントアウトします。
L2TP1は、xl2tpd-controlで接続する際の接続名になります。そのままでも構いません。
次に、こちらもサーバ側と同じようにchap-secretsの設定を行います。
また、root以外の閲覧ができないよう権限を設定します。
# vi /etc/ppp/chap-secrets
"%USERNAME%" "%L2TPNAME%" "%CHAP-PASSWORD%" *
# chmod 600 /etc/ppp/chap-secrets
さらに接続設定を行います。
# vi /etc/ppp/options.xl2tpd.conn-1
name %USERNAME%
noauth
crtscts
mtu 1410
mru 1410
nodefaultroute
lock
#proxyarp
logfile /var/log/xl2tpd.conn-1.log
(どうもこのnoauthが引っ掛かりますが...これを他に変更すると動かないという。
サーバのほうはauthにしていますし、実際認証は行われているのですが・・・。
pppdのドキュメントによれば、noauthは"相手に認証を要求しない"オプションなので、サーバ側に対する話なのか? でもそもそも、CHAPだとサーバから認証を開始しますから...。(イマイチ...よくわかりませんw))


次に、openswan(IPSec)の設定を行なっていきます。
# vi /etc/ipsec.conf
config setup
    dumpdir=/var/run/pluto/
    nat_traversal=yes
    virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
    oe=off
    protostack=netkey
    nhelpers=0
    plutostderrlog=/var/log/pluto
~~~~
include /etc/ipsec.d/connection.conf
# vi /etc/ipsec.d/connection.conf
conn %PEER_L2TP%
    authby=secret
    pfs=no
    rekey=yes
    keyingtries=3
    type=transport
    left=%CLIENT-IPADDRESS%
    leftprotoport=17/1701
    right=%SERVER-IPADDRESS%
    rightprotoport=17/1701
    auto=add
(%PEER_L2TP%は、ipsec autoで接続する際の接続名になります。そのままでも構いません。
%CLIENT-IPADDRESS%は、クライアント側のグローバルIPアドレスです。%defaultrouteでもいいかも。
)

またサーバ側と同じ形式でPre-shared Keyを設定します。
# vi /etc/ipsec.secrets
%CLIENT-IPADDRESS% %any : PSK "%PSK-PASSWORD%"
(%SERVER-IPADDRESS%は、サーバのグローバルIPアドレスです。)
# chmod 600 /etc/ipsec.secrets
最後にこちらも、sysctl.confを変更します。
# /etc/sysctl.conf
~~~~
#net.ipv4.ip_forward = 0
net.ipv4.ip_forward = 1
~~~~
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.eth0.send_redirects = 0
net.ipv4.conf.eth0.accept_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
net.ipv4.conf.lo.accept_redirects = 0
# sysctl -p
サーバ側と同様にサービスを起動して・・・
# service xl2tpd start
# service ipsec start
ipsec_setup: Starting Openswan IPsec U2.6.38/xxx
・・・とここで...(´・ω・`)
いつまで経ってもスクリプトが終了しない(ターミナルの制御が戻らない)現象が。
どうやら今回は、新調したサーバですのでエントロピープールが足りないようです。
そんなことがあるんですね〜・・・w
# cat /proc/sys/kernel/random/entropy_avail 6
確かに足りないw そんな時には・・・なんか処理をしてもらいます。
# find /# cat /proc/sys/kernel/random/entropy_avail
499
(`・ω・´)シャキーンw これでOKですね。
気を取り直して...

設定確認を行います。
# ipsec verify
問題なければ・・・
いよいよ、IPSecの接続を行います。
# ipsec auto --up PEER_L2TP
続けて、L2TPの接続を開始します。(これでppp0が作成されます。)
# echo "c L2TP1" > /var/run/xl2tpd/l2tp-control

接続確認をしてみましょう。
まずは、クライアント側→サーバ側へping。
# ping 192.168.253.1
・・・ OKでした。
サーバ側→クライアント側へping。
# ping 192.168.253.128
・・・ダブルOK\(^o^)/(←

ちなみに、ifconfigをクライアント側で実行すると、こんな感じに表示されます。
# ifconfig
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:133.242.142.23  Bcast:133.242.143.255  Mask:255.255.254.0
          inet6 addr: xxxx::xxxx:xxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:xxxxxx errors:0 dropped:0 overruns:0 frame:0
          TX packets:xxxxxx errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:xxxx (xx MiB)  TX bytes:xxxx (xx MiB)

lo        (略)

ppp0      Link encap:Point-to-Point Protocol
          inet addr:192.168.253.128  P-t-P:192.168.253.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1410  Metric:1
          RX packets:19 errors:0 dropped:0 overruns:0 frame:0
          TX packets:23 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:2540 (2.4 KiB)  TX bytes:1504 (1.4 KiB)
(この設定では、クライアント側のppp0のinet addrは、
VPN上でのプライベートIPアドレスとなっているはずです。
また、P-t-Pは、VPN上でのサーバのプライベートIPアドレスとなります。)


以上です。
今回はこれでとりあえず開通させることができましたw

他サイトを参考にさせていただき...。この記事は一応整理した後に書きました。
ただ...実際のところは、何かと嵌ってしまったり(´・ω・`)...
ログファイル(/var/log/secure、/var/log/pluto、/var/log/xl2tpd、/var/log/xl2tpd.conn-1.log あたり)や、設定ファイルとにらめっこしながら、1日以上...試行錯誤していました(^^;)ゞ(笑)
うまくいくときは、すんなり行くんでしょうけどね...(;´д`)トホホ…。

ちなみに...1つ注意しておきたいのですが、ipsec auto --up して接続したときにエラーになると、一旦、ipsec auto --downしないと、再接続しようとしても何も表示されない...ということがありました。
...当然なのかもしれないですが、注意です(><)

あとは...このままで実用するとセキュリティがどうかと思うこともありますので、また設定をさらに弄っていこうと思いますw (X.509証明書認証も。)
ご指摘などありましたら、宜しくお願いします m(_ _)m
今回は以上ということで...それではっ。

[追記]
本記事中には反映していませんが、早速、証明書(X.509)認証に変更してみました。
こちらは大変すんなりと行きましたε-(´∀`*)♪ 本記事の最初のほうに書いたとおり、openswanのビルドを行う際にNSSを有効にしておくと・・・あとは証明書を作成して設定を行うだけです。
NSSでの証明書作成/openswanへの設定はこちらがとても参考になりました:
→ openswanでIPsec VPN(トランスポート・X.509認証) [Fedora14]  (感謝♪)

[2013/04/04 修正]
鍵まわりの問題により、一定時間で接続が切断される不具合があったため、pppまわりの設定を修正しました。

[2013/05/01 追記]
クライアントに割り当てるプライベートIPアドレスの範囲はサーバ側の/etc/xl2tpd/xl2tpd.confで設定しますが、
このプライベートIPアドレスをクライアントごとに固定としたい場合は...
双方の /etc/ppp/chap-secrets で、以下のように指定します。

# vi /etc/ppp/chap-secrets
"%USERNAME%" "%L2TPNAME%" "%CHAP-PASSWORD%" "192.168.253.128"

(この例では、192.168.253.128が割り当てられる。)