😽

pritunlでローカルにVPNサーバーを立てる

2021/02/27に公開

はじめに

pritunl の勉強としてローカルに VPN サーバーを立ててみた際の作業記録。

docker-compose で起動

https://hub.docker.com/r/goofball222/pritunl

上記で紹介されているこの docker-compose.yaml を利用して環境を構築

version: '3'

services:
  mongo:
    image: mongo:latest
    container_name: pritunldb
    hostname: pritunldb
    network_mode: bridge
    volumes:
      - ./db:/data/db

  pritunl:
    image: goofball222/pritunl:latest
    container_name: pritunl
    hostname: pritunl
    depends_on:
        - mongo
    network_mode: bridge
    privileged: true
    sysctls:
      - net.ipv6.conf.all.disable_ipv6=0
    links:
      - mongo
    volumes:
      - /etc/localtime:/etc/localtime:ro
    ports:
      - 80:80
      - 443:443
      - 1194:1194
      - 1194:1194/udp
      - 14036:14036/udp # ここのポート番号はpritunlのVPNサーバー作成時に決まる(後述)
    environment:
      - TZ=UTC

docker-compose up で起動し、 safari で https://127.0.0.1 にアクセス
( chrome でアクセスするとこういうエラーが出てアクセスできないので safari で試した方が楽)

警告が出るが、無視してアクセス

ログイン

pritunlのログイン画面になるので、デフォルトの pritunl / pritunl でログイン

Initial Setup

Initial Setup はそのまま Save で進める。
ユーザー名やパスワードをデフォルトの pritunl / pritunl から変えたければ、ここで変えれる。PublicAddress は自動で現在のパブリックIPで埋めてくれているので変える必要なし。
EC2 とかにVPNサーバーを立てる場合は、 PublicAdress には ElasticIP をいれることになる

organization

pritunl のざっくりな設定の流れは、組織(organization)というものにユーザーとサーバーを紐付けていく作業になる。

まず、 organization を作る。

user

ユーザーを作る。先ほど作った組織に所属させる。

server

VPN サーバーを作る。

VPN サーバーの待ち受けポートは推測されないようなポート番号の方がいいので、 pritunl が適当なポート番号をランダムで決めてくれている(今回だと14036)。このポート番号をコピペして、 docker-compose.yaml へ記載する。
上述した docker-compose.yml の pritunl イメージの ports をここで表示されたポート番号に書き換える。
EC2 とかに VPNサーバーを立てる際はこの 14036/udp はセキュリティグループ上で穴あけしておく必要がある。(公開している他のポート 80、443、1194 も同様)

DNS Server は Google の DNS が自動で入力されている。
VirtualNetwork はランダムに決定されたネットワークが入力されている。

ここは特に何もいじらずにそのまま Add で進む。
docker-compose.yaml を修正したので docker-compose を立ち上げ直しておく。

補足すると、ここの VirtualNetwork は NAT で利用する VPN 内のネットワークになるので、 VPN サーバーが所属するローカルネットワーク(今回であればローカル PC が所属するネットワーク)と被ってはいけない。参考
※今回ローカルのネットワークアドレスは 10.11.160.0/19 だったので被っておらずそのままで問題なかった。

route

ルートを作る。ここで決めたネットワークアドレスに対して VPN サーバーが NAT してくれるようになる。今回はローカル環境に VPN サーバーを立てるのでローカルのIPを確認する。

$ ifconfig | grep -w inet
	inet 127.0.0.1 netmask 0xff000000
	inet 10.11.177.51 netmask 0xffffe000 broadcast 10.11.191.255

僕の PC はプライベートIPが 10.11.177.51 で、サブネットが /19 という状態だった。
なので、ネットワークアドレス 10.11.160.0/19 の ルーティング を先ほど作成したサーバーに追加する

attach organaization

organaization と server を紐付ける

これで、 Start Sever をポチれば VPN サーバーが起動できるようになる

クライアントアプリのDL

VPNサーバー側の準備が整ったので、クライアント側の用意をしていく

ここから pritunl のクライアントアプリをダウンロードする
https://client.pritunl.com/

プロファイルの取得

作成したユーザーの↓ボタンを押してプロファイルをダウンロードする

プロファイルの修正

クライアントアプリを立ち上げて、先ほどダウンロードしたプロファイルを読みこむ。
プロファイル設定の接続先 VPN サーバーを書き換える必要があったので(そのままではつながらなかった気がする)、 Edit Config を押す。

Edit Config を押すと、現在の設定が表示される。
接続先の VPN サーバーがパブリックIPになってるので、現在 VPN サーバーが立ち上がっているローカル環境のプライベートIPに書き換える。

VPN サーバーが起動している IP に書き換える

VPNサーバーの起動

Start Server を押して VPN サーバーを起動する。

クライアントからVPNサーバーへ接続

クライアントアプリから Connect を押して、 VPN サーバーに接続する

Connet すると、 GUI上でも一名が現在接続中( 1/1 users online )ということがわかる。

疎通確認

VPN サーバーと接続している状態で ping を打つと通る

$ ping 10.11.177.51
PING 10.11.177.51 (10.11.177.51): 56 data bytes
64 bytes from 10.11.177.51: icmp_seq=0 ttl=64 time=0.042 ms
64 bytes from 10.11.177.51: icmp_seq=1 ttl=64 time=0.078 ms
64 bytes from 10.11.177.51: icmp_seq=2 ttl=64 time=0.056 ms
64 bytes from 10.11.177.51: icmp_seq=3 ttl=64 time=0.054 ms

Disconnect を押して、 VPN サーバーとの接続を切る。

接続が切れると、 ping が通らなくなる

$ ping 10.11.177.51
PING 10.11.177.51 (10.11.177.51): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
Request timeout for icmp_seq 4

Discussion