サーバーはFedora Server 23、クライアントはWindows 10の場合。
ダウンロード
これを書いた当時は2.3.10が最新だったが、適宜その時の最新版を取得。
サーバー側の設定
ここが便利: http://www.openvpn.jp/document/how-to/
本家のHow-toを日本語化してくれている。
インストール
RPMを作るのがオススメらしい。
dnf group install "RPM Development Tools"
dnf install openssl-devel lzo-devel pam-devel
rpmbuild -tb openvpn-2.3.10.tar.gz
dnf install /root/rpmbuild/RPMS/x86_64/openvpn-2.3.10-1.x86_64.rpm
認証局の設置
How-toではEasy-RSAという便利スクリプト集を使って認証局の設置や鍵の生成を行う流れになっているが、これはいつからか同梱されなくなっている。リポジトリが分割されただけなのだが、3.0というバージョンがリリースされている。
How-toに書かれているコマンドは2.0系らしい。互換性はないが、3.0が今後の主流になっていくだろう。
で、もちろん3.0に関するドキュメントはあまりないし、あってもPKIの基本的な知識がある前提で書かれている。PKIに関して少しググって勉強しておく必要がある。コマンドコピペはさすがにちょっとマズいことが起きそうな気がする。
./easyrsa init-pki
./easyrsa biuild-ca
./easyrsa gen-dh
openvpn --genkey --secret ./pki/ta.key
気がするけど、実はこれだけだった……。init-pki
で必要なフォルダを作成したり、以前のデータを削除したりして、きれいにする。build-ca
で証明書と秘密鍵を生成し署名。これで認証局になれる。gen-dh
は鍵交換アルゴリズムに使う素数の生成。ta.key
は後述。
鍵と証明書の作成
サーバーの鍵と証明書を生成して署名、をコマンド一発でやってくれる。
./easyrsa build-server-full server nopass
サーバーの鍵にパスワードを付けるとサービス起動時にめんどくさいので、nopass
オプションを付けてしまった。
サーバー設定
mkdir /etc/openvpn
cd pki
cp ta.key ca.crt dh.pem private/server.key issued/server.crt /etc/openvpn
cp /usr/share/doc/openvpn-2.3.8/sample/sample-config-files/server.conf /etc/openvpn
変更する設定は以下。あとはデフォルト。
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh.pem
tls-auth /etc/openvpn/ta.key 0
user nobody
group nobody
tls-auth
を設定しておくと、VPNセッション開始時のパケットをHMACで認証し、認可されないパケットは破棄されるため、DDoS攻撃を防ぐことができる、みたい。オープンなVPNサーバーを建てる時には設定しておくことがオススメらしい。ta.key
は静的共有鍵なので、安全な方法で配送される必要がある。鍵を持ってる人に菓子折とUSBメモリを持っていくとよいだろう。
また、今回は推奨されるがままUDPを使用したが、クライアントがproxy経由でVPNを張ることが予想される場合は、TCPを使えるようにサーバー側を設定する必要がある。
設定ファイルを書いたら、まずはフォアグラウンドで動作確認。
openvpn /etc/openvpn/server.conf
ちゃんと動作したらサービス化する。
systemctl enable openvpn
systemctl start openvpn
FirewallDってのはなかなか便利。
firewall-cmd --add-service openvpn
firewall-cmd --permanent --add-service openvpn
クライアント側の設定
鍵と証明書の生成
./easyrsa build-client-full client
サーバー側で生成しちゃって、ca.crt client.crt client.key ta.key
をSCPとかでこっそり持ってきちゃうと楽。
なんとなく鍵にパスワードを付けたが、これはVPNでを張る際のプロトコルの頑健性とはあまり関係がない。ASCII文字集合を全部使って2000文字くらいにすればいいかもしれないけど……。PCを共有していて、パスワード知っているユーザーだけがVPN張れる、みたいなユースケースとかにはたぶん便利。
クライアント設定
クライアント側の設定ファイルもSampleがあるので、それをもとに作成する。WindowsではC:\Program Files\openvpn\sample-config\client.opvn
をC:\Program Files\openvpn\conf
にコピーして、適宜編集する。
ca "C:\\Program Files\\OpenVPN\\config\\ca.crt"
cert "C:\\Program Files\\OpenVPN\\config\\client.crt"
key "C:\\Program Files\\OpenVPN\\config\\client.key"
tls-auth "C:\\Program Files\\OpenVPN\\config\\ta.key" 1
¥は二重に書くこと。また、パスに空白を含む場合は全体をダブルクォーテーションで囲む。このエラーはopenvpn-guiのログには出ないので、「なぜかつながらない」という事態になり、ファイヤーウォールなどを確認しはじめて、結果路頭に迷う、もとい、迷った。設定ファイルがちゃんと書けているかを、コマンドプロンプトからopenvpnを起動して確認するのが吉。
あとはopenvpn-guiを起動すると、右下のアイコンから"client1"の接続設定でVPNが張れるようになる。