k_piの雑記帳

個人的に困った点と、その解決法などをつらつら書き連ねた備忘録を兼ねたブログ

VPSを用いたVPNサーバーの立て方(IDCFクラウド編)

 【動機】

前回同様、中国+香港に行く際に、セキュリティやグレートファイアウォール(金盾)のことを考え、
VPNを準備しておいたのだが、色々考え自力でVPNサーバーを準備した。

今回は、IDCFクラウドVPNサーバーを立てた話をする。
(DigitalOceanで立てた話は前回記事を参照)

【概要】

今回は、IDCFクラウドを利用したVPNサーバー(strongSwan)の立て方を紹介する。
IDCFでは一番安いプランは月当り500円なのでDigitalOceanと同じ価格で、有料VPNサービスより安く、
課金は時間割で1日(24時間)であれば1×24=24円で済み、
月課金額500円に到達後(稼働から約21日後)は定額になる。

サーバーのロケーション(場所)は、

から選べる。
VPNの用途によってはむしろ海外がいいという場合があるだろうが、
この場合は前回記事のようにDigitalOceanを利用すればいいだろう。)

 【手順】

 1.IDCFクラウドに登録する

IDCFクラウドYahoo!Japan系の企業なので、
フツーに日本語表記で登録に困ることはないかと思われる。

まず、「すぐに始める」をクリックし、名前、メールアドレス、希望のパスワードなどを入力。
続いて、電話(or SMS)認証、メールアドレス確認を経て、クレジットカード情報を入力。
ここで、使えればいいのだがまだ使えない。(´・ω・`)
(なお、クレジットカードのオーソリは1万円程度で出されるらしいので、一応注意)

この後、平日の日中から19時ぐらいまでに電話があり、簡単な本人確認をされる。
これでもってIDCFクラウドが使えるようになる。

祝日・休日にふらっと登録できないのは残念だが、登録さえしてしまえば楽に使える。

2.サーバーを借りる

登録後、ログイン後の画面、又は、画面上部のパンくずリストから、
東日本リージョン・西日本リージョンの好きな方を選択し、
(筆者は西日本リージョンを選択した。)
「コンピューティング」を選択する。

次に、「仮想マシン作成」を選択し、
筆者は、
性能(マシンタイプ):light.S1(一番安いやつ)
ディストリビューション(イメージ):Debian 8.2.0 64-bit
追加ボリューム:なし
マシン名:(適当に決める)
で作成した。

ここで、SSH keyを追加しておくと、すぐにSSH接続できるのでおすすめする。
WindowsTeratermを使っている人なら以下のサイトなどを参考にするといい。
SSH公開鍵暗号化方式-Tera Termで秘密鍵・公開鍵の作成 | Tera Term(テラターム)の便利な使い方

3.ファイアウォール・ポートフォワーディングの設定

ここで、IDCFクラウド側のファイアウォールとポートフォワーディングを設定する。

実は、IDCFクラウド仮想マシンは、それぞれグローバルIPアドレスを持っているわけではなく、
デフォルトでは、各ユーザー・リージョン毎にグローバルIPアドレスが振られており、
仮想マシンにはプライベートIPアドレスが振られている。

従って、インバウンドの通信はポートフォワーディングしてやる必要がある。

3.1.ファイアウォールの設定

ファイアウォール仮想マシン側で設定するなら、全て解放してやってもいいかと思われる。

画面左のメニューから「IPアドレス」を選択し、
恐らく「(no name)」となっているものを選択する。
次に、「ファイアウォール」を選択し、
「ALL TCP」・「ALL UDP」・「ALL ICMP」をそれぞれ「Any」に対して開放すればいい。

3.2.ポートフォワーディングの設定

同じ画面から、「ポートフォワード」を選択し、
ポート「TCP/22(SSH)」・「UDP/500(IKE)」・「UDP/4500(IPSec NAT-T)」を先ほど作成したマシンに向ける。

4.サーバーのセットアップをする

前回記事の「3.サーバーのセットアップをする」を参照)

ex.ネットワーク通信量が気になる人は・・・

IDCFクラウドでは、月のアウトバウンド通信量が3240GBを超えると、10円/GBで課金される。
普通にVPNサーバーとして使う分には超えるような通信量ではないが、
気になってしまうというような(私のような)人は、
下のようなスクリプトを「/root/tx.sh」に作成し、
(以下のスクリプトは上限が1024GBになっているので、適宜いじればOK)

#!/bin/bash
TX_BYTES_MAX=1099511627776
PERMISSIVE_SEC_DIFF=5
TX_SUM_FILE="/root/tx_sum.txt"

if [ -r "$TX_SUM_FILE" ]; then
if [ ! -w "$TX_SUM_FILE" ]; then
echo "error: tx_sum.txt is not writable."
exit 2
fi
read SYSTEM_UPDATE_OLD TRANSMIT_BYTES_OLD TRANSMIT_BYTES_TOTAL < "$TX_SUM_FILE"
if [ ! $? -eq 0 ]; then
echo "error: tx_sum.txt read error."
exit 3
fi
echo $SYSTEM_UPDATE_OLD
echo $TRANSMIT_BYTES_OLD
echo $TRANSMIT_BYTES_TOTAL
elif [ -e "$TX_SUM_FILE" ]; then
echo "error: tx_sum.txt is not readable."
exit 1
else
SYSTEM_UPDATE_OLD=0
TRANSMIT_BYTES_OLD=0
TRANSMIT_BYTES_TOTAL=0
fi

NOW_DATE=`date +%s`
SYSTEM_UPTIME=`cut -d "." -f 1 /proc/uptime`
SYSTEM_UPDATE=`expr $NOW_DATE - $SYSTEM_UPTIME`
TRANSMIT_BYTES=`cat /proc/net/dev | awk '$1=="eth0:" {printf $10}'`

SEC_DIFF=`expr $SYSTEM_UPDATE - $SYSTEM_UPDATE_OLD`
if [ $SEC_DIFF -gt $PERMISSIVE_SEC_DIFF ]; then
TRANSMIT_BYTES_TOTAL=`expr $TRANSMIT_BYTES_TOTAL + $TRANSMIT_BYTES_OLD`
fi

trap 'echo "${SYSTEM_UPDATE} ${TRANSMIT_BYTES} ${TRANSMIT_BYTES_TOTAL}" > "$TX_SUM_FILE"; exit 0' 1 2 3 15
while [ true ]; do
sleep 5
TRANSMIT_BYTES=`cat /proc/net/dev | awk '$1=="eth0:" {printf $10}'`
echo "${SYSTEM_UPDATE} ${TRANSMIT_BYTES} ${TRANSMIT_BYTES_TOTAL}" > "$TX_SUM_FILE"

TRANSMIT_BYTES_SUM=`expr $TRANSMIT_BYTES + $TRANSMIT_BYTES_TOTAL`
if [ $TRANSMIT_BYTES_SUM -gt $TX_BYTES_MAX ] ; then
ifdown eth0
fi
done

次に、下のコマンドでサービス化してしまえばいいと思う。

chmod 700 /root/tx.sh
/lib/systemd/system/tx_limit.serviceを作成
(内容:
[Unit]
Description=transmit limitter
After=network.target

[Service]
ExecStart=/root/tx.sh
KillMode=process
Type=simple
Restart=always

[Install]
WantedBy=multi-user.target
)
systemctl enable tx_limit.service

このサービスは再起動しても、OKなようにしているが、
月跨ぎの際に通信量カウントをリセットするようにはできていないので、
スクリプトを組んで、月初めに「rx_sum.txt」をいじる+サービスの再起動をcronにセットしておけばいい。

5.各端末をセットアップ

Androidなら、VPN 設定ガイド - sonymobileなどを参考に、
Windowsなら、在宅勤務を実現するリモート・アクセスVPN構築術:最終回 Windows OSで作るVPNサーバ (6/8) - @ITなどを参考に設定すると良い。

【最後に】

IDCFクラウドは登録が面倒だが、日本にサーバーを格安で借りれるのがありがたい。
Webサーバーなどの用途でも重宝しそう。(^。^)

無論、海外からのVPN接続も大丈夫で、満足いくものだった。

(余談:なお、IDCFクラウドが提供している「リモートアクセスVPN」は各仮想マシンにアクセスするためのもので、今回の用途には使用できない。)