uzullaがブログ

uzullaがブログです。

雨と涙とOpenVPN

たんなる愚痴と、最近のOpenVPNでちょっと前とかわっていたので、私のメモです。

先日…

「では、今日からこのWindowsサーバー管理してくださいね。でもFirewallによって守られているので、通常は接続はできません」
「了解です、では私のIPは…」
「いや、それにはおよびません!「ほげほげびゅーわー』というアプリがありますので!それで踏み台になる私のPC経由で接続してください!」
「エッ…是非FWの設定かえてほしいのですが」
「色々(略)な(略)理由(略)で、FWだけは変えられません!」
「そうですか…でも作業が正直できないです。FWを変更しなければ良いですか?VPNとかを使うとか…」
「それはかまいません」

まったくもってよくある話

書くと長くなるしまずいから書かないけど、こういう状況は二度や三度や片手や両手ではないですね。*1
踏み台と称されたVNCなどでつながるサーバーだけを渡されて、隔靴掻痒、苦肉の策、二回から目薬、管中窺天、井の中の蛙(いくつかおかしい)という感じはたまによくあります(エッ)
Windowsという時点で管理したくないのに、なんかよくわからないソフトを使って、よくわからない感じで接続しなきゃいけない、死ぬ。

死なないためにやりたいこと

自分のコントロール下にあるサーバーを経由して、とても厳重に管理されてしまっている箱入り娘を生に近い感じで触りたい。
まあ、つまりはVPNで安全にフルポートあけたいです。

所で、思うにVPNは決定版がまだない…。

今回は、私は普段Macをつかっていて、VPNの連携サーバーはワンコイン的なVPSで、客先はWindows Server 2008です。


昔、Hamachiというやつがあって(今もあるにはあるが)あれはGUIもよくできていて、安定していて、サーバーもいらない、というかなりの決定版なりえたのだが…有料化&Windows専用化っぽいのでつかわなくなった。


業界標準とかいわれているIPSecPPTPは「一部の環境を除き」スゴイ使いづらい*2、相性やらなんやら、いまどきNATを超えるのもためらうのはどうなのか。商用のSSL-VPNはわりと使いやすいけど、当然高い。


候補を消していくと、結局OpenVPNしかない。
(あ、SoftEtherもある。最近またフリーになったらしいですね。でも話題を聞かないのでつかってないですね…、今みたらよさそうではあります)

OpenVPNがとても良くできている理由3つ

・なんといっても再起動がいらない!(お客さんが嫌がらない)
・MacやWinは、GUIでポンと入る!(楽ですね)
・FWとの親和性(PPTPとかIPSecとか腐ってる…)

OpenVPNがよくできていない理由3つ

・証明書作成が正直面倒くさい(easy-rsaつかうけど…)
Linux版、EPELにしかない(普段EPELいれない派です)
・WindowsがVPNをPublicと認識する(これはWinがダメなのでは…)

これしかないんだ!

まあ、結局これしかないので、これを使いましょう。

1,Linuxサーバーの設定

EPELをいれるなりして、yum install openvpnしてください。もちろんソースからBuildしてもよいでしょう。

あとは設定ファイルを書くのですが、rpmで入れると
/usr/share/doc/openvpn-2.2.2/sample-config-files
ここらへんにサンプルファイルがあります。

/etc/openvpn/server.confとかにコピーして修正しましょう。

port 1194
proto udp
dev tun
server 10.99.99.0 255.255.255.0
client-to-client
keepalive 10 120
comp-lzo
persist-key
persist-tun

ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh2048.pem
ifconfig-pool-persist ipp.txt

status /var/log/openvpn-status.log
log         /var/log/openvpn.log
log-append  /var/log/openvpn.log
verb 3
mute 20

まあ、理由もなければいじるべき所はあんまりないんですけど
server 10.99.99.0 255.255.255.0
ここらへんは趣味や宗教上の理由で変えてください(VPNで使われる、ネットワークになります)

ところで、easy-rsaが無い

OpenVPNは大量に証明書やらをつくらないといけないのですが、easy_rsaというオレオレ証明書をつくったりの手間をはぶくツールがついてきます…ついてくるはずなんですけど、昔は同梱されてた記憶があるんですけど、今は同梱して無いみたいですね?
https://github.com/OpenVPN/easy-rsa

easy-rsa/easy-rsa/2.0/
の中にある
vars
を適当に書き直して

source vars
./build-ca
./build-key-server server
./build-dh

とかして、keys/ の中にある必要そうなファイル

ca.crt
server.crt
server.key
dh2048.pem

ここらを/etc/openvpnとかにコピーします。
(easy-rsaは今後もつかうので、削除したらダメです)


ここまでで確かopenvpn自体は起動まではするはずなので
openvpn server.conf
とかやってみて、確認しましょう。
(コンフィグに指定したログファイルに、起動完了的なことが出ているはず)


あとは必要に応じて/etc/sysctl.confの net.ipv4.ip_forward = 1 と書き換えて、/sbin/sysctl -p で反映し、

iptablesに、適当にこんな感じのルールを追記すると。

[0:0] -A INPUT -p udp -m udp --dport 1194 -j ACCEPT
[0:0] -A OUTPUT -o tun+ -j ACCEPT
[0:0] -A FORWARD -o tun+ -j ACCEPT
[0:0] -A INPUT -i tun+ -j ACCEPT

後は/etc/init.d/openvpn start であげておけば、サーバー側の設定完了です。

WindowsにClientを入れる

OpenvpnはOpenだけあって実装が沢山有ります。本家のやつを使うと非常に面倒なので、手軽に使いたいならGUIのクライアント使いましょう。
http://www.vpnux.jp/
たとえばこれは単純でわかりやすいですね(ログオフできないけど)、絶対これがいいとは言わないですけど。

Windowsにクライアントインストールした後、サーバーにログインするために証明書作ります。

サーバーのeasy_rsaで、
./build-key client-01
とかやりましょう。

keys/の中にclient-01.crtとkey、ca.crtがありますので、これらをWindowsにコピーして、適当に設定すれば動くはず。

もしつながりそうでつながらない時は、大抵設定でTunかTapかの指定を間違えていると思います。Linuxサーバー側の設定をTunにしたら、Tunにしておきましょう。

MacにClientを入れる

Windows同様ですが、
http://code.google.com/p/tunnelblick/
がいいんじゃないですかね、これまた絶対これがいいとは言わないですけど。


インストールして起動すると、ダイアログでああしろこうしろといわれるので、適当にやりましょう。英語が読めれば迷う所ないと思います。

注意として、Windowsの時に作った証明書は使い回しできないので、
./build-key client-02
とかやりましょう。

ということで、出来ました。

簡単ですね、ネットワークまわりって失敗したら一発で通信途絶で首くくるしかないんですが、比較的OpenVPNは安全かなと思います(凝ったことしなければ、ルーティングテーブルを自分で書かなくて良いので)

そしてさすがudpVPNですね、レイテンシ低くて満足です…。TCPにすればフォワードとの相性も抜群です。

適当なVPNにサーバーを立てる事で、気楽にVPNつくれてたのしいのでみんなもVPN作りましょう。


おわり。

おわりといいつつ、やっぱりしなければいけないコピペの宣伝

http://tailf.cfe.jp/
あなたのInstagram、FacebookGoogle+(Picasa)の画像をTOLOTフォトブックに超カンタンに変換します。
500円で62枚のフォトブックは前代未聞の安さとおもいますので、是非。
(ちなみに、このサービスはPerlで書かれています!)

リリース時の詳細エントリ

http://uzulla.hateblo.jp/entry/2013/05/08/124552

Youtubeにあがっている、利用者のレポート


TAILFでinstagramフォトブックを作ろう! - YouTube

*1:セキュリティというものについて考えさせられます…、現実のセキュリティとは紙の上に存在するものなのでは…

*2:逆では?と思うかもしれないけれど、これは個人的な意見です。