pritunlでローカルにVPNサーバーを立てる
はじめに
pritunl の勉強としてローカルに VPN サーバーを立ててみた際の作業記録。
docker-compose で起動
上記で紹介されているこの 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 のクライアントアプリをダウンロードする
プロファイルの取得
作成したユーザーの↓ボタンを押してプロファイルをダウンロードする
プロファイルの修正
クライアントアプリを立ち上げて、先ほどダウンロードしたプロファイルを読みこむ。
プロファイル設定の接続先 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