fedora 23でOpenVPNサーバを立てて、Windows 10から接続するまでの手順です。
なぜCentOSでなくfedoraかというと、リモートでワークステーションとして動かしたかったからです。最新ソフトが使えるfedoraのほうが何かと都合がよいです。

認証用の鍵は手作業で生成、設定ファイルなどはansibleで設定します。

パッケージインストール

dnfはyumの後継ソフトです。使い方はだいたいyumと同じです。

# dnf install openvpn easy-rsa

easy-rsaは鍵生成用コマンドです。CA用サーバを別に用意する場合はそちらにインストールします。セキュリティ的にはCA用サーバと公開鍵認証を使うサーバは別にしておいたほうが望ましいですが、ここでは同一サーバでやってしまいます。

easy-rsaで鍵作成

CA環境作成

# mkdir /etc/openvpn/CA
# cd /etc/openvpn/CA
# cp -a /usr/share/easy-rsa/3.0.0/* .
# ./easyrsa init-pki
# ./easyrsa build-ca

パスフレーズを求められるので、パスフレーズをパスワード管理ソフトなどで作っておきます。

Generating a 2048 bit RSA private key
...................................................................+++
.........................+++
writing new private key to '/etc/openvpn/CA/pki/private/ca.key.Nry5Hmpx5k'
Enter PEM pass phrase:  ←パスフレーズを入力
Verifying - Enter PEM pass phrase:  ←パスフレーズを入力
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:  ←デフォルトでOK

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/CA/pki/ca.crt

サーバ用の公開鍵・秘密鍵作成

# ./easyrsa build-server-full vpn-server nopass

nopassオプションで秘密鍵のパスフレーズを省略します。入力を求められるパスフレーズはCA用のものです。

Generating a 2048 bit RSA private key
............................................................................+++
..............................................................................................................................................+++
writing new private key to '/etc/openvpn/CA/pki/private/vpn-server.key.N5AKMlYIAm'
-----
Using configuration from /etc/openvpn/CA/openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/CA/pki/private/ca.key:  ←パスフレーズを入力
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'vpn-server'
Certificate is to be certified until Jan  8 12:28:56 2026 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

クライアント用の公開鍵・秘密鍵作成

# ./easyrsa build-client-full vpn-client-1 nopass

サーバ用のものとほぼ同手順です。

Generating a 2048 bit RSA private key
............................................+++
..................................+++
writing new private key to '/etc/openvpn/CA/pki/private/vpn-client.key.yxAIHoCTc8'
-----
Using configuration from /etc/openvpn/CA/openssl-1.0.cnf
Enter pass phrase for /etc/openvpn/CA/pki/private/ca.key:  ←パスフレーズを入力
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'vpn-client-1'
Certificate is to be certified until Jan  8 11:16:44 2026 GMT (3650 days)

Write out database with 1 new entries
Data Base Updated

OpenVPNサーバ側設定

公開鍵・秘密鍵の移設

さきほど作ったCA用環境から鍵ファイルをコピーします。

# mkdir /etc/openvpn/keys
# cd /etc/openvpn/keys
# cp /etc/openvpn/CA/pki/ca.crt .
# cp /etc/openvpn/CA/pki/issued/vpn-server.crt .
# cp /etc/openvpn/CA/pki/private/vpn-server.key .

ついでに暗号化に使うファイルを作ります。

# openssl dhparam -out dh2048.pem 2048
# openvpn --genkey --secret ta.key

所有者・パーミッション設定

あんまり意味ないかもしれませんが、いちおう所有者などをopenvpnユーザにします。

# chown openvpn:openvpn /etc/openvpn
# chown -R openvpn:openvpn /etc/openvpn/keys
# chmod 600 /etc/openvpn/keys/*
# chmod 700 /etc/openvpn

ansibleでファイル設定

あとはインタラクティブなコマンドはないので、ここからはansibleでしたほうが楽です。

roles/openvpn/tasks/main.yml

---
- name: OpenVPNインストール
  dnf: name={{item}}
  with_items:
    - openvpn
    - easy-rsa

- name: OpenVPNファイル作成
  file:
    path: '{{item.path}}'
    mode: '{{item.mode}}'
    state: touch
    owner: openvpn
    group: openvpn
  with_items:
    - { path: /etc/openvpn/ipp.txt, mode: '0600' }
    - { path: /var/log/openvpn-status.log, mode: '0600' }
    - { path: /var/log/openvpn.log, mode: '0600' }

- name: OpenVPN設定ファイル作成
  template:
    dest: '/etc/openvpn/my-vpn.conf'
    src: 'my-vpn.conf.j2'
    mode: 0600
    backup: yes
  notify: restart openvpn my-vpn

- name: sshポート解放(1194/udp)
  firewalld: port=1194/udp state=enabled permanent=yes
  notify: restart firewalld

- name: OpenVPN自動起動設定
  service: name="openvpn@my-vpn" enabled=yes

/etc/openvpn/ipp.txt はクライアントに払い出すIPを固定化するためのものですが、使っていないのでtouchで済ませています。設定するときにtemplateへ移すつもりです。

サービス名の「openvpn@my-vpn」の@右側、my-vpnはconfファイルと同一名にします。confファイルを複数作ることで複数のOpenVPNインスタンスが立ち上がるようです。

roles/openvpn/templates/my-vpn.conf.j2

port 1194
proto udp
dev tun
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vpn-server.crt
key /etc/openvpn/keys/vpn-server.key
dh /etc/openvpn/keys/dh2048.pem
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/ipp.txt
push "route 172.16.0.0 255.255.255.0"
keepalive 10 120
tls-auth /etc/openvpn/keys/ta.key 0
comp-lzo
user openvpn
group openvpn
persist-key
persist-tun
status /var/log/openvpn-status.log
log-append  /var/log/openvpn.log
verb 4
mute 20

各IP・サブネットやpushコマンドは環境にあわせてどうぞ。port番号は変えたほうが良いかもしれません。

roles/openvpn/handlers/main.yml

---
- name: restart openvpn my-vpn
  service: name="openvpn@my-vpn" state=restarted

- name: restart firewalld
  service: name=firewalld state=restarted

サービス再起動用のhandlersです。

適当にplaybookを作ってopenvpnロールを実行するとサーバ側設定は完了です。

OpenVPNクライアント側設定

OpenVPN.JPを見ると

Windows PCをOpenVPNクライアントとして使用したい場合は、設定が簡単に行えるvpnux Clientがお勧めです。

とのことだったので、vpnux Clientを使います。メーカーのプラムシステムズはOpenVPN.JPの運営会社なので、日本における準公式といった位置づけになると思います。

クライアント用公開鍵・秘密鍵などをWindows機に移設

先に作ったクライアント用公開鍵・秘密鍵などを何らかの安全な方法で対象Windows機に移設します。USBメモリ使うとか、scp使うとか。
対象ファイルは次の4つです。

  • /etc/openvpn/CA/pki/issued/vpn-client-1.crt  ←証明書認証(PKI)証明書
  • /etc/openvpn/CA/pki/private/vpn-client-1.key ← 証明書認証(PKI)秘密鍵
  • /etc/openvpn/CA/pki/ca.crt  ←CA証明書
  • /etc/openvpn/keys/dh2048.pem  ←TLS-Auth HMAC署名 共有鍵

vpnux Clientプロファイル設定

上記ファイルを使ってvpnux Clientのプロファイル設定をします。

設定の際、ちょっとした不具合がありましたので報告済みです。そのうち直るかもしれません。

接続試験

接続を試してみて、無事つながれば作業完了です。

参考サイト

http://www.openvpn.jp/document/how-to/

https://blog.laimbock.com/2013/09/21/how-to-setup-openvpn-on-fedora-19/