Posted at

月 5 ドルくらいで Docker で簡単に OpenVPN 環境を手に入れる

More than 3 years have passed since last update.


月 5 ドルくらいで Docker で簡単に OpenVPN 環境を手に入れる

DigitalOcean はとても安い感じでサーバーを使わせてくれます.

しかも学生なら GitHub Student Developer Pack から $100 もらえるので,20ヶ月くらい無料でサーバーを使えます.

多くの企業や大学ではポートが制限されていたり,検閲があったりするので VPN は便利です.

さらに野良 AP などに接続する時でも,VPN 環境では安心感があります.

また,CoreOS は始めから Docker が使えるので簡単で OS 自体が小さいので安全っぽい感じがあります.

ここでは DigitalOcean と CoreOS を使って,簡単に全てのトラフィックを VPN に通す OpenVPN 環境を手に入れます.

Ubuntuなどでセットアップを行いたい場合は,適当にセットアップして 5 からスタートしてください.

最後に注意があるので必ず目を通してください.


1. DigitalOcean のアクセストークンを取得する.

アカウントを登録してアクセストークンを取得します.

export DIGITALOCEAN_ACCESS_TOKEN=TOTTATOKEN


2. ssh の公開鍵を DigitalOcean に登録して ID をとる.

DigitalOcean の 設定から クライアント側の ssh の公開鍵を登録します.

以下のコマンドでその公開鍵の ID を取得します.これは後で使います.

curl --request GET "https://api.digitalocean.com/v2/account/keys" \

--header "Authorization: Bearer $DIGITALOCEAN_ACCESS_TOKEN"


3. cloud-config.yaml で最低限の設定と iptables を定義しておく

CoreOS は iptables 以外の方法で,FW を設定することを薦めています(AWS の FW など).

大丈夫そうですが iptables を設定しておきます.

地味に一行目のコメントを入れないと怒られるので注意です.

#cloud-config

coreos:
units:
- name: docker.service
command: start
- name: timezone.service
command: start
content: |
[Unit]
Description=timezone
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/ln -sf ../usr/share/zoneinfo/Japan /etc/localtime
- name: iptables-restore.service
enable: true
write_files:
- path: /var/lib/iptables/rules-save
permissions: 0644
owner: 'root:root'
content: |
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth1 -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
COMMIT


4. Droplet を作る.

DigitalOcean は Droplet を保持している間だけお金を取られます.

以下のコマンドを実行した時点でお金がかかり始めます.

アメリカの IP を使えた方が色々便利なので,アメリカに作る(人によります).

サンフランシスコの方がニューヨークより近い感じがするのでサンフランシスコで.

(実際に ping が 70 くらい違ったので少し近そうです)

/path/to/cloud-config.yamlには 3 で作成したファイルのパスを入れる.

ssh_keys は DigitalOcean に登録した ssh の公開鍵を使う(さっき取ったIDを入れる).

curl --request POST "https://api.digitalocean.com/v2/droplets" \

--header "Content-Type: application/json" \
--header "Authorization: Bearer $DIGITALOCEAN_ACCESS_TOKEN" \
--data '{"region":"'sfo1'",
"image":"coreos-stable",
"size":"'
"512mb"'",
"user_data": "'
"$(cat /path/to/cloud-config.yaml)"'",
"ssh_keys":["'
"SAKKITOTTAID"'"],
"name":"KAKKOIISERVERNAME"}'


5. サーバーでドカドカする

ここからのコマンドは以下のリポジトリから取ってきた物で,URL 先に詳細が書いてあります.

ありがたく使わせていただきます.

https://github.com/kylemanna/docker-openvpn

README.mdに色々書かれているので,よく読みます.

作成した Droplet に ssh ssh core@$IPでアクセスして,以下のコマンドを実行していきます.

CLIENTNAME には好きなクライアントの名前を入れる.

VPN.SERVERNAME.COM にはそのサーバーのドメインを入れる(IP で指定してもいいけど,おすすめしないらしいです).

# データコンテナの名前(好きなので良い)

export OVPN_DATA='ovpn-data'

docker run --name $OVPN_DATA -v /etc/openvpn busybox
docker run --volumes-from $OVPN_DATA --rm kylemanna/openvpn ovpn_genconfig -u tcp://VPN.SERVERNAME.COM:443
docker run --volumes-from $OVPN_DATA --rm -it kylemanna/openvpn ovpn_initpki
docker run --volumes-from $OVPN_DATA -d -p 443:1194/tcp --cap-add=NET_ADMIN kylemanna/openvpn
docker run --volumes-from $OVPN_DATA --rm -it kylemanna/openvpn easyrsa build-client-full CLIENTNAME nopass
docker run --volumes-from $OVPN_DATA --rm kylemanna/openvpn ovpn_getclient CLIENTNAME > CLIENTNAME.ovpn

パスフレーズなどを聞かれるので,よしなにする.

(一部の環境では OpenVPN のポートすら制限されているかもしれないので HTTPS 443 のポートを使わせていただく.)


6. CLIENTNAME.ovpn を sftp などしてクライアントにダウンロード

sftp core@$IPでログインして,get CLIENTNAME.ovpn します.


7. クライアントで sudo openvpn --config CLIENTNAME.ovpn を実行して気持ちよくなる.

クライアント側の OS や ツール などはたぶん何でも良いです.

今回は brew install openvpnでインストールした物を使った.

IPが変わっていれば気持ちいい.

(名前解決できない感じがした場合は,パブリックな DNS 8.8.8.8 などを使ってください)


諸注意


  1. この記事では,このリポジトリ https://github.com/kylemanna/docker-openvpn を使用しています.

  2. 作者が作成した解説記事があります. https://www.digitalocean.com/community/tutorials/how-to-run-openvpn-in-a-docker-container-on-ubuntu-14-04?utm_source=githubreadme

  3. リポジトリのページには How does it work? や Security Discussion があります.目を通しましょう.

  4. 今回作成したサイズの Droplet では月 1TB までが料金の範囲内です.範囲を超えると通信料に応じて料金が発生します.

  5. DigitalOcean は Droplet を放棄しない限り料金が発生し続けます.