🔐

OpenVPNを用いて接続したサーバー上の外部公開webページにアクセス

2023/09/18に公開

TL;DR

  • OpenVPN接続後、hostsにDDNSのホスト名→172.17.0.1を追記した同一サーバー上のDockerプロキシサーバーに接続

背景

  • Androidから公衆LANの時だけVPN接続して同一サーバー上のwebページにアクセスしたい

イメージ

  • DockerでVPNサーバーを立ち上げたい

Android12以降でSoftEtherVPNが使えない問題

投稿時点でプロトコルが対応していないため除外。

OpenVPN以外のDockerについて

WireGuardFirezoneの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