前回記事の最後で、3月初旬くらいには負荷低減を図ったバックアップスクリプトをー、なんて書いてましたが、思ったより負荷が下がらなかった(それどころか上がってた) ので、一月くらい様子を見ていたのだけど、やっぱり負荷が下がる様子はないため、再度検証しないとーと思いつつ微妙に放置してたり←今ここ
そんな感じで自身のWolf Boyぶりを見せつけつつ、その合間で軽くやってた作業をネタに、ブログ更新をしてみんとするなり。いとおかし。
……で、内容はタイトルが全てを語っているのだけれど、何度かブログでも書いた通り、自分は動的IPのプロバイダーと固定IPプロバイダー(以前はやまぐちブロードネットだったけど、アクセス不能になったので インターリンク に乗り換えた) を契約していて、管理しているVPS等については固定IPのプロバイダー経由で、その他のサイト等へは動的IPプロバイダー経由でアクセスするようにしている。
契約しているインターリンクの固定IP料金は安いのだけれども、当初予定していた自宅でのサーバー公開も当面(いろいろ環境整備をやる予定なので) できなさそうだし、現状はセキュリティ強化の為にしか利用していないため、そのために契約続けるのはもったいない気がしていたので(あとフレッツ接続のセッションを空けたかったという理由もあり)、インターリンクを解約して、その代わり IDCFクラウド 経由で各サーバーにアクセスすればいいんじゃね? ということでやってみたのが経緯。
単に通信経由するだけならsshとかstoneでいいんだけれど、SoftEtherを使ったのは、L2TP/IPSecな環境も同時に作れるのと、スタティックルート設定して繋ぎっぱなしにしておけば、いつでもすぐにサーバーにアクセスできるからという理由。あとは、インターリンク提供の マイIP ソフトイーサ版 とほぼ同じサービスが、低コストで作れるかなーという興味から。
月500円から使えるという IDCFクラウドのサービスあってこその方法な訳で(これ以上のコストがかかるなら、普通に固定IP接続してもそんなに差がないし)、高速かつ低廉なサービスを提供してくれているIDCフロンティアに感謝しつつ、相変わらず長い前置きではじまりはじまりー。
図の画像は YAMAHA様のフリー素材 を利用させていただきました。で、内容としてはだいたいこの図の通りなのだけど、簡単にそれぞれ説明すると、まず自宅のアクセス元マシンにSoftEtherクライアントを導入。アクセス先サーバーには導入していない(IDCFクラウドの固定IPアドレスからのみ接続を許可)。これは、多少なりともリソースを食うかもという懸念と、各サーバーにクライアント導入するのはちょっと手間なので。
IDCFクラウド側では、仮想マシンにSoftEther VPN Serverを導入し、tapデバイスとしてtap_vpnを追加。そちらにローカルIPアドレスを割り当て、自宅PCからのSSHd接続等もローカルアドレスを指定してアクセスしている。SSHdポートを外部に開放しないことで、多少なりともセキュリティレベルが上がるかなと。
あと図に書いていない部分としては、SoftEther VPN Server側でSecureNATを有効にしているとか、L2TP/IPSecも有効にして、スマートフォンなどからも安全に通信できるようにしたとか、自宅PCにはスタティックルート設定して、アクセス先サーバーへのアクセスはSoftEther VPN Server経由になるようにしたとか、それくらいかな。その辺りも含めて以下にまとめていきます。
IDCFクラウド自身の初期設定は省略します。仮想ルーターがあって、そこからポートフォワードとファイアーウォールに穴を空けないとダメという部分以外は、他のVPSサービスとあまり差はないので、自分は過去記事 GMOクラウドVPSの初期設定 と同じように設定しています。設定時にはSSHdだけでなく、SoftEther VPN Serverが使用するポート番号も忘れずに、ポートフォワードとファイアーウォール許可設定を行ってください。
また、IDCFクラウドの最安プランだとスワップ領域がないので(CentOS 6パッケージの場合)、念のためにスワップファイルを設定しました。ストレージ容量は食いますが、今回の用途ではまず使い切ることはないですし、ストレージにはSSDが使われているので、仮にスワップアウトしてもHDDほど速度低下はないかなということで。
こちらのサイト様 の情報を参考に、
# dd if=/dev/zero of=/swap bs=1M count=2048 # mkswap /swap # swapon /swap
として、2GBのスワップ領域を追加します。後は起動時に自動マウントさせるために、
# vi /etc/fstab
と入力し、
/swap swap swap defaults 0 0
という行を追加しました。
SoftEther VPN Serverのインストールについては、公式ドキュメント がものすごく詳しく、ほぼこの通りにやっているので、そちらをご参照ください。ただ、IDCFクラウドのCentOS 6のイメージにはgccが入ってなかったので、
# yum install gcc
としてインストールしました。これ以外には特に不足したパッケージはなかったかと。
その後、公式マニュアルに従い、ダウンロードしたSoftEtherパッケージを解凍、make、/usr/localにvpnserverディレクトリを移動してパーミッション設定、動作確認、スタートアップスクリプトの登録、サービスの開始まで行います。
IDCFクラウド側のファイアーウォール・ポートフォワード設定を行い(iptablesも設定していたらそちらにも穴を開けて)、クライアントからSoftEther VPN サーバー管理マネージャで接続できるようにします。
問題なく接続できたら、まず仮想ハブを作ります。下の画面のように、仮想HUBの作成 ボタンをクリックします。
今回の例では、test という名前で仮想ハブを作ります。こんな感じに設定したらOKボタンを押します。
testハブが作成できていれば、ローカルブリッジ設定 ボタンをクリックして、tapデバイスの作成画面に移ります。(この画像はすでに運用中のサーバーのものをキャプチャしているので、仮想HUB名の表示位置がおかしいですが、ご了承ください)
ローカルブリッジの設定に移ったら、tapデバイスを追加します。今回の例では、仮想ハブ test に紐付く tap_vpn というtapデバイスが作成されます。問題なければ、ローカルブリッジを追加 ボタンを押します。
次のような警告が出ますので、間違いなければ はい を押して進めます。今回の例のように、SoftEtherがVM内で動いている場合には、追加で注意事項が表示されますので、確認してOKボタンを押します。
こんな感じで、ローカルブリッジが作成され、動作していたらOKです。
コンソールからも確認しておきます。
[root@CentOS ~]# ifconfig -a eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX inet addr:XXX.XXX.XXX.XXX Bcast:XXX.XXX.XXX.255 Mask:255.255.248.0 inet6 addr: XXXX::XXXX:XXXX:X/XX Scope:Link UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:887131 errors:0 dropped:0 overruns:0 frame:0 TX packets:559773 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:99542907 (94.9 MiB) TX bytes:92540630 (88.2 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:31 errors:0 dropped:0 overruns:0 frame:0 TX packets:31 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:7779 (7.5 KiB) TX bytes:7779 (7.5 KiB) tap_vpn Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX inet6 addr: XXXX::XXX:XXXX:XXXX:XXXX/XX Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:48 errors:0 dropped:0 overruns:0 frame:0 TX packets:124 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:4128 (4.0 KiB) TX bytes:10232 (9.9 KiB)
このように、tap_vpn が作成されていればOKです。
ここで、SoftEther VPN Server起動時に、tapデバイスにIPアドレスを割り振るため、スタートアップスクリプトも修正しておきます。PCリンクス様のサイト を参考に、
# vi /etc/init.d/vpnserver
として、以下のような内容に書き換えました。(例では、tap_vpn に 192.168.100.2 を割り当てています)
#!/bin/sh # chkconfig: 2345 98 01 # description: PacketiX VPN Server 4.0 DAEMON=/usr/local/vpnserver/vpnserver LOCK=/var/lock/subsys/vpnserver test -x $DAEMON || exit 0 case "$1" in start) $DAEMON start sleep 5 touch $LOCK # tapデバイスにIPアドレスを指定 /sbin/ifconfig tap_vpn 192.168.100.2 netmask 255.255.255.0 ;; stop) $DAEMON stop sleep 2 rm $LOCK ;; restart) $DAEMON stop sleep 2 $DAEMON start sleep 5 # tapデバイスにIPアドレスを指定 /sbin/ifconfig tap_vpn 192.168.100.2 netmask 255.255.255.0 ;; status) if [ -e $LOCK ] then echo "vpnserver is running." else echo "vpnserver is not running." fi ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac exit 0
一度サービスを再起動して、IPアドレスがきちんと割り当てられるか確認します。
# service vpnserver restart
として、以下のようにIPアドレスが割り当てられればOKです。
[root@CentOS ~]# ifconfig -a eth0 Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX inet addr:XXX.XXX.XXX.XXX Bcast:XXX.XXX.XXX.255 Mask:255.255.248.0 inet6 addr: XXXX::XXXX:XXXX:X/XX Scope:Link UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 RX packets:887131 errors:0 dropped:0 overruns:0 frame:0 TX packets:559773 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:99542907 (94.9 MiB) TX bytes:92540630 (88.2 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:31 errors:0 dropped:0 overruns:0 frame:0 TX packets:31 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:7779 (7.5 KiB) TX bytes:7779 (7.5 KiB) tap_vpn Link encap:Ethernet HWaddr XX:XX:XX:XX:XX:XX inet addr:192.168.100.2 Bcast:192.168.100.255 Mask:255.255.255.0 inet6 addr: XXXX::XXX:XXXX:XXXX:XXXX/XX Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:48 errors:0 dropped:0 overruns:0 frame:0 TX packets:124 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:500 RX bytes:4128 (4.0 KiB) TX bytes:10232 (9.9 KiB)
続いては、再びSoftEther VPN サーバー管理マネージャを使用して設定を行っていきます。
SoftEther VPN サーバー管理マネージャから、仮想HUBの管理ボタンを押すと、下記のようなウインドウが開きます。まずは、仮想NATおよび仮想DHCPサーバー機能 ボタンを押します。
別ウインドウが開いたら、SecureNATの設定 ボタンを押します。
SecureNAT管理画面が開いたら、SecureNATとDHCPの使用にチェックが入っているか確認します。今回の例では、192.168.100.0/24 を使用するので(tap_vpnもそれに合わせたので)、そのように設定し、OKボタンを押します。(デフォルトでは 192.168.30.0/24 )
元の画面に戻ったら、SecureNAT機能を有効にする ボタンを押します。そうすると、下の画面のような警告が出るので、OKを押して進めます。
SecureNAT機能を有効にする ボタンがグレーアウトし、動作が確認できたらOKです。閉じるボタンを押して仮想ハブ管理画面に戻ります。
続いて ユーザーの管理 ボタンを押して、仮想ハブにアクセスできるユーザーを追加します。こちらはユーザー名とパスワードを設定するくらいなので割愛します。グループを作ってそれぞれにアクセス制御もできますが、自分専用のシステムなので、ユーザー追加するだけとしました。
最後にL2TP/IPsec設定を行います。SoftEther VPN サーバー管理マネージャから、初めてSoftEther VPN Serverにアクセスした時に設定していれば不要ですが、もしそれを行っていない場合は、仮想ハブの管理画面を閉じ、サーバー管理のトップに戻って IPsec / L2TP 設定 ボタンを押します。
設定画面が開いたら、L2TPサーバー機能を有効にする(L2TP over IPsec) にチェックし、IPsec 事前共有鍵を設定します。設定が終わったら、OKボタンを押して閉じます。
ここまででSoftEther VPN Server側の設定は終わりましたので、続いてクライアント側の設定を行っていきます。
Windows環境なら、インストールに迷うところはないので割愛します。インストールが終わったら仮想LANカードを作成し、新しい接続設定の作成 をダブルクリックして、SoftEther VPN Server への接続を作成します。
設定画面が開いたら、IDCFクラウドのホストアドレス、接続先の仮想ハブ名、登録したユーザー名とパスワードを入力してOKボタンを押します。
ただしこのままでは、SoftEther VPN Clientで作られる仮想LANカードのメトリック値が1になっているため、全ての通信がIDCFクラウドを経由してしまいます。また、DHCPでIPアドレスを自動設定するようにしていると、メトリック値を変更してもデフォルトゲートウェイが変更されてしまい、SoftEther VPN Server経由で通信するようになるため、IPアドレスも固定しておきます。ただし、既存ネットワークもDHCPでIPアドレスを自動取得している場合はメトリック値の変更だけでうまくいったので、その場合はIPアドレス固定部分は省略してもOKです。
設定は、Windowsのコントロールパネルから、ネットワークと共有センター を開き、左メニューにある アダプターの設定の変更 をクリックします。
SoftEther VPN Clientの仮想LANカードを右クリックしてプロパティを開き、インターネット プロトコル バージョン 4 を選び、プロパティ ボタンを押します。
次のIPアドレスを使う にチェックを入れ、IPアドレスを指定します。今回の例では、DCHPスコープ対象外の 192.168.100.5 としました。デフォルトゲートウェイは空欄とし、優先DNSサーバーに SecureNATサーバーアドレスである 192.168.100.1 を指定します。入力が終わったら、右下の 詳細設定 ボタンを押します。
初期状態では、一番下の 自動メトリック チェックが付いておらず、数字が 1 になっているので、これを大きい数字に変更します(この例では20としました)。設定が終わったらOKボタンを押していき、保存します。
同じ要領で、実LANカードのメトリックも自動から手動にしておきます。この例では1にしていますが、無線LANなど複数のネットワークがある場合、意図しないルートでネットワークに繋がる可能性があるため、注意して値を決めてください。
ここまで終わったら、最後にスタティックルートの設定を行います。Windowsのスタートメニューから、コマンドプロンプトを右クリックし、管理者として実行します。コマンドプロンプトが開いたら、次のようにスタティックルートを設定します。
route -p add アクセス先のサーバーアドレス ゲートウェイアドレス
例えばこの guilz.org に対してなら、以下のようになります。
route -p add 153.122.4.28 192.168.100.1
ルートを追加したら、下記コマンドで確認します。
route print
IPv4 ルート テーブル に指定したルートが追加されていればOKです。自分の場合は、特にインターフェイス名の設定をしなくても繋がりましたが、場合によっては使用インターフェイスの設定が必要かもしれません。その場合はこちらの 参考サイト様 の情報を参考に設定してみてください。
これで特定のサーバーのみIDCFクラウドを経由し、それ以外については自宅プロバイダを経由する環境ができました。また、外出先のパブリックWi-Fiアクセスポイントにスマートフォン等を接続するときも、L2TP/IPsecでVPN接続することで、安心して通信できるようになります。
正常にSoftEtherクライアントからサーバーに接続でき、今回の例で設定した 192.168.100.2(tapデバイスに割り当てたアドレス) へのSSH接続もできるようになったら、IDCFクラウド側で設定したSSHdへのポートフォワードとファイアーウォールの通過設定を削除します。
理由としては、SSHdをどこからでも繋がるように開けっ放しにするのは、ちょっと気分的に良くないから(iptablesで日本のIPアドレスからのみ接続できるようにはしていますが) というだけなのですが、SoftEtherだけにしておいた方が、気にしないといけない部分が減るのでいいかなと。
ちなみにtapデバイスを追加したりIPアドレスを割り当てたりという部分は、全てそのために行っているので、SSHd開けっ放しでもいいよという方はその辺り全てスキップしてもOKです。ただ、次のあとがきで触れる、外部へのサーバー公開をSoftEther経由で行うなら必要なので、そういう用途があるならtapデバイスも設定しておいてください。
もちろんセキュリティを気にするなら、SoftEther VPN Serverの待ち受けポート変更や、iptables等によるアクセス元制限も追加で行う方が望ましいので(自分もそうしています)、それも設定しておきましょう。L2TP/IPsecの待ち受けポート番号は変えられないので、そちらは目をつぶる必要がありますけどね。
書き始めたときはもっと短く終わるはずだったのに、今回もかなりの長さになってしまいました……。余談が長いからだろという声も聞こえてきそうですが、それを無くしてしまうと自身のレゾンデートルが全否定されてしまうので、今後もこんな感じでグダグダと。
今回作成したSoftEther VPN Serverの負荷については、1日繋ぎっぱなしにして、SSHとか軽く使った感じでは、トラフィックが50MB/dayもいっていなかったので、一ヶ月繋ぎっぱなしでも余裕で3TB/月の無料範囲を超えることはなさそうです。CPU・メモリ負荷もtopの数字やuptimeを見る限りでは、ほぼ下限に張り付いていたので、大きな負荷はかけていないと考えられます。
また、この記事を書き始めてから、Twitterでサーバー公開もできますね、というレスポンスをいただき、確かに今回のように単なるゲートウェイとしての利用だけでなく、サーバー公開にも使えることに気づいたので、そっち関係の実験や追記もしようかと思いましたが、既にかなりの長さになってしまっているので、そちらは割愛いたします。すみません。
方法としては、IDCFクラウドの仮想ルーターは契約している仮想マシンにしかポートフォワード設定ができないため(当然といえば当然ですが)、仮想マシンにポートフォワードさせた上で、iptables等を使って、SoftEther VPN Clientを導入した別サーバーにポートフォワード(宛先NAT変換) する、という形になるかなと。下記のようなイメージですね。
いずれそういった方法も試してみたいと思いますが、とりあえず今回はこの辺でー。SoftEther VPN環境はfoltia ANIME LOCKERにも導入し、外出先でも動画閲覧できる環境を整えたので、次はその話でも書きたいと思います。
最後になりましたが、たった数時間で安定したVPN環境を作れるという、素晴らしいソフトウェアを無料で公開されているSoftEther社の皆様と、低価格で高速なクラウド環境を利用できるIDCFクラウド様に感謝いたします。本当に、この記事で書いたくらいのVPN環境は数時間で作れるので、皆さんもよければお試しください。(VPN構築より、このブログ記事書いてる時間の方が長かったよw)