2017年10月24日火曜日

VPN 環境の OpenVPN 化

Mac をいじり出して、iCloud を軸にした標準アプリの設計思想が非常に気に入ってしまった。一般のユーザー視点なら無料 5GB で十分である。

ところが、Mac をメイン機とするならば、僕の場合、エンジニア(プログラマー)的側面も、一般ユーザーとしての立場に加えて必要になってくる。外にも持ち歩く MacBook に、開発中のデータが入っているのは非常にリスクが高いから、データの保管場所が MacBook の実機に依存するのは避けたい。だが、アプリを開発するためのプロジェクトファイルを iCloud ドライブにぶち込んでしまうと、どうやってもすぐに無料で利用できる 5GB の限界に達してしまう。かといって課金までして iCloud を増量したいとも思わない。

となると、せっかく実家で運用している QNAP 製の NAS があるので、それを使って iCloud のような運用ができないかと考えた。これまではデータを随時バックアップするという用途に NAS を使っていたのだが、クラウド的に、データ本体を常に NAS 側に置いておいて、それを端末側で参照するという形である。

ところが、写真などのマルテメディアデータはそのような専用のアプリが存在するのだが、ファイル一般となると iCloud ドライブのような使い方のできるオープンなアプリが存在しない。iCloud ドライブは macOS 専用だし、Google Drive にしても専用アプリをインストールする必要があり、それも Windows と macOS のみで Linux では使えない。

また、昔からある SMB の場合、LAN での利用を前提としていて、クラウドよりも一昔前のスタイルのまま停滞している感がある。

WebDAV

選択肢が限られていたので、まず最初に QNAP NAS で使える WebDAV を使ってみることにした。これは、macOS でも Linux でも標準で使えて、ネットワークドライブとして iCloud ドライブや Google Drive のようにアクセスが可能である。

ところが、WebDAV にはバグがあり、それは WebDAV が依存している apache のバグに由来するようだが、フォルダに index.html のファイルが存在すると、そのフォルダが空っぽ状態でファイルのリストが見えなくなってしまうという問題が発生した。

また、反応速度のせいか、例えば Eclipse で work_space として WebDAV 経由のフォルダを指定すると、エラーが出て、使えないことが判明した。

以上から、WebDAV によるクラウドドライブの実現は諦めた。

VPN + SMB

こうなったらオーソドックスに SMB を使ってみるしかないと思い、そのために VPN を構築することにした。元々、実家のルーターの設定などをリモートでメンテナンスするために、PPTP を使った VPN サーバーは立てていた。古い Buffalo のルーターを DD-WRT 化したものを使っている。しかし、最近 PPTP がどうも不安定化しすぐに接続が切れる。それに PPTP は技術的に世間で非推奨であり、OpenVPN を使うべきなのはほとんど常識である。設定の手間があったので OpenVPN を避けてきたが、クラウドドライブ実現のためにはちゃんと OpenVPN 化するべきだと思って、今回チャレンジすることにした。

OpenVPN

基本的に作業は Ubuntu (16.04LTS) 上で行った。一般に Linux 用の OpenVPN についてネット上で見つけられる情報は、サーバー用とクライアント用がセットになった解説だが、僕の場合は、サーバー側は DD-WRT で運用するので、Linux についてはクライアントとしての使い方になる。とはいえ、認証局(CA)として各証明書ファイルを作成するのは同じ Ubuntu マシン上で行うので、openvpn パッケージをインストールしなければならないのはサーバーとして運用する場合と同じである。基本的に How To Set Up an OpenVPN Server on Ubuntu 16.04 という英語の解説の通りに従い上手く行った。

作業として必要なことは

  1. 認証局(CA)として各証明書ファイル(秘密鍵含む)を作成すること
  2. クライアント用の設定ファイルを作成すること

の 2 つである。サーバーは DD-WRT の機能を使うので、主に DD-WRT の GUI で各証明書ファイルの内容をセットすればいい。解説に従って作成したいくつかの証明書と秘密鍵の内容をコピー&ペーストした。また、ネットでは TUN を使う例が多かったが、TAP にした。DD-WRT では AES-512-CBC も選べるようになっていたが、Ubuntu 側が対応していないようだったので、AES-256-CBC で我慢することにした。

クライアント側としては、先程クライアントマシン上で作成したクライアント用各証明書ファイルを使った設定ファイルを作成をするスクリプトを解説ページが用意してくれているので、それを使って作成した。ただし、DD-WRT 側の設定に合わせて、dev tap や cipher、auth などは手動でカスタマイズする必要はあるだろう。

ポートマッピングを忘れずに

初めての作業だったので、解説ページに沿ってやったものの、最初は接続が失敗した。実は、OpenVPN サーバー(DD-WRT)側ネットワークのポートマッピングで、UDP 1194 を通す設定を行っていなかっただけであった。運良く、検索一発目でポートマッピングが原因で失敗するのが一番多いと書かれている OpenVPN の FAQ を見つけることができ、すんなり解決できた。

GNOME のネットワーク設定(Network Manager)

不安定化していた PPTP と比べて、OpenVPN で接続が確立されると非常に安定している。だが、ターミナルでコマンドを使って OpenVPN を動かしている形なので、PPTP の場合のように、GNOME の画面右上のネットワーク設定を使った GUI で使えるようにできないかと思って調べたら、流石は Linux、流石は GNOME。ありました。apt install network-manager-openvpn-gnome するだけ。これで新規のネットワーク接続設定を追加すると VPN ではファイルからのインポートを選べるので、上の作業で作成した .ovpn ファイルを選択すれば、あとは各種設定は自動でセットされる。流石!


Ubuntu 環境で安定に接続が確立できることは確認できた。これで Mac でも OpenVPN をセットアップし、さらに SMB でクラウド化した状態で、Eclipse などが使えるかどうかというチャレンジは、また次の機会に。


補足 1

VPN 経由で LAN にアクセスするには以上で十分だが、さらに LAN の内側からインターネットに出たい場合、DD-WRT 側で追加の設定が必要だった。Additional Config 欄に

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 192.168.0.1"
push "dhcp-option DNS 8.8.8.8"

という形で、クライアント側のネットワーク設定のデフォルトゲートウェイを(VPN 接続時に)上書きして必ず VPN 経由でインターネット側に出るようにし、さらに DNS サーバーのアドレスも指定しておく。

補足 2

OpenVPN のメッセージを見ていると、MTU の数値がサーバー⇔クライアント間で矛盾しているという警告が出ているので、色々と MTU 関係を調整した。

まず、実家は au ひかりであり、自分は WiMAX2+ なので、いずれも MTU は 1500 という理想的な環境である(ちなみに NTT の Flet's では PPPoE に加えて他にも余計なヘッダが入るため MTU は 1454 となる)。しかし、WiMAX ルーターの設定で MTU が設定できるようになっているが、なぜかデフォルトでは 1500 よりも低くしてあったので、ちゃんと 1500 にしておく必要があった。さらに、OpenVPN を運用するサーバー(DD-DRT)側もデフォルトで Tunnel MTU setting が 1400 にしてあったので、ちゃんと 1500 にする必要があった。Tunnel UDP Fragment は空欄(デフォルト)、Tunnel UDP MSS-Fix は無効(デフォルト)のままでよい。

以上で、OpenVPN をオンにしてもオフにしてもいずれも、ping コマンドで 1472 バイトのパケットがギリギリ通ることを確認した。

(ちなみに、Linux だけでなく Mac でも ping によるテストを行ったが、Linux と Mac では ping コマンドの仕様が違っていた。Linux では -M do オプションだったものが、Mac では -D オプションになっていた。)

0 件のコメント:

コメントを投稿