sstea備忘録

日々のPCライフのメモ、備忘録、及びそれに類推する何か。
記載内容に間違い等を発見された場合はコッソリ教えてください... → sstea<a>aol.jp (<a> を @ に変えてください)


XperiaZ3

Raspberry Pi を VPN サーバーにする、改

前回に引き続き、Raspberry Pi のVPN サーバーの設定を行ないます。

◆VPN 経由で Raspberry Pi 上の web サーバーにローカルアクセス出来ない問題

前回までで VPN 接続は出来るようになりましたが、前回環境ではなぜか VPN 経由では Raspberry Pi 上の web サーバーにローカルアクセスIPアドレスでアクセス出来ませんでした。

いろいろ Google 先生に問い合わせてみると、
「Linux および Solaris オペレーティングシステムでは、仮想 HUB (VPN) の内側からローカルブリッジ先のLANカードから LAN への通信は行うことが出来ますが、ローカルブリッジしている LAN カード自体に対して通信することはできません。これは Linux カーネルの制限事項です。」
という情報を Google 先生から頂きました。

つまり、Linux ではこれは仕様という事。。。
回避策は、、、物理的にLANカードもう一個挿す事。。。

何とか、ソフトだけで回避はできないのか!?
→ できるみたいです!!


何かブリッジの設定をすればいいっぽいみたいですが、すいません。正直、よく分かってないです。

http://www.petapico.biz/ラジ館petapicoshop/softether-vpnで外から-irmagician-を制御してエアコンをつける/

のページの情報が凄く役立ちました。先人の知恵に感謝です。


以下の手順で解決しました。

◆ローカルブリッジの設定

必要パッケージをインストールします。
$ sudo apt-get install bridge-utils

/etc/network/interfaces
を修正します。
auto eth0
iface eth0 inet manual


auto br0
iface br0 inet static
  address 192.168.0.100
  netmask 255.255.255.0
  network 192.168.0.0
  broadcast 192.168.0.255
  gateway 192.168.0.1
  bridge_ports eth0
  bridge_maxwait 10


前回作った /etc/init.d/vpnserver に下記を追加します。
        : (略)
vpn_start() {
    ${DAEMON} start
    sleep 2
    tap=`ip tuntap | cut -f1 -d:`
    brctl addif br0 ${tap}

}
        : (略)

上記を追加した part2 版が↓です。
$ curl -O http://sstea.blog.jp/raspi/script/vpnserver2 > vpnserver
$ chmod 755 vpnserver
$ sudo mv vpnserver /etc/init.d/

◆tapデバイスの設定

Windows 側で「SoftEther VPN サーバー管理マネージャ」を立ち上げます。
前回の (F-2)  ~ (F-4) の部分の設定を変えます。

メインウィンドウから「ローカルブリッジ設定」ボタンを押下し、「ローカルブリッジ設定」ウィンドウを出します。
「ローカルブリッジの削除」ボタンで前回追加した設定は一旦、削除します。

(F-2)' [新しいローカルブリッジの定義]->[仮想 HUB] を選択
(F-3)' [作成する種類] で「新しい tap デバイスとのブリッジ接続」を選択
(F-4)' [新しい tap デバイス名] を入力
(F-5)' 「ローカルブリッジを追加」ボタンを押下


これで、VPN 経由でも Raspberry Pi 上の web サーバーにアクセス出来るようになりました。

これからは Raspberry Pi を VPN サーバーとして常時稼動させようと思いますので、どれほどの省電力効果があるか分かりませんが、オーバークロック設定は None に戻しておこうと思います。

◆おまけ1
Xperia Z3 には以下のAndroidアプリを入れています。

・WOL用アプリ
Fing - Network Tools

LAN内のマシンを自動的に検出してくれるので、MACアドレスとか入力しなくてもよくてお手軽です。

・リモートデスクトップ用アプリ
Splashtop 2 Remote Desktop

リモートデスクトップでアクセスしたいマシンに Splashtop Streamer をインストールしておく必要はありますが、軽い動画くらいなら普通にリモートデスクトップ経由で見れるくらいのポテンシャルを持ってます。(音も鳴ります)

外出先から VPN 接続し、上記アプリを使用して PC の電源を入れてリモートデスクトップで操作、という事が普通にできてます。

◆おまけ2
Windowsマシンでの動画再生には VLC メディアプレイヤーを使ってるんですが、Splashtop のリモートデスクトップ経由で動画再生した時に、VLC のウィンドウ内が真っ黒で動画が見えないことがありました。

VLC の[ツール]->[設定]->[ビデオ]->[ディスプレイ]->[出力] を「Direct3Dビデオ出力」に設定することで、表示されるようになりました。

Raspberry Pi を VPN サーバーにする

今回は、外出先から家のPCにアクセスするために Raspberry Pi を VPN(Virtual Private Network) サーバーにしてみたいと思います。
SotfEther VPN というOSSのVPNソフトがありますので、それを今回は使用してみる事にします。

以下の要件を満たす事が可能な環境を構築する事を目指します。

・PCの電源が落ちていれば外出先から電源投入できる(Wake On LAN)。
・外出先からPCにスマホのリモートデスクトップアプリでアクセスできる。
・外出先から前回作ったwebブラウザで Raspberry Pi を操作できる。
・セキュリティとかあんまり詳しくないので、そのあたりは良きに計らってくれる。

◆VPN(SoftEther) サーバーソフトのインストール
https://ja.softether.org/4-docs/1-manual/7/7.3 を参考にインストールしました。

http://www.softether-download.com/ja.aspx から SoftEther VPN Server の ARM EABI 版をダンロードし、展開します。
(現時点の最新は v4.15-9546-beta-2015.04.05 でした)
$ wget http://jp.softether-download.com/files/softether/v4.15-9546-beta-2015.04.05-tree/Linux/SoftEther_VPN_Server/32bit_-_ARM_EABI/softether-vpnserver-v4.15-9546-beta-2015.04.05-linux-arm_eabi-32bit.tar.gz

$ tar xvzf softether-vpnserver-v4.15-9546-beta-2015.04.05-linux-arm_eabi-32bit.tar.gz
$ cd vpnserver/
$ make

後は、何回か「1」を押してもらえればいいです。。


公式のマニュアルでは vpnserver は /usr/local/vpnserver に移動させていますが、自分は /home/pi/local/vpnserver に移動しておきます。(個人的な趣味です。)

公式マニュアルに従って、root のみ実行可能なように権限変更を行なっておきます。
$ mv vpnserver /home/pi/local/vpnserver

$ cd /home/pi/local/vpnserver/
$ chmod 600 *
$ chmod 700 vpncmd vpnserver

$ cd ../
$ sudo chown -R root:root vpnserver/
vpncmd の check コマンドで動作チェックできます。
$ cd /home/pi/local/vpnserver/
$ sudo ./vpncmd

◆VPN のスタートアップスクリプトを登録

公式のスタートアップスクリプトやその他諸々を参考に書きました。

/etc/init.d/vpnserver
#!/bin/sh
### BEGIN INIT INFO
# Provides:       vpnserver
# Required-Start: $local_fs $network
# Required-Stop:  $local_fs $network
# Default-Start:  2 3 4 5
# Default-Stop:   0 1 6
# Description:    SoftEther VPN Server
### END INIT INFO

DAEMON=/home/pi/local/vpnserver/vpnserver
LOCK=/var/lock/vpnserver

vpn_start() {
    ${DAEMON} start
}

vpn_stop() {
    ${DAEMON} stop
}

test -x ${DAEMON} || exit 0

case "$1" in
start)
    vpn_start
    touch ${LOCK}
    ;;
stop)
    vpn_stop
    rm ${LOCK}
    ;;
restart)
    vpn_stop
    sleep 3
    vpn_start
    ;;
*)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
esac

exit 0

上記を実行権限を与えて、 /etc/init.d/ 直下に移動し、ブート時に自動起動するように登録します。
$ curl -O http://sstea.blog.jp/raspi/script/vpnserver
$ chmod 755 vpnserver

$ sudo mv vpnserver /etc/init.d/
$ sudo chkconfig --add vpnserver

VPNサービスを開始します。再起動でもいいです。ブート時に自動起動するので。
$ sudo /etc/init.d/vpnserver start

◆VPNの設定
VPNの設定は Windows 側から行なえるので楽でした。

http://www.softether-download.com/ja.aspx から「SoftEther VPN Server Manager for Windows」をダンロードし、windows マシンにインストールし、管理ツールを実行します。

(A-1) 「新しい接続設定」ボタンを押下
(A-2) 「新しい接続設定の作成」ウィンドウが出るので、[接続設定名], [ホスト名] をそれぞれ入力し、[OK]
(A-3) 「接続」ボタンを押下
ss_softether01
ss_softether02
(B-1) メインのウィンドウ(「VPN サーバー管理マネージャ」)が出るので、「仮想 HUB の作成」ボタンを押下
(B-2) 「仮想 HUB の新規作成」ウィンドウが出るので、[仮想 HUB 名] を入力し、[OK]
ss_softether03
ss_softether04

(C-1) メインウィンドウに戻り、「仮想 HUB の管理」ボタンを押下
(C-2) 適宜「ログ保存設定」を設定(変更しなくても可)
(C-3) 「仮想 HUB の管理」ウィンドウが出るので、「ユーザーの管理」ボタンを押下
ss_softether05

(D-1) 「ユーザーの管理」ウィンドウが出るので、「新規作成」ボタンを押下
(D-2) [ユーザーの新規作成]ウィンドウが出るので、[ユーザー名], [パスワード] を入力し、[OK]
ss_softether06
ss_softether07

(E-1) メインウィンドウに戻り、「IPsec / L2TP 設定」ボタンを押下
(E-2) 「IPsec / L2TP / EtherIP / L2TPv3 設定」ウィンドウが出るので、[L2TP サーバー機能を有効にする(L2TP over IPsec)] をチェック
(E-3) [IPsec 共通設定]->[IPsec 事前共有鍵] を入力し、[OK]
ss_softether08

(F-1) メインウィンドウに戻り、「ローカルブリッジ設定」ボタンを押下
(F-2) 「ローカルブリッジ設定」ウィンドウが出るので、[新しいローカルブリッジの定義]->[仮想 HUB] を選択
(F-3) [作成する種類] で「物理的な既存の LAN カードとのブリッジ接続」を選択
(F-4) 「ローカルブリッジを追加」ボタンを押下
ss_softether09

(G-1) メインウィンドウに戻り、「ダイナミック DNS 設定」ボタンを押下
(G-2) 「ダイナミック DNS 設定」ウィンドウが出るので、[設定の変更]->[ダイナミック DNS ホスト名の変更] を入力
(G-3) 「上記の DNS ホスト名に変更する」ボタンを押下
ss_softether10

◆ルーターの設定
外出先から Raspberry Pi にアクセスするためには、ルーターのポートを開放しておく必要があります。
L2TP/IPSec を使用する場合、500(UDP) と4500(UDP) の2つのポートを開放する必要があります。

ルータによって「ポートフォワーディング」とか「ポートマッピング」とかで設定できるはずです。
ちなみに、うちにあるルーター(CG-WLR300NM)の場合は、[詳細設定] ->[バーチャル・サーバ(ポート開放)] で設定しました。

だいたいのルーターは設定後、ルーターを再起動させれば反映されると思います。

◆VPN接続テスト
スマホ側からVPN接続できるか確認してみます。
下記は Xperia Z3 の場合の設定例です。

(1) [設定]->[Wi-Fi] を OFF (同一LAN 内の場合)

(2) [設定]->[その他の設定]->[VPN] に移動

(3) [VPNプロフィールの追加]
     「名前」を適宜入力
     「タイプ」に [L2TP/IPSec PSK] を設定
     「サーバーアドレス」に (G-2) で入力したホスト名を入力
     「IPSec事前共有鍵」に (E-3) で入力した事前共有鍵を入力
ss_xperia_vpn01

(4) 追加したVPNプロフィールに接続
      「ユーザー名」、「パスワード」に (D-2) で入力したユーザー名、パスワードを入力し、接続


VPN接続が正常に行なえたなら、リモートデスクトップ、WOLもアプリ入れればローカルIPアドレスで可能と思います。
※ただし現段階では、VPN 経由での前回作ったwebブラウザ経由での Raspberry Pi 操作ができません。

ちょっと長くなってきたので、今回はここまでです。
次回、上記課題の解決を試みます。

Raspberry Pi をスマホで操作する

以前にジョイスティックで Raspberry Pi の操作を試みましたが、よく考えたら「スマホで操作できたらそれでいいんじゃない?」(半年前にXperia Z3を買ったので。)と思いましたので、今度はスマホでの Raspberry Pi の操作にチャレンジしたいと思います。

スマホ(Xperia Z3)からウェブブラウザ経由で Raspberry Pi のリブート等の操作ができる事を目指します。

ちなみに操作画面のイメージは↓こんな感じです。
(Xperia Z3からドルフィンブラウザでアクセス)
ss_xperia_cmd01

このあたりについては専門外なのでカッコいいUIの操作画面とかまで求められても、自分には無理です。
動くことをもって良しとしてください。

◆apache, php のインストール
まずは必要なパッケージをインストールします。
$ sudo apt-get install apache2 php5

以前に /var/log/ 以下はRAMディスクを使用するようにしていましたので、/etc/init.d/init-ramdisk に下記を追記しておきます。
mkdir -p /var/log/apache2/

◆Raspberry Pi 操作用 html & php

google 先生に訊きながらいろいろ参考にして作ってみましたが、正直、自分は素人なので、無駄な事や一般的でない事等、いろいろイケてない事とかしてるかもしれません。。。ご容赦を。

command.html
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta http-equiv="Content-Script-Type" content="text/javascript" />
  <meta http-equiv="Content-Style-Type" content="text/css" />
  <script type="text/javascript">
//<![CDATA[
function createXMLHttpRequest() {
  if (window.XMLHttpRequest) {
    return new XMLHttpRequest();
  } else {
    return new ActiveXObject("Microsoft.XMLHTTP");
  }
}

function entryClickEvent(id, handler) {
  var obj = document.getElementById(id);
  if (window.addEventListener) {
    obj.addEventListener("click", handler, false);
  } else {
    obj.attachEvent("onclick", handler);
  }
}

function doCommand(command) {
  var request = createXMLHttpRequest();
  request.open("POST", "command.php", true);
  request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  request.send("cmd=" + encodeURIComponent(command));
}

function doCommandConfirm(command)
{
  ret = confirm("本当に実行してもよろしいですか?\n" + command);
  if (ret == true) {
    doCommand(command);
  }
}

function command1() {
  doCommand("mpc prev");
}
function command2() {
  doCommand("mpc toggle");
}
function command3() {
  doCommand("mpc next");
}
function command4() {
  doCommandConfirm("sudo shutdown -r now");
}
function command5() {
  doCommandConfirm("sudo shutdown -h now");
}

window.onload = function() {
  entryClickEvent('btn1', command1);
  entryClickEvent('btn2', command2);
  entryClickEvent('btn3', command3);
  entryClickEvent('btn4', command4);
  entryClickEvent('btn5', command5);
}
//]]>
  </script>
  <title>command</title>
</head>
<body>
  <center>
  <input type="button" id="btn1" value="<<" style="width:30%; height:50%; font-size:35px" />
  <input type="button" id="btn2" value="mpc" style="width:30%; height:50%; font-size:35px" />
  <input type="button" id="btn3" value=">>" style="width:30%; height:50%; font-size:35px" />
  <input type="button" id="btn4" value="reboot" style="width:45%; height:20%; font-size:40px" />
  <input type="button" id="btn5" value="shutdown" style="width:45%; height:20%; font-size:40px" />
</body>
</html>

command.php
<?php
$command = filter_input(INPUT_POST, "cmd");
if ($command) {
  shell_exec($command);
}
?>
php スクリプトで html から渡された文字列をシェルコマンドとして実行します。
html ファイルのシェルコマンドの部分を他のコマンドに置き換える事で、簡単に改造できると思います。

※外部に公開するwebサーバーでは導入しないでください

$ curl -O http://sstea.blog.jp/raspi/web/command.html
$ curl -O http://sstea.blog.jp/raspi/web/command.php
$ sudo mv command.html /var/www/
$ sudo mv command.php /var/www/


http://192.168.0.100/command.html にブラウザでアクセスし、ちゃんと動くかテストしてみてください。
PCからでも、スマホからでもいけると思います。
(reboot と shutdown はまだ出来ません。)

# ↑IPアドレス部分は raspberry pi のIPアドレスを指定して下さい。

自分の Xperia Z3 では上記アドレスをブックマークに登録し、ホーム画面にショートカットを作る事で、ワンタッチですぐにアクセス可能にしています。

◆php から sudo コマンドを実行できるようにする
今のままでは、sudo を含むシェルコマンドは実行できませんので、reboot, shutdown が出来ません。
これを実行できるようにします。

$ sudo visudo
 で /etc/sudoers の末尾に以下を追記しておきます。一応、実行可能なコマンドを絞っておきます。
www-data ALL=(ALL) NOPASSWD: /sbin/shutdown
(実行可能コマンドはコンマで区切ることで、複数コマンドを指定可能です。)

これで Raspberry Pi の再起動、シャットダウンもスマホから可能になりました。
ただし、現状は LAN 内からしか操作はできません。
VPN(Virtual Private Network) を構築すれば、LAN 外からでも Raspberry Pi を操作可能になります。


◆おまけ1
以前に作った talk.sh を html ファイルのシェルコマンドの部分に指定して、ボタンを押したら喋るようにしようと思ったのですが、最初はうまく動きませんでした。

sudo 付ければちゃんと喋ってくれましたので、権限関連の問題かと思っていろいろ試していたところ、www-data に権限を追加することで、sudo 無しでも無事に喋ってくれるようになりました。
$ sudo usermod -G audio -a www-data

はじめてのスマホ(環境構築週間)

◆Xperia Z3 スマホ環境、構築中...

とりあえずスマホを買ったので、買った当日中に、最低限、電話とメールだけは試行しておきました。
仕事に支障出るとまずいので。
あと、Wifi の設定。
家のネットインフラはほぼ有線オンリーなんで、追々、調べて設定見直します。

次に手を付けたのが、通信関連とバッテリー関連。
一応、一ヶ月の通信量に制限かけられてるので、何をしたらどれくらいの通信量になるか、感覚を知るために。
バッテリーも、何をしたらどれくらい減るものなのか、感覚を知るために。
(ガラケー生活が長かったので、、、)

いろいろ調べた結果、「通信量モニター」というのと「Battery Mix」というのを入れてみる。

特に深くは考えずにアンチウィルスソフトはAVGのを入れときました。
ファイラーは何個見てみましたがESファイルエクスプローラーが自分には合いそうと思ったのでこれを入れました。

いろいろ不要そうなプリインストールアプリはアンインストール、または無効化。

◆リモートデスクトップAndroidアプリ
あとはいざと言う時のために、外から家PCに繋ぎたいので、リモートデスクトップアプリを選定中。。。

リモートデスクトップ用のポート番号は変更済み。ルータのポートマッピングも設定済み。
他のPCからリモートデスクトップ出来るのは確認済みの環境。

以下、試してみた感想。
ホスト側でVLCで動画を再生してみてリモートデスクトップしてどれくらいリアルタイム性があるのか。

- Microsoft Remote Desktop
  本命。だったのだが、たまにカクツク。
  音も鳴るが、ちょいちょい飛ぶ。
  リモート中はホストマシンは操作できなくなる。(ログイン画面になる)

- Chrome リモート デスクトップ
  次の本命。結構サクサク動く。
  ポートとか空けてなくても外から普通に繋げそう。
  ただ、音が鳴らない。。。
  リモート中もホストマシンは変わらず操作できる。
  あと、家PCはデュアルディスプレイなので、リモート画面が横に凄く長い。
  (二画面並んだ画面が一画面としてスマホに表示される)

- PocketCloud リモートデスクトップ
  あまり印象に残っていない。
  カクツいたので、自分の中では候補から早々に消えた。

- Splashtop 2 Remote Desktop
  サクサク動く。音も鳴る。これいい!!
  リモート中もホストマシンは変わらず操作できる。
  「インターネット経由でのアクセス」は有料プラグイン(?)で対応、みたいな事書いてあったが、
  IPアドレスの入力設定をしたら、3G経由でも普通に繋がった。
  (ただし、よそのwifi(公衆無線LANスポットとか)からは無理でした。
    → 後日、VPN 環境を構築することで、公衆無線LANスポットからも繋がりました。)

聞いたことないソフトだったがSplashtopが第一候補。次点がGoogleのやつ、の二択になりました。

プライバシーポリシー
当サイトでは、Googleを含む第三者配信事業者や広告ネットワークが配信する広告を掲載しています。
当サイトでは、アクセス情報に基づいた適切な広告表示、及びトラフィックデータ収集のためにCookieを使用しています。
ユーザーはCookieの無効化により、これらの情報の提供を拒否する事ができます。
スポンサーリンク
記事検索
スポンサーリンク