🔐
OpenVPNを用いて接続したサーバー上の外部公開webページにアクセス
TL;DR
- OpenVPN接続後、hostsにDDNSのホスト名→172.17.0.1を追記した同一サーバー上のDockerプロキシサーバーに接続
背景
- Androidから公衆LANの時だけVPN接続して同一サーバー上のwebページにアクセスしたい
イメージ
- DockerでVPNサーバーを立ち上げたい
Android12以降でSoftEtherVPNが使えない問題
投稿時点でプロトコルが対応していないため除外。
OpenVPN以外のDockerについて
WireGuardやFirezoneのDocker Imageもあったが、リバースプロキシを使っているせいかうまく構築できなかったためこれらも除外。
Docker版OpenVPNによるVPNサーバー立ち上げ
下記リポジトリ手順の通り
command
docker run -v ./data:/etc/openvpn --rm \
kylemanna/openvpn ovpn_genconfig -u udp://公開ホスト:公開ポート番号
Processing PUSH Config: 'block-outside-dns'
Processing Route Config: '*.*.*.*/24'
Processing PUSH Config: 'dhcp-option DNS 8.8.8.8'
Processing PUSH Config: 'dhcp-option DNS 8.8.4.4'
Processing PUSH Config: 'comp-lzo no'
Successfully generated config
Cleaning up before Exit ...
command
docker run -v ./data:/etc/openvpn --rm -it \
kylemanna/openvpn ovpn_initpki
init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/pki
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Enter New CA Key Passphrase:
Re-Enter New CA Key Passphrase:
適当にパスワード入力
Generating RSA private key, 2048 bit long modulus (2 primes)
e is 65537 (0x010001)
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]:
空欄で進む
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/pki/ca.crt
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
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 /etc/openvpn/pki/dh.pem
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Generating a RSA private key
writing new private key to '/etc/openvpn/pki/easy-rsa-*/*'
-----
Using configuration from /etc/openvpn/pki/easy-rsa-*/*
Enter pass phrase for /etc/openvpn/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:'*.*.mydns.jp'
Certificate is to be certified until *** ** **:**:** **** GMT (825 days)
Write out database with 1 new entries
Data Base Updated
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Using configuration from /etc/openvpn/pki/easy-rsa-*/*
Enter pass phrase for /etc/openvpn/pki/private/ca.key:
An updated CRL has been created.
CRL file: /etc/openvpn/pki/crl.pem
VPNサーバー起動
command
docker run \
-v ./data:/etc/openvpn \
-d -p 公開ポート:1194/udp \
--restart=always \
--cap-add=NET_ADMIN \
--name openvpn \
kylemanna/openvpn
※公開ポートに対してUDPの通信を許可しておく。
クライアント用.ovpnファイル作成
command
docker run \
-v ./data:/etc/openvpn \
--rm -it kylemanna/openvpn \
easyrsa build-client-full 適当な名前
コマンド最後にnopass
を付加すると、端末側でログインがスキップされる。
Using SSL: openssl OpenSSL 1.1.1g 21 Apr 2020
Generating a RSA private key
writing new private key to '/etc/openvpn/pki/easy-rsa-*/*'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
端末側でログインするパスワードを入力
-----
Using configuration from /etc/openvpn/pki/easy-rsa-*/*
Enter pass phrase for /etc/openvpn/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:'適当な名前'
Certificate is to be certified until *** ** **:**:** **** GMT (825 days)
Write out database with 1 new entries
Data Base Updated
command
docker run \
-v ./data:/etc/openvpn \
--rm kylemanna/openvpn \
ovpn_getclient 指定した名前 > 出力ファイル名.ovpn
出力された.ovpnファイルを端末に転送
VPNサーバー上で名前解決させるプロキシサーバーを起動
下記の通り。
VPN接続:Andoridの例
OpenVPNアプリをインストール
Import Profile→Upload Fileで転送した.ovpnファイルを選択
nopass
指定していない場合は、CONNECTの時にパスワード入力を求められるので、設定したパスワードを入力
プロキシサーバーの設定で172.17.0.1:プロキシサーバーのポートを設定
※VPN接続解除後もプロキシは有効のままなので、その時にはプロキシを無効にすること。
最終的には以下のようになる。
Discussion