名刺サイズPC[Raspberry Pi]で圧縮プロキシサーバを立てる (更新:2013.05.27)

@はじめに

ワンコインSIMことServersMan SIM 3G 100は月々490円で最大100kbpsの通信ができます。
ドコモMVNOなので、ドコモの中古スマホやSIMフリー端末さえあればどこでもネット〜♪

…とはいえ、最大100kbps(平均80kbps程度)の端末ではニュースを読むだけで一苦労。
ツイッターやメールくらいには使えるものの、画像を開こうと思ったら10KB/秒。
もし高解像度のままアップして1枚2メガ!みたいな画像を開いてしまったが最後、
画像が開くまで3分以上固まるステキ世界です。
今時のブロードバンド回線しか知らない世代には想像を絶する遅さでしょう。

そこで役立つのが、かつて無線インターネットサービスが64kだった時代に愛された「圧縮プロキシ」です。
(通常)
低速無線→相手先サーバに要求=画像(2MB)!→10KB/2048KB = 約205秒。超遅い。
(圧縮)
低速無線→プロキシが仲介して取得&圧縮転送(400KB)→10KB/400KB = 約40秒。遅いけどまあ許せる!
とまあこんな感じ。

この仕組みは、LTEやWiMAXなどの高速無線では圧縮の遅延で逆に遅くなりますが、
dti、IIJmio、日本通信bmobileなど、低速廉価型MVNOにはかなり効果があります。
(bmobileは同じ原理の「Webアクセラレータ」を無償利用できるサービス付きですが)。
しかも、限られた無線通信の帯域を有効利用するという点でも優れています。

圧縮プロキシのためだけに自宅PCサーバを立てるのは電気代的に全く無意味なのですが、
Raspberry Piなら、超省電力で24時間動いていても電気代の気にならないステキなプロキシになるはず!
というのが本項の内容です。

※2013年5月27日追記
 ServersMan SIM 3G 100を解約して、OCN モバイル エントリー d LTE 980に乗り換えました。
 制限時200kbpsの回線ですが、圧縮プロキシの効果が超体感できるレベルになります。

@とりあえずセットアップ

OSのSDカードイメージはwww.raspberrypi.org/downloadsからダウンロードできます。
普通はてくののブログさんのところに書いてある方法でRaspbian "wheezy"を使うのが無難なのですが、
"2013-02-09-wheezy-raspbian.img"で日本語環境&Xの自動起動を無しで環境構築し、
圧縮プロキシを走らせたところ、CPU使用率100%で張り付いて再起不能になる現象が発生しました。
手持ちの古いカーネル(英語ロケール)では問題が起こらなかったので、
恐らく日本語ロケールが原因ではないかと思われるのですがはっきりした原因は不明です。

そのため、Win32DiskImagerでSDカード(2GB以上)にイメージを書き込んだ後は、
以下の設定で進行してください。
expand_rootfs : 4GBの場合は実行してパーティションサイズを合わせる。
configure_keyboard : Generic 105-key〜、Other、Japanese、Japanese、The default〜、No compose key。
Use Control+alt+Backspace to terminate the X server?は念のためYes。
change_timezone : Asia、Tokyo。
これでFinishです(つまり日本語ロケールを使用しない前提です)。
起動したらlogin:pi、password:raspberryでログインして下さい。

@VNCサーバを設定

HDMIケーブルでいつも繋ぐのも面倒だし、コンソールオンリーで設定もツライので、
VNCサーバを入れてリモート保守が出来るように。
以下のようにコマンド実行。
# sudo apt-get update
# sudo apt-get install tightvncserver
# tightvncserver :1 -depth 24 -geometry 800x600 -rfbport 5901
apt-getパッケージを更新し、VNCサーバ(tightvnc)をインストール。
上の例は「24ビットカラー、解像度800x600、使用ポート5901番(ここは環境にあわせて変更)」です。
ちなみに解像度を指定しない場合は1024x768がデフォルトですが、800x600のほうが
通信量が少なくてレスポンスが良好なので上記設定にしています。

続いてパスワードを要求されるのでこれも任意に設定。
Would you like to enter a view-only password (y/n)? もちろんyで閲覧にもパス設定。
設定完了後はifconfigで現在のIPアドレスを確認して、
VNCクライアント(realvnc viewerなど)から"IPアドレス:ポート番号"に対して接続。
(raspberry piが"192.168.0.10"でポート5901なら"192.168.0.10:5901")。
これでログインしてラズベリーなデスクトップが表示されたらOK。


@テキストエディタ導入&IPアドレスを固定

メニューの「Accessories→Root Terminalを右クリック→Add to desktop」で
デスクトップに出しておき、基本ここから各種操作を行います。
システム書き換え用にテキストエディタを入手するため以下のコマンドを実行。
# apt-get install gedit
これでgeditコマンドでテキストエディタが開くようになります。

VNCで接続するにはIPアドレスを固定するのが無難なのでgeditでNICの設定を書き換えます。
デフォルトでは自動取得&WiFiサポートになっていますが、eth0一本に絞りましょう。
root権限でコマンドからgeditを実行し、NIC設定ファイルを開きます。
# gedit /etc/network/interfaces
もしゲートウェイ192.168.0.1で、Raspberry Piに192.168.0.253を割り当てるなら
auto eth0
iface eth0 inet static
address 192.168.0.253
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1
dns-nameservers 192.168.0.1
まあこんな感じ。自分の環境がよくわからないのにコレをやるとネットワークに繋がらなくなるので注意。
rebootコマンドで再起動したらVNCサーバを実行。
# tightvncserver :1 -depth 24 -geometry 800x600 -rfbport 5901
これで新しいアドレスに対してVNCクライアントが繋がれば成功です。

上記の /etc/network/interfaces 修正後にgeditを閉じてGtk-WARNINGが大量に表示される場合は
# sudo mkdir -p /root/.local/share
こんな感じでエラーを吐く要因のディレクトリを作成してください。
これで以後geditでエラーが出力される症状が無くなります。
(参考:かずみんのブログさん)

@delegateのコンパイル&コンフィグファイル作成

圧縮プロキシのメインプログラム(delegate)はapt-getで導入できないため、
ソースコードをダウンロードして自力コンパイルする(今回は"delegate9.9.7.tar.gz"を使用)
以下のコマンドで /usr/local/app にソースコードを保存・展開し、makeを実行。
# mkdir /usr/local/app/
# cd /usr/local/app
# wget http://www.delegate.org/anonftp/DeleGate/delegate9.9.7.tar.gz
# tar xvzf delegate9.9.7.tar.gz
# cd delegate9.9.7
# make
数分すると"Enter your E-mail address"と聞かれますが適当なメアド打ってy。
ここから何十分経っても終わる気配がないため諦めて就寝し、朝起きたら終わってました。
/usr/local/app/delegate9.9.7/src/ にプログラム"delegated"が出来ているので、
さらに続きを以下の通り進行。
# mkdir /usr/local/app/delegate
# mkdir /usr/local/app/delegate/cfi
# cp ./src/delegated /usr/local/app/delegate
これで /usr/local/app/delegate/delegated で実行可能になります。

@imagemagickをインストール

コチラは普通にapt-getで導入できるので楽ちん。
# apt-get install imagemagick

導入後に"convert"コマンドを実行し、引数などが表示されればOK。

@delegateとimagemagickを連携させるコンフィグ設定

テキストエディタで1つ目のコンフィグファイルを作成するため以下のコマンドを実行。
# gedit /usr/local/app/delegate/delegate.cfg

コンフィグファイルは以下の内容で作る(1行目はとりあえずさっきのメアドを入れる)
ADMIN=xxx@xxx.xxx
 SERVER=http
 CACHE=no
 FTOCL=/usr/local/app/delegate/cfi/delegate.cfi
 LOGFILE='${PORT}[date+.%d]' 
HTTPCONF=acc-encoding:-thrugzip 
HTTPCONF=gen-encoding:gzip 
RELAY=proxy 
REMITTABLE=+,http 
RELIABLE='*.ocn.ne.jp,*.yournet.ne.jp,*.spmode.ne.jp,*.mopera.net,*.bmobile.ne.jp,.localnet' 
最後のRELIABLEはアクセス許可ドメインの指定なので自分の使っている通信カードに合わせる。
(上の例は「OCN、ServersMan SIM 3G 100、Xi、FOMA、日本通信bmobile」を許可)
※OCNは「OCN モバイル エントリー d LTE 980」のため

続いて画像圧縮のコンフィグも作成する。
# gedit /usr/local/app/delegate/cfi/delegate.cfi
コレの中身は以下の通り。
#!cfi
Content-Type: image/jpeg
Output/Content-Type: image/jpeg
Body-Filter: convert -quality 20 - -
--
Content-Type: image/gif
Output/Content-Type: image/jpeg
Body-Filter: convert -quality 20 - jpeg:-
--
Content-Type: image/png
Output/Content-Type: image/jpeg
Body-Filter: convert -quality 20 - jpeg:-
jpeg/gif/png画像を見つけたらクオリティ20(かなりガビガビ)に圧縮しろ、という指示。
(Body-Filterの途中にある"convert"が、imagemagickをコールするコマンドそのもの)。
この数字を30くらいまで上げると綺麗だけど個人的には逆に15くらい下げてもいいと思う。

@delegateの起動実験を行う

ルータのポート5999番をプロクシ用としてRaspberry Pi(192.168.0.253)へ空けた場合は以下のコマンドを実行。
# /usr/local/app/delegate/delegated -P5999 +=/usr/local/app/delegate/delegate.cfg
AndroidであればAPN設定画面の「プロキシ」にサーバを設定している環境のグローバルアドレスを、
「ポート」にはdelegateの使用ポートである5999を指定(普通はDDNSなどを使ってアドレスを固定しておく)。

これで診断くんなどにアクセスし、無線通信経由なのに自宅のリモートホストが
表示されることを確認できればOK(そもそもそこが失敗していたらウェブページ表示すらできない)。

@「自動ログイン」「tightvnc自動実行」「delegateの自動実行」

ここまできたら、ついでなのでセキュリティは二の次で「利便性重視」の設定にしてしまいましょう。
まずここを参考に /etc/inittab を書き換え。
# gedit /etc/inittab
真ん中あたりにある1行をコメントアウトして以下のように修正(※細かい部分が違ったりするので1:2345:〜を探す)。
#1:2345:respawn:/sbin/getty 115200 tty1
1:2345:respawn:/bin/login -f pi tty1 </dev/tty1 >/dev/tty1 2>&1
これでRaspberry Piに通電すると自動ログインされるようになるので、停電してもすぐに自動復旧可能です。

さらにtightvncserverとdelegateも自動実行するように書き換える。
# gedit /etc/profile
プロファイルの一番下の行の"fi"よりも下の最下行に以下の2行を追加。
tightvncserver :1 -depth 24 -geometry 800x600 -rfbport 5901
sudo /usr/local/app/delegate/delegated -P5999 +=/usr/local/app/delegate/delegate.cfg
ちなみにdelegate関連のパーミッションをroot以外も許可すればsudoは要らないはずですが、
とりあえず面倒なのでこの方法で。
一方のtightvncserverはうっかりsudoを入れないように注意。

さいごに

ルータの設定でRaspberry PiのIPアドレス(192.168.0.253)をポート5999番を外向けに空ければ、
出先から圧縮プロキシが利用可能になります。
DynDNSなどダイナミックDNSサービスを利用して固定アドレスを使うのも良いでしょう。

ServersMan SIM 3G 100で検証してみたところ以下のような感じに。
BNRスピードテスト(画像読み込み版)
BNR
低解像度・高画質データほどより水増しされた値が出やすい傾向にあるのですが、
100kのカードを920kオーバー回線と同等のスピードでページを表示できるのはステキです。
ただし、この仕組みで圧縮できるのはHTML(プレーン→GZ)、JPEG/PNG/GIF→低画質JPEGなので、
FLASHやプロキシサーバを介さない通信が高速化するわけではないのでご注意を。

※OCN モバイル エントリー d LTE 980の場合はさらに以下のスコアが!
BNR
ここまでくると体感スピードはちょっと遅いADSL程度に達します。

◇◇

ちなみにXiのように「常に2chに規制されっぱなしで出先で書き込めない人」は、
Androidの2chブラウザ(en2ch)をプロキシ経由で書き込むように設定すれば、
(自宅が規制対象外であれば)出先からでも書き込めるようになります。

Raspberry Piの電気代は1ヶ月40円程度と言われているので費用対効果も抜群。
相変わらず入手困難(2013年2月現在)ではありますが、初回ロットに飛びついたものの
全然使い道が無くてそのままポイしちゃった方、是非とももう一度復活させてあげましょう。