docker上のネットワークに接続しないとアクセスできないサービスを作りたかったので、pritunlを使ってVPNを作りました。
ほぼpritunlの話です。
docker コンテナ
dockerで使うイメージは、VPN構築のためのPritunlと、説明のためのNginxです。Pritunlはホストマシンとの通信用に、ポートを空けておきますが、NginxはVPN接続時にのみ、アクセス出来るようにするため、portの設定はしません。
version: '3.7'
services:
pritunl:
image: jippi/pritunl
container_name: pritunl
privileged: true
ports:
- "1194:1194/udp"
- "1194:1194/tcp"
- "80:80/tcp"
- "443:443/tcp"
networks:
bridge:
ipv4_address: 172.16.20.2
nginx:
image: nginx
container_name: nginx
networks:
bridge:
ipv4_address: 172.16.20.3
networks:
bridge:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.16.20.0/24
docker-compose.yml
が用意できたら、サクッとコンテナを立ち上げます。
$ docker-compose up -d
この時点では、Nginxには繋がりません。
Pritunlへのログイン
dockerが起動したら、localhost:443
でpritunlに接続してログインします。
デフォルトのUsernameとPasswordは、どちらもpritunlです。
ログインしたら、Initial Setupの画面が表示されるので、とりあえずUsernameとPasswordを変更しておきましょう。Public Addressは、空欄にしておくとグローバルIPアドレスが自動入力されてしまうため、とりあえず手元で動かすためにlocalhost
に変更しておきます。
Pritunlの設定変更
ここからPritunlの設定をしていきます。Users
タブからAdd Organizationをクリックし、適当な名前を入力したら、Addを押下して追加します。
続いて、Userを追加します。Pinコードはoptionalなので、空欄でも構いません。
今度は、Serversタブに移動し、Add ServerからServerを追加します。PortとProtocolは、docker-composeで設定したudpのポートを指定します。
Virtual Networkに設定したネットワークのipが、vpnクライアントに割り当てられます。
この値を、docker上のbridgeネットワークと同一にしてしまい、Pritunlコンテナに繋げなくなったミスをしたのは、ここだけの話。
なので、dockerのネットワークのサブネットとは全く異なる値にしておいたほうが、トラブルが少ないはず。
サーバが作成できたら、Routeも追加しておきます。Add Routeをクリックし、docker composeで設定したネットワークを追加します。
サーバが作成できたら、Attach Organizationをクリックして、作成したサーバにOrganizationを紐付けます。
VPNサーバの起動
Serversから作成したサーバのStart Severをクリックすると、VPNサーバが起動します。
Pritunlクライアントの設定
Usersタブに戻り、対象のユーザープロファイルをダウンロードします。
Pritunl Clientの公式サイトからクライアントをダウンロードし、起動します。
Import Profileをクリックし、先ほどダウンロードしたプロファイルを読み込みます。
インポートできたら、メニューボタンよりConect
を選択し、VPNに接続します。
VPNに接続できると、先ほど繋がらなかった172.16.20.3
でNginxにアクセスできるようになります。