るるぷらす

るるぷらす、だおー

通信パケットを節約しよう その2 ziproxy

前回、モビライザーを利用して不要な情報を削除してパケットを節約してみました。今回は圧縮用のプロキシを家のサーバにインストールして根本的なパケットを節約してみようと思います。

今回の構成は (Server) ziproxy + (Local Mac) polipo です。細かく言えば更にそれぞれ Unbound がインストールされていますが、今回は Unbound については割愛します。

ziproxy は今回のメインで、画像などを圧縮してくれるプロキシです。しかしこれにはキャッシュ機能が無いためローカルに polipo もインストールしました。家のサーバは Mac mini による OS X Server ですが、ziproxy をインストールするのがめんどくさいので VirtualBoxUbuntu をインストールして、そちらに ziproxy をインストールしました。ではまずそこから手順を説明します。

ziproxy の導入

  1. VirtualBox のダウンロード
    Downloads – Oracle VM VirtualBox

    f:id:egyo2nd:20131110200453p:plain

  2. VirtualBox のインストール
    ダウンロードした dmg ファイル (VirtualBox-4.3.2-90405-OSX.dmg) を開き、VirtualBox.pkg をインストールします。Mavericks の場合、途中で認証されてないとメッセージが表示されることがありますが、問題ありません。

    f:id:egyo2nd:20131110200530p:plain

  3. Ubuntu のダウンロード
    Ubuntu 13.10 日本語 Remix リリース | Ubuntu Japanese Team
    Ubuntu 13.10 日本語 Remix リリースから 64bit 版の ISO イメージをダウンローそしてください。ダウンロード元はどれでも構いません。これらはすべて同じファイルがミラーされています。

    f:id:egyo2nd:20131110201338p:plain

  4. VirtualBox の起動
    アプリケーションフォルダからVirtualBox を起動します。そして、左上の新規をクリックします。

    f:id:egyo2nd:20131110201459p:plain

    名前とオペレーティングシステムでは、下記のように設定します。
      名前: ub64 (任意)
      タイプ: Linux
      バージョン: Ubuntu (64 bit)
    続けるをクリックします。

    f:id:egyo2nd:20131110201633p:plain
    メモリーサイズ、メモリサイズは任意です。実メモリ容量を逼迫しないようにしてください。

    f:id:egyo2nd:20131110201714p:plain
    ハードドライブ、仮想ハードドライブを作成するに設定、作成をクリックします。

    f:id:egyo2nd:20131110201742p:plain
    ハードドライブのファイルタイプ、VDI (VirtualBox Disk Image) に設定、続けるをクリックします。

    f:id:egyo2nd:20131110201810p:plain
    物理ハードドライブにあるストレージ、可変サイズに設定、続けるをクリック。

    f:id:egyo2nd:20131110201954p:plain
    ファイルの場所とサイズ、そのまま作成をクリックします。保存できるデータ上限を増やしたい場合はスライダーを移動させてください。

    f:id:egyo2nd:20131110202304p:plain

  5. 仮想マシンの設定
    ub64 を右クリックして設定...を開きます。
    ストレージを開き、コントローラー: IDE にある空をクリック。右側の属性の円盤マークをクリック、仮想CD/DVDディスクファイルの選択... を選び、先ほどダウンロードした Ubuntu の ISO イメージファイルを指定してください。
    (1)空を選択

    f:id:egyo2nd:20131110202516p:plain
    (2)円盤をクリックしてファイルを選択
    f:id:egyo2nd:20131110202528p:plain

    (3)マウントした状態
    f:id:egyo2nd:20131110202600p:plain
    次にネットワークを開き、ネットワークアダプターの割り当てをブリッジアダプターに変更します。

    f:id:egyo2nd:20131110202811p:plain

  6. 仮想マシンの起動
    ub64 を右クリックして起動を選びます。

    f:id:egyo2nd:20131110202847p:plain

    ISO イメージから Ubuntu 13.10 が起動します。上部に表示されているメッセージは必要なければ右の青い✕マークをクリックして閉じてください。
    デスクトップにある Ubuntu 13.10 のインストールを起動します。

    f:id:egyo2nd:20131110202929p:plain

    ようこそ、日本語のまま続けるをクリックします。

    f:id:egyo2nd:20131110203008p:plain

    Ubuntu のインストール準備、インストール中にアップデートをダウンロードするとサードパーティのソフトウェアをインストールするの両方にチェックを付けます。

    f:id:egyo2nd:20131110203042p:plain

    インストールの種類、そのままインストールをクリックします。

    f:id:egyo2nd:20131110203117p:plain

    どこに住んでいますか?、Tokyo のまま続ける

    f:id:egyo2nd:20131110203146p:plain

    キーボードレイアウト、日本語 - 日本語 (Macintosh) に変更して続ける

    f:id:egyo2nd:20131110203209p:plain

    あなたの情報を入力してくださいUbuntu 用のアカウントを入力します。自動的にログインするにしておくと便利です。

    f:id:egyo2nd:20131110203231p:plain

    One account to log in to everything on Ubuntu、これは無視して Log in later(後でログイン)をクリックします。

    f:id:egyo2nd:20131110203305p:plain

    すべての項目が入力されたので、Ubuntu のインストールが始まります。

    f:id:egyo2nd:20131110203433p:plain

    インストール完了後、右上の電源メニューからシャットダウンします。

    f:id:egyo2nd:20131110203455p:plain

    この画面になったら Enter で抜けてください。その後、VirtualBox アプリケーションを一旦再起動します。

    f:id:egyo2nd:20131110203555p:plain

    仮想マシンのストレージ設定に戻り、仮想 CD/DVD をアンマウントします。

    f:id:egyo2nd:20131110203614p:plain

    ub64 を再起動します。
    Mozc セットアップヘルパーが起動しますので、はい > OK > はい > はい > OK で進めます。更に右上の電源メニューから Ubuntu を再起動します。

  7. ziproxy のインストール
    まず、Ubuntu の IP アドレスを調べるため、システム設定を開きます。

    f:id:egyo2nd:20131110203750p:plain

    f:id:egyo2nd:20131110203806p:plain

    ハードウェアのネットワークを開きます。ここに IP アドレスが表示されています。

    f:id:egyo2nd:20131110203821p:plain

    次に、必要なコンポーネントと ziproxy をインストールします。コンピューターとオンラインリソースを検索を開き、terminal と入力します。そしてアプリケーションの端末を開いてください。

    f:id:egyo2nd:20131110203851p:plain

    f:id:egyo2nd:20131110203901p:plain

    ここからはコマンドラインの操作です。コマンドを入力した後に管理者権限のパスワードを入力してください。
      % sudo apt-get update
      % sudo apt-get upgrade
    コマンド入力後、 y を入力して実行してください。
      % sudo apt-get install vim ssh libgif-dev libjasper-dev libsasl2-dev ziproxy
    これで ziproxy のインストールが完了しました。ついでに vimssh もインストールしたので、残りの作業は Mac から行おうと思います。Ubuntu はもう隠しておいてください。
  8. ziproxy の設定
    アプリケーション > ユーティリティ > ターミナル を起動します。
      % ssh [ユーザ名]@[ubuntuのip]

    f:id:egyo2nd:20131110204110p:plain

    ziproxy の起動を確認
      % sudo lsof -nPi:8080
    ziproxy が表示されていたら正常に起動しています。
    もし起動していなければ下記のコマンドで起動してください。
      % sudo /etc/init.d/ziproxy start
    ziproxy の設定を変更
      % sudo mkdir /var/log/ziproxy
      % sudo touch /var/log/ziproxy/error.log
      % sudo chmod 666 /var/log/ziproxy/error.log
      % sudo vi /etc/ziproxy/ziproxy.conf
    設定変更点
      Port = 81
      ErrorLog = "/var/log/ziproxy/error.log"
      AllowMethodCONNECT = true
      ConnTimeout = 180
      MaxSize = 0
      UseContentLength = false
      ProcessCSS = true
      ImageQuality = {20,24,20,18}
    他の部分はデフォルトで問題ありません。お好みで設定変更してください。
    ziproxy の再起動および起動確認
      % sudo service ziproxy restart
      % sudo lsof -nPi:81
    ポート番号がコンフィグ通りに正しくポートが81番に変わったことを確認します。

これで ziproxy の設定も完了しました。実際に動いているか Firefox の設定を変えて確認してみましょう。まず、適当な画像を Firefox で表示してデスクトップなどに保存します。その後に ziproxy へ接続を設定して、キャッシュクリア後に同じ画像ファイルを表示して保存します。先ほどの画像ファイルと容量を見比べてください。容量が小さくなっているなら成功です。

f:id:egyo2nd:20131110204358p:plain

ネットワークルータの設定を変更して、TCPポート 81番を Ubuntu の IP アドレスにポートフォワードすることによって外からも ziproxy にアクセスできるようになります。この辺りの設定はご自身のネットワークルータの説明書をお読みください。外からアクセスするときは固定アドレスまたは DDNS などを利用してください。私は ddo.jp の無料プランを利用しています。

ちなみに ziproxy は認証をかけることができますが、その設定をすると https での接続に問題が発生します。これは後ほど説明する polipo でも同じです。そのため認証はあえて設定していません。外からアクセスするアドレスがバレると他の人に勝手に使われてしまうので、十分注意してください。

polipo の導入

ziproxy だけではキャッシュ機能に不安があるので polipo でキャッシュを強化します。そうすることで、過去に表示したことのあるページに関してはローカルキャッシュを読み込むので、さらにパケットの節約になります。

以前説明した方法を参考にローカルの Mac(例えば MacBook など)に polipo を設定しました。→ DNS キャッシュサーバの Unbound を Mountain Lion にインストールした。 - るるぷらす

  1. Xcode をインストールします。
    Mac App Store - Xcode
  2. MacPorts をインストールします。Mavericks 用もあります。
    The MacPorts Project -- Download & Installation
  3. ターミナルから sudo port install polipo を実行し、config を設定します。
      % sudo port install polipo
      % sudo rm /opt/local/etc/polipo/config
      % sudo touch /opt/local/etc/polipo/config
      % sudo vi /opt/local/etc/polipo/config
    polipo の設定
      proxyPort = 8123
      dontCacheRedirects = true
      dontCacheCookies = true
      pipelineAdditionalRequests = true
      maxPipelineTrain = 64
      serverMaxSlots = 32
      serverSlots = 32
      serverSlots1 = 32
      parentProxy = "[ziproxyがインストールされているサーバの外向きのアドレス]:81"
  4. Lingon をインストールします。
    Mac App Store - Lingon
  5. Lingon で、org.macports.Polipo を Enable します。

    f:id:egyo2nd:20131110204851p:plain

  6. ローカルの Mac を再起動します。

システム環境設定から polipo を有効にしましょう。

f:id:egyo2nd:20131110204930p:plain

yimg.jp は polipo と相性が悪い(polipo がクラッシュする)ので、必ず除外するようにしてください。

ちなみに、Dropbox を使用している人はその通信を阻害させないようにプロキシを無効にしてください。

f:id:egyo2nd:20131110205010p:plain

f:id:egyo2nd:20131110205019p:plain

f:id:egyo2nd:20131110205028p:plain

iPhone にも ziproxy

ついでに iPhoneLTE/3G 通信にも ziproxy を適用する方法をご紹介しましょう。APN の設定を追加することでプロキシの設定を追加することができるので、それを利用しています。

  1. APN Setup にアクセスします。
  2. ソフトバンクであれば、下記の APN 設定を追加します。
      APN: jpspir
      Username: sirobit
      Pass: amstkoi

    f:id:egyo2nd:20131110205224p:plain

    その他のキャリアは、こちらをご参照ください。→ 小龍茶館 : 【iPhone APN設定】SIMフリーiPhoneで設定する日中APN設定覚書き
  3. Submit をクリックしてプロファイルをインストールします。

これで LTE/G3 通信でも ziproxy が適用されます。もし削除する場合は、設定 > 一般 > プロファイル > Gevey APN を削除してください。

 f:id:egyo2nd:20131110205549p:plain

これで多くのパケットを節約できるはずです。

最後に、

サーバを再起動しても Ubuntu自動起動できるように下記のファイルをアカウントのログイン項目に入れてください。

ホーム > VirtualBox VMs > ub64 > ub64.vbox

また、ずっとウィンドウが開いて起動しっぱなしになっているのもうるさい感じなので、Houdini というアプリを使用して自動的に非表示になるようにしています。→ Mac App Store - Houdini

 

追記(2015/2/3)

ziproxyを認証なしで運用していると、一週間ぐらいでプロクシの存在を嗅ぎつけた海外の輩が相乗りしてきたり、踏み台にしてきたりします。

その対策として Ubuntu に搭載されている ufw というファイアウォールを使用することにしました。

ufw の設定の前に、実際にどれ位自分の ziproxy にアクセスが有るか確認してみましょう。ziproxy のアクセスログはデフォルトで有効にされていないので、ファイルを準備して用意しましょう。

% sudo touch /var/log/ziproxy/access.log
% sudo chmod 666 /var/log/ziproxy/access.log

access.log ファイルを作成して、アクセス権を調整します。

% sudo vi /etc/ziproxy/ziproxy.conf
# AccessLog = "/var/log/ziproxy/access.log"
% sudo service ziproxy restart

コメントアウトされている # を削除します。

% cat /var/log/ziproxy/access.log

ログの内容を簡易的に確認するには cat を使います。

ログを確認してみて不審なIPアドレスのアクセスがないか確認します。

さて、踏み台になっていることが確定的になった時点で、まず、ziproxy.conf の port 設定をランダムな数字に変更して sudo service ziproxy restart します。これで、不正なアクセスを一時的に止めることができるはずです。

そして、ufw の設定を行います。デフォルトではサービスは起動していないので sudo ufw enable で有効にする必要があります。

% sudo ufw status
% sudo ufw default deny
% sudo ufw enable
% sudo ufw status
% sudo ufw allow from 192.168.0.0/24 to any port ssh
% sudo ufw allow from 192.168.0.0/24 to any port [ziproxy port]
% sudo ufw status
% sudo ufw reload

ziproxy に接続するIPアドレスをこんな感じでチョチョイのチョイと追加します。もし、外部からアクセスする必要がある場合は、そのIPアドレス帯域も追加するといいでしょう。

IPアドレス帯域がわからなければ、ziproxy のポートを戻して、access.log を確認してみてください。接続されたIPアドレスが分かるはずですので、そこからIPアドレス帯域を調べて追加すると良いでしょう。

ziproxy.conf の port を元に戻してしばらく運用し、不正アクセスが収まったようであれば、サーバの容量節約のためにも access.log を停止し、ファイルも削除しておきます。

ufw の詳しい設定は、下記をご参照ください。

以上。