OpenVPN

Arch LinuxのVPSにVPN serverを構築して、VPN Proxyを自前でつくった。
SoftEtherも構築が簡単そうで、スループットも期待できそうだが、pacmanで管理できないパッケージは、Arch Linuxらしくないと考えてあきらめた。
公式 Arch リポジトリにあるVPNのパッケージは、OpenVPNとStrongSwanしかないので、資料がそろっているOpenVPNを選択した。
pacman -S openvpn easy-rsa
本来は、別に認証局が必要だが、easy-rsaを使って、サーバで一気に作成。
パスフレーズは入力が必要だが、Common Nameの入力はENTERで省略できる。
cd /etc/easy-rsa
easyrsa init-pki
easyrsa biuild-ca
easyrsa gen-dh
openvpn –genkey –secret ./pki/ta.key
easyrsa build-server-full server nopass
easyrsa build-client-full client nopass

後は作成したファイルをサーバとクライアントのディレクトリにコピー。
また、サーバの設定ファイルもコピーする。
mv pki/dh.pem pki/dh2048.pem
cp ca.crt ta.key dh.pem private/server.key issued/server.crt /etc/openvpn/server
cp ca.crt ta.key private/client.key issued/client.crt /etc/openvpn/client

設定ファイルをルーティング方式に設定して、起動設定。

cd /etc/openvpn/server
cp /usr/share/openvpn/examples/server.conf ./srv.conf
vi srv.conf
systemctl start openvpn-server@srv
systemctl enable openvpn-server@srv

/etc/open/vpn/server/srv.confの設定例

port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push “redirect-gateway def1 bypass-dhcp”
push “dhcp-option DNS 8.8.8.8”
push “dhcp-option DNS 8.8.4.4”
duplicate-cn
keepalive 10 120
tls-auth /etc/openvpn/server/ta.key 0 # This file is secret
comp-lzo adaptive
push “comp-lzo yes”
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn/status.log
log /var/log/openvpn/vpn.log
verb 4
mute 20
explicit-exit-notify 1

/etc/iptables/iptables.rulesの設定に以下を加える。
iptables -A INPUT -p udp -m udp –dport 1194 -j ACCEPT
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -t nat -A INPUT -p udp -m udp –dport 1194 -j ACCEPT

systemctl reload iptables
これで、サーバの設定は終了。

andoroidのクライアントは、OpenVPN ConnectをPlayストアからインストール。
その後は、証明書と鍵をインラインで記載したoovpnファイルを読み込ませて接続できる。
ovpn fileの例
インライン作成は,, , , のタグで囲む。
tls-authディレクティブの代わりに,key-direction 1を記載する。

client
dev tun
proto udp
remote domain.name.com 1194

resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
verb 3
#tls-auth
key-direction 1
mute 10

—–BEGIN CERTIFICATE—–
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
—–END CERTIFICATE—–

—–BEGIN CERTIFICATE—–
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
—–END CERTIFICATE—–

—–BEGIN PRIVATE KEY—–
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
—–END PRIVATE KEY—–

—–BEGIN OpenVPN Static key V1—–
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
—–END OpenVPN Static key V1—–

これでよいのだが、注意として,Chromeのdata savingオプションはオフにしておくこと。
そうしないと、IPがgoogle USAのIPに固定されてしまうので,VPN proxyの意味がない。
また,Playストアのregion情報は起動時しないと更新されないようなので,
VPNを接続した後に,設定!アプリで、Playストアを一度Force stopしてから、再起動する。

暗号のdefaultはbf-cbcで非推奨だが、接続後にaes-256-gcmにアップグレードされる。
# openvpn -show-ciphers

statusとlogは、標準の/etc/openvpn/severから、/var/log/openvpnに移す。ファイル名は、systemd-escapeで、エスケープ処理されているようなので、/の代わりに-が使用できる。

android clientでは、fragment未サポート

2019/10/13
標準の1194 udpの場合、中国から繋がりにくい。TLS errorが起こっているので、great firewallの影響か。ポートを変更したら改善した。