FreeBSD で VPN サーバ環境

以前より自室に BSD で常時運転サーバを立てていたものの,外からアクセスするのにサービス毎に firewall に穴を開けるか,Web で操作するかをしてたのですが,いい加減面倒になってきたところで何か手段がないか探してたタイミングで SoftEther が Open 化されたということで(VPNとは何かを頭に叩き込んで)導入してみました.

SoftEther のインストール

SoftEther のビルドは実に簡単で,download ページGitHub からソースコードを取得して,configure,gmake install で終わりです.実に簡単.iconv が無くて make が通らない場合は,Makefile に -I/usr/local/include とか -L/usr/local/lib とかつければよいです.

インストール先が /usr/vpnserver とか /usr/vpnclient に設定されているのでやや違和感があります./usr/local/vpn/vpnserver 辺りに直しています.

自室サーバでは VPN サーバ機能だけを root で起動し,自室内 LAN とはローカルブリッジで接続することで外にいる端末をローカル LAN に接続できるようになります(ローカルブリッジなどの設定は後述).

# vpnserver start

VPN サーバの設定

室内 LAN は ルータ・終端装置(ONU)を介して WAN と接続していて,ルータ内はローカル LAN を構成して NAT で運用されているものとします.VPN サーバの FreeBSD はローカルLAN内に接続しています.

基本設定

VPN サーバの設定は vpncmd でも出来ますが,LAN 内のWindows PC から「サーバ管理マネージャ」をインストールすれば GUI で設定できます.

  • 新しい接続設定→ホスト名(サーバIP),ポート番号(どれか一つ),サーバ管理モード,管理パスワード
  • 接続
  • 仮想HUBの作成→仮想HUB名,パスワード
  • 仮想HUBの管理→ユーザの管理→新規作成→ユーザ名,パスワード認証,パスワード

ローカルブリッジの設定

ローカルブリッジとは,VPN を通して外部の仮想ネットワークと内部の物理ネットワークを接続する手段です.これを使えば仮想ネットワークをLAN内PCに参加させる手間が省けます.

  • ローカルブリッジ設定→仮想HUB(先に作成した仮想HUB名),LANカード(I/F名)→ローカルブリッジの作成

なお,「仮想 HUB とローカルブリッジを組んだ」 I/F は VPN からアクセスできないという OS 上の制約があるようです.そのため,VPN サーバがローカル LAN 内にある場合でも I/F は2つ用意しないといけないようです.自室では VPN 専用に USB-Ethernet 変換で I/F を増設しました.

L2TPの設定 

最近はスマートフォンが VPN 経由のリモートアクセス(L2TP)に対応しているので,利用できるようにその設定を行います.

  • IPsec/L2TP 設定→L2TPサーバー機能を有効にする,IPsec事前共有鍵(任意文字列)

ファイアウォールの設定

室内 LAN はルータを介して WAN(ONU) に接続しているので,外部から VPN サーバにアクセスするポート制御が必要です.構成によりますが,以下のポートを IP マスカレードに設定する必要があります.

  • UDP port 500 (IKE)
  • UDP port 4500 (IPSec NAT-Traversal)
  • UDP port 1701 (L2TP)
  • ESP port (Encapsulated Security Payload) … VPNスルー機能

VPN クライアントの設定

クライアントは OS に合わせて VPN クライアントを用意し,仮想 LAN カードを作成して VPN サーバ(WAN から見える IP または FQDN) の 仮想 HUB,ユーザ名,パスワードを設定して接続します.接続が完了すると ローカル LAN で DHCP が動いていればその IP アドレスが仮想 LAN カードに設定されます.

iPhone や Android の場合は,VPN メニューから VPN サーバ(WAN から見える IP または FQDN),ユーザ名(@仮想HUB名),パスワード,シークレット文字列(IPsec事前共有鍵で設定した文字列) を設定して接続します.

これで,外にいながら自室のローカル LAN と同じ条件で端末を扱うことができます(たぶん).速度は圧縮などの技術でかなり使えるレベルになってきています(とはいえペイロードにカプセル化したパケット載せてるんだから過剰に期待するのも酷というもの…).

 

FirefoxOS のローカルミラー

FirefoxOS は commit が頻繁に行われ,master branch だけ追従してるとおかしな動作の時に拾うと残念なツリーになってしまうので,version branch で安定した環境も並列して構築しておきたいとなると,同じツリーをリモートから頻繁に取るのも何なのでローカルミラーが欲しくなります.

Android では本家に解説があります.

http://source.android.com/source/downloading.html#using-a-local-mirror

FirefoxOS の初回ビルド方法はMDNに解説があります.これが前提知識となりますので一度はトレースしておくのがよいかと思います.

https://developer.mozilla.org/ja/docs/Mozilla/Boot_to_Gecko/Preparing_for_your_first_B2G_build

FirefoxOS の場合は Android のモジュール管理ツールである repo を使いつつも shell script で自動化されているため,少々ややこしい手順が必要でした.またここでは git の操作が必要なので,git の知識が必要です.もしかしたらもっと単純で簡単な方法があるかもしれませんが.

ディレクトリイメージ

この例ではローカルミラーは以下のようなディレクトリを想定しています.青文字の “server:/opt/git/b2g” は「ホスト名 server」の「/opt/git/b2g ディレクトリ」のため,環境に合わせて読み替えてください.

server:/opt/git/b2g
|-- B2G
|-- projects
    |-- .repo
    |-- gaia.git
    |-- gecko.git
    :

リポジトリの取得

まず,server(以下 shell prompt が ‘$’) にて最初のベースリポジトリを clone します.

$ cd /opt/git/b2g
$ git clone git://github.com/mozilla-b2g/B2G.git

リポジトリを初期化します.ここでは取得するベースとして ICS である emulator.xml を選択していますが,JellyBeans ベースなら emulator-jb.xml,Kitkat ベースなら emulator-kk.xml を指定します.機種を選択する場合は,b2g-manifest ディレクトリの xml ファイルを選択します.この sync は環境によってはかなりの時間を要します.

$ mkdir /opt/git/b2g/projects
$ cd /opt/git/b2g/projects
$ ../B2G/repo init -u git://github.com/mozilla-b2g/b2g-manifest.git -m emulator.xml --mirror
$ ../B2G/repo sync

ローカルへの対応

ローカル用の manifest に変更して,ローカル用のブランチ(local-master)に commit します.(リモートが更新された場合はリモートに追従して rebase または merge していきます.)

$ cd /opt/git/b2g/.repo/manifests
$ git checkout -b local-master origin/master
$ patch -p1 < emulator.xml.patch
$ git commit
$ git checkout default

local 用の manifest は remote のアドレスをローカルミラーの位置に修正したものを用意しておきます. 上記に登場した emulator.xml.patch は以下のようになります.

--- a/emulator.xml 2014-02-22 18:29:29.000000000 +0900
+++ b/emulator.xml 2014-03-22 01:28:46.000000000 +0900
@@ -2,18 +2,18 @@
<manifest>
<remote  name="aosp"
-        fetch="https://android.googlesource.com/" />
+        fetch="server:/opt/git/b2g/projects" />
 <remote name="caf"
-        fetch="git://codeaurora.org/" />
+        fetch="server:/opt/git/b2g/projects" />
 <remote name="b2gmozilla"
-         fetch="https://git.mozilla.org/b2g" />
+         fetch="server:/opt/git/b2g/projects" />
 <remote name="b2g"
-         fetch="git://github.com/mozilla-b2g/" />
+         fetch="server:/opt/git/b2g/projects" />
 <remote name="mozilla"
-       fetch="git://github.com/mozilla/" />
+       fetch="server:/opt/git/b2g/projects" />
 <remote name="mozillaorg"
-     fetch="https://git.mozilla.org/releases" />
- <remote name="apitrace" fetch="git://github.com/apitrace/" />
+     fetch="server:/opt/git/b2g/projects" />
+ <remote name="apitrace" fetch="server:/opt/git/b2g/projects" />
 <default revision="refs/tags/android-4.0.4_r2.1"
          remote="caf"
          sync-j="4" />

ベースが JellyBeans や KitKat の場合はマニフェストファイルが base-jb.xml,base-kk.xml に分かれているのでそれぞれローカルの対応が必要です.

 ローカルビルド

ローカル環境(以下 shell prompt が ‘%’)では通常の手順通り config.sh を実行しますが,manifest リポジトリにローカルミラーの位置に,branch にローカル用 branch を指定して実行します.

% mkdir ~/work/b2g
% cd ~/work/b2g
% GITREPO=server:/opt/git/b2g/projects/.repo/manifests BRANCH=local-master ./config.sh emulator
% ./build.sh

 ローカルで新しいターゲットを追加する場合

ローカル向けに新しいターゲットを追加するには,次の手順を実施します.

  1. server:/opt/git/b2g/B2G にて config.sh にターゲット情報(例えば new-target)を追加して default  branch に commit
  2. server:/opt/git/b2g/projects/.repo/manifests にてターゲット用 manifest を作成してローカルbranch(local-master) に commit
  3. ローカルビルドは config.sh の引数に上記 1. で指定したターゲット名(new-target)を指定します.
    % GITREPO=server:/opt/git/b2g/projects/.repo/manifests BRANCH=local-master ./config.sh new-target

 

関西FirefoxOS勉強会 6th に参加してきました

前回に続き今回も勉強会に参加してきました.

XULRunner の解説,アプリの多言語化解説,アプリ間通信解説と今回濃い内容でした.単語や情報としては知っていても実際どう書いていくのかはやってみないと知る機会がないので,勉強会はそれを知るいい機会かと思います.

そして今回は現状の FirefoxOS on AndroidStick の紹介ということでLTにて発表しました.


本当は実機を持ち込んで動かしたかったところですが,HDMI出力環境が会場にないだろうということで持ち込まないといけなかったのと,急遽思いついて資料を前日から当日深夜に作ってた状態なので,今回は残念ながらパスしました.実際にはさらに今のままでは配線や起動するまでの操作が大変で,まだまだこれからな感じです.さらに技術的な話とするにはまずここでメモとして書いてからですかね…

FirefoxOS on Android Stick (現状報告)

いろいろ試行錯誤した結果,「mk808b」に FirefoxOS を載せてなんとなく動いています.技術的な解説は別の機会でするとして,今のところ確認できてることは以下の通りです.

  • Recovery 上の Linux 経由での FirefoxOS v1.3 起動 (Recovery 起動 のため Android 起動必要)
  • homescreen 表示と USBマウス/キーボード操作
  • USB Ethernet でネットワーク接続(Wi-Fi は×)
  • webm(動画) と ogg(音楽) の ソフト再生,Gallery App の画像表示
  • MarketPlace からの App インストール

fxos-home fxos-web fxos-marketplace fxos-movie

試行錯誤の途中には,色がおかしくなる問題・メディアストレージが見えない問題・Console 表示問題などを解決しています.一見素直に動いているのですが,裏では大量のエラーを吐いている状態のため時間経過と共に動作が不安定になってきます.これはバイナリで供給している部分(kernel や Android ライブラリなど)があり,ソースから build した部分と不整合があるためです.これだとちょっとまだ実用には遠そうです.

kernel の不整合は,公開 git があるので config を今動いているものに合わせて driverを有効にし, build と ROM化すれば解決しそうなのですが,config 情報や build 条件が見つかっていないためうまくいっていません.これができれば Wi-Fi なども突破できそうなのですが…

Android ライブラリの不整合は,バイナリ供給元がソース非公開にしていることや,FirefoxOS がベースにしている Android バージョンと元のバージョンが合っていないことが原因です.これもなかなか一筋縄ではいかなさそうです.

ベースにしている PicUntu の開発ストリームはすでに次の世代のSoCである RK3188 に移行しています.kernel や driver の追従には RK3188 搭載 Stick をターゲットにした方がいいかも知れません.手元には搭載 Stick の「mk908」も準備中です.

 

FirefoxOS on Android Stick (準備)

最近は次世代 Web platform として ChromeOS, Tizen そして FirefoxOS が熱いのですが,その中でも Community 活動が活発な FirefoxOS に注目しています.

しかしいざ試してみようとしても端末はまだ手に入りにくく,Simulator で遊ぶか build 環境を整えて Emulator で試すくらいだったのですが,build 環境が Android ベースだったので Android が自由にいじれる環境があれば試せるなぁとおぼろげに思っていました.
Android 環境といえば手元には Nexus7(2012)があるのですが,Android の build や ROM 事情をよく知らないこと,そもそも実用で使ってるので環境をつぶすわけにもいかず,結局 Nexus7 を生贄にするのは断念しました.

その後, Android Stick の紹介を偶然見て割と安く手に入るということを周回遅れで知り,
「これで動かせるんじゃないの?」ということでちょっと足を突っ込んでみたのが始まりです.

Android Stick でメジャーなものとして「mk808」があり, 登場して結構経っていて,技術的には枯れていて情報が出回っているだろうということで選択してみました.とはいえ実際に情報を漁ってみるとまずメーカー情報自体がほとんどなくClone製品まであるということやソフト環境も野良情報ばかりで結構大変でしたが.

  • SoC は Rockchip RK3088,内部に Cortex-A9 Dual を抱えてて,Android を動かせるだけのスペックは備えている
  • HDMI 出力専用で FullHD まで出せて USB, Wi-Fi, Bluetooth に対応.

しかし Bagleboard や Pandaboard のように full build で試せるわけではないので,それに近い環境を探す必要があります.この SoC では Ubuntu ベースの Linux Distribution 「PicUntu」の開発が活発で,それをベースに Emulator 環境を載せていけばなんとかなりそうな気がします(本当か?).

Boot to archmemo

長い間放置していた旧サイトから,archmemo としてCMSに移行しました.

  • 1995 サイト公開開始(Museum)
  • 1996 日々記録開始
  • 1999 情報を sakura.ne.jp に,日々記録を日記者サイトに移動
  • 2000 Palm向けに技術記録開始(Museum/d)
  • 2005 更新凍結し,レンタルサーバーライトに退避
  • 2014 CMS として再開

CMSとして作り直すのは,最近技術ネタを書くのに twitter か日々記録に書いててエントリ分類や検索が面倒になってきたためで,せっかくなので旧サイトの延長にしてしまえ,ということでこの形にしました.まだ中身は何もないですが.

昔から自分で日記スクリプト作ってましたが,新しく立ち上げるなら CMS でお気楽に作った方が楽ですね.WordPress はまだよく分かってませんが.

旧サイトの内容は当時のまま Museum として置いてありますが,更新はしません.更新するときは archmemo のエントリーに書くということで.気が向いたら固定ページに書き直すかもしれませんが,今更誰も必要としない情報ばかりなので放置でしょう.

ここ最近プロジェクト管理からコード書きやデバッグに戻ってきたので,そこで出てきた備忘録を残していくことにします.