Windows
Linux
fedora
VPN
OpenVPN

基本的なOpenVPNの構築手順

More than 1 year has passed since last update.

サーバーはFedora Server 23、クライアントはWindows 10の場合。


ダウンロード

https://openvpn.net/index.php/download/community-downloads.html

これを書いた当時は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というバージョンがリリースされている。

https://github.com/OpenVPN/easy-rsa/releases/download/3.0.1/EasyRSA-3.0.1.tgz

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

変更する設定は以下。あとはデフォルト。


/etc/openvpn/server.conf

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.opvnC:\Program Files\openvpn\confにコピーして、適宜編集する。


openvpn\config\client1.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が張れるようになる。