OpenVPNサーバー設置は超面倒

インド出張中に、VPNで日本に繋げば「らじる★らじる」のアプリでNHKラジオが聴けることがわかった。 残念ながら「radiko」は GPSや WiFiアクセスポイントで位置を割り出すようで、VPN経由でも NGだった。

VPNサービスは、インターリンクの「マイIP」を申し込んだ(2ヶ月無料)。 「セカイVPN」というのもあって、海外からの利用はそっちの方がいいらしいけど、「マイIP」でも使えているからいいかと。 でも自宅にVPNのサーバーを立てて、そこに繋げるようにすればダーターなので、チャレンジしてみようと思った次第。 ところで一口にVPNと言っても、いろんなやり方(プロトコル)があるらしい。

VPN プロトコルの比較: PPTP vs. L2TP vs. OpenVPN vs. SSTP vs. IKEv2 | vpnMentor

全プラットフォームにサードパーティのソフトウェアのダウンロード・インストールする必要がありますが、OpenVPN があらゆるニーズに最高のVPN であることは議論の余地がありません。高速、安全で信頼性が高い、 セットアップに少し時間がかかりますが、ウェブ利用時の最高のセキュリティとプライバシーを考えればその価値はあります。

目的がラジオや Amazonプライムビデオの視聴なので、機密なんてあまり関係ないですが、こういうのを読むと OpenVPNしかない!と思いますね。 それで「FreeBSD OpenVPN」とかでググって見つけたのが以下の記事。

[自分用メモ] FreeBSDマシンにOpenVPNをインストールしてVPNサーバを構築した ~ サーバ設定編
FreeBSD の自宅サーバへ OpenVPN をインストール(ルーティング方式)

ところが easy-rsaの扱い方がよくわからない。 OpenVPN On FreeBSD 10.3 という記事を見つけて再チャレンジした。

まず portsで OpenVPNをインストールする。

root@www:/ # cd /usr/ports/security/openvpn
root@www:/usr/ports/security/openvpn # make install

続いて設定ファイルの準備。

root@www:/usr/ports/security/openvpn # mkdir /usr/local/etc/openvpn
root@www:/usr/ports/security/openvpn # cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /usr/local/etc/openvpn/openvpn.conf
root@www:/usr/ports/security/openvpn # cp -r /usr/local/share/easy-rsa /usr/local/etc/openvpn/easy-rsa
root@www:/usr/ports/security/openvpn # cd /usr/local/etc/openvpn/easy-rsa
root@www:/usr/local/etc/openvpn/easy-rsa # ls
easyrsa.real            openssl-1.0.cnf.example vars.example
openssl-1.0.cnf         vars                    x509-types
root@www:/usr/local/etc/openvpn/easy-rsa # vi vars

/usr/local/etc/openvpn/easy-rsa/varsの抜粋。

set_var EASYRSA_REQ_COUNTRY    "JP"
set_var EASYRSA_REQ_PROVINCE   "Saitama"
set_var EASYRSA_REQ_CITY       "Hidaka"
set_var EASYRSA_REQ_ORG        "Home"
set_var EASYRSA_REQ_EMAIL      "your_address@gmail.com"
set_var EASYRSA_REQ_OU         "My Organizational Unit"
 
set_var EASYRSA_KEY_SIZE        2048
 
set_var EASYRSA_CA_EXPIRE       3650
 
set_var EASYRSA_CERT_EXPIRE     3650

証明書を作成。

root@www:/usr/local/etc/openvpn/easy-rsa # sh
# ./easyrsa.real init-pki
 
Note: using Easy-RSA configuration from: ./vars
 
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /usr/local/etc/openvpn/easy-rsa/pki
 
# ./easyrsa.real build-ca
 
Note: using Easy-RSA configuration from: ./vars
Generating a 2048 bit RSA private key
...............................................................................................................................+++
...+++
writing new private key to '/usr/local/etc/openvpn/easy-rsa/pki/private/ca.key.AEUNfy3Ktx'
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]:server
 
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/usr/local/etc/openvpn/easy-rsa/pki/ca.crt
 
# ./easyrsa.real build-server-full openvpn-server nopass
 
Note: using Easy-RSA configuration from: ./vars
Generating a 2048 bit RSA private key
.......................................................+++
........+++
writing new private key to '/usr/local/etc/openvpn/easy-rsa/pki/private/openvpn-server.key.I8ijVyKjDh'
-----
Using configuration from /usr/local/etc/openvpn/easy-rsa/openssl-1.0.cnf
Enter pass phrase for /usr/local/etc/openvpn/easy-rsa/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:'openvpn-server'
Certificate is to be certified until Feb 20 10:36:46 2027 GMT (3650 days)
 
Write out database with 1 new entries
Data Base Updated
 
# ./easyrsa.real build-client-full client
 
Note: using Easy-RSA configuration from: ./vars
Generating a 2048 bit RSA private key
.......+++
...........................................+++
writing new private key to '/usr/local/etc/openvpn/easy-rsa/pki/private/client.key.QolyS0vxbc'
Enter PEM pass phrase: ********
Verifying - Enter PEM pass phrase: ********
-----
Using configuration from /usr/local/etc/openvpn/easy-rsa/openssl-1.0.cnf
Enter pass phrase for /usr/local/etc/openvpn/easy-rsa/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:'client'
Certificate is to be certified until Feb 20 10:38:26 2027 GMT (3650 days)
 
Write out database with 1 new entries
Data Base Updated
# ./easyrsa.real gen-dh
 
Note: using Easy-RSA configuration from: ./vars
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
[中略]
 
DH parameters of size 2048 created at /usr/local/etc/openvpn/easy-rsa/pki/dh.pem

shから exitして、証明書をコピー。

# exit
root@www:/usr/local/etc/openvpn/easy-rsa # mkdir /usr/local/etc/openvpn/keys
root@www:/usr/local/etc/openvpn/easy-rsa # cp pki/dh.pem  pki/ca.crt pki/issued/openvpn-server.crt  pki/private/openvpn-server.key /usr/local/etc/openvpn/keys

ta.key を生成する。

root@www:/usr/local/etc/openvpn/easy-rsa # cd ..
root@www:/usr/local/etc/openvpn # openvpn --genkey --secret keys/ta.key

OpenVPNの設定ファイルを編集する。

root@www:/usr/local/etc/openvpn # vi openvpn.conf

/usr/local/etc/openvpn/openvpn.confの中身(コメント抜き)。
注意点は、dh2048.pem ではなくdh.pem であること。

local 192.168.1.32
port 1194
proto udp
dev tun
ca /usr/local/etc/openvpn/keys/ca.crt
cert /usr/local/etc/openvpn/keys/openvpn-server.crt
key /usr/local/etc/openvpn/keys/openvpn-server.key  # This file should be kept secret
dh /usr/local/etc/openvpn/keys/dh.pem
topology subnet
server 192.168.2.0 255.255.255.0
ifconfig-pool-persist /usr/local/etc/openvpn/ipp.txt
push "route 192.168.1.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
push "route-gateway 192.168.2.1"
push "dhcp-option DNS 192.168.1.1"
push "dhcp-option DOMAIN still-laughin.com"
push "tun-mtu 1500"
push "link-mtu 1542"
keepalive 10 120
tls-auth /usr/local/etc/openvpn/keys/ta.key 0 # This file is secret
cipher AES-256-CBC
persist-key
persist-tun
status /var/openvpn/openvpn-status.log
log-append  /var/log/openvpn.log
verb 3
tun-mtu 1500

openvpn-status.logを作るディレクトリを作成する。

root@www:/usr/local/etc/openvpn # mkdir /var/openvpn
root@www:/usr/local/etc/openvpn # vi /etc/newsyslog.conf

/etc/newsyslog.conf に以下を追加する。

/var/log/openvpn.log     600  7     100  *     JC

/etc/rc.conf を編集する。

root@www:/usr/local/etc/openvpn # vi /etc/rc.conf

以下を追加する。

openvpn_enable="YES"
openvpn_configfile="/usr/local/etc/openvpn/openvpn.conf"
gateway_enable="YES"

openvpnサービスを起動する。

root@www:/usr/local/etc/openvpn # service openvpn start
Starting openvpn.

まだ終わってない。 クライアント用の設定ファイル(client.ovpn)を作成する。

root@www:/usr/local/etc/openvpn # cp /usr/local/share/examples/openvpn/sample-config-files/client.conf client.ovpn
root@www:/usr/local/etc/openvpn # vi client.ovpn

/usr/local/etc/openvpn/client.ovpnの抜粋。

client
dev tun
proto udp
remote aaa.bbb.ccc.ddd 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client.crt
key client.key
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 3

以下の4つのファイル

/usr/local/etc/openvpn/client.ovpn
/usr/local/etc/openvpn/easy-rsa/pki/ca.crt
/usr/local/etc/openvpn/easy-rsa/pki/issued/client.crt
/usr/local/etc/openvpn/easy-rsa/pki/private/client.key

を取り出して、Androidスマホに送る。

家庭内LANにはDNSを建てていないので、ルーター(PR-500KI)の設定はまず「静的IPマスカレード」で udp の 1194 を VPNサーバーに当て、

static_ip_mas.jpg

「IPv4パケットフィルタ設定」を指定した。

ipv4packetfilter.jpg

これでサーバー側の準備は整ったので、スマホに Google Playから純正アプリ「OpenVPN Connect」をインストールする。

Screenshot_20170222-230055.png

右上の「その他」を押す。

Screenshot_20170222-230102.png

「import」を選択。

Screenshot_20170222-230109.png

「Import Profile from SD card」を選択。

Screenshot_20170222-230137.png

メールなどからダウンロードしておいた client.ovpn を選択。

Screenshot_20170222-230201.png

秘密鍵のパスフレーズを入力して「Connect」ボタンを押す。

Screenshot_20170222-230216.png

接続成功。

ところでここまで書いてきてなんですが、PR-500KIには VPNサーバー機能がありました。
L2TP/IPSecで接続できるので、結構ちゃんとしたものですが、PR-500KIはたまにハングアップすることがあるので、あまり負荷を掛けたくないんですよね。