GCE(Goole Compute Engine) CoreOS インスタンスで OpenVPN サーバを立てる


漢なら GCE で CoreOS で OpenVPN サーバ建てたいですよね!

やりましょう!

(2020 年 4 月 10 日追記): CoreOS は終了しました https://coreos.com/os/eol/
後継は Fefora CoreOS ですが, GCE ですと Fedora CoreOS には現状対応していません. Container optimized OS を選ぶとよさそうです.

前提条件

  • OS のアップデート対応が面倒なので CoreOS(stable) の自動アップデートに頼りたい
    • 起動中の OpenVPN docker インスタンスも再起動してくれるはず?
  • udp 1194 ポートで VPN 通信をする
  • GCP ダッシュボードで設定を行う

手順

VPN サーバを CoreOS で立てる大まかな手順は

月 5 ドルくらいで Docker で簡単に OpenVPN 環境を手に入れる
https://qiita.com/jyane/items/95164ba6b3323723eb40

の 5, 6 を参考にしてください.

firewall の設定

上記 URL によりますと, firewall の設定は, iptables ではなくクラウドサービス側での firewall 設定が CoreOS は推奨とのことですので, GCP のダッシュボードで firewall の設定をします.

ネットワークルール default で CoreOS インスタンスを建てているとしします.

以下のように udp:1194 を許可する firewall rule を default に追加します. rule の名前を vpn にします.

その後, インスタンスの設定で, network tags に上記で設定した rule 名 vpn を追加します.

もしくは, vpn 専用に network rule を作ってもよいでしょう.

クライアントから接続する

CoreOS インスタンス側では

CONTNER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
5d5e4800a5c8        kylemanna/openvpn   "ovpn_run"          10 days ago         Up 10 days          0.0.0.0:1194->1194/udp   hopeful_mirzakhani

のような感じで VPN サーバが動いていることを確認し,

クライアント側で

$ sudo openvpn CLIENT.ovpn

とすれば接続が行われます!

繋がらない場合は firewall の設定などを再確認してください.

自動起動する

CoreOS がリブートしたときに, openvpn コンテナが自動で再起動するようにします.

AWS+CoreOS+Dockerでコンテナの自動起動 1
https://qiita.com/aki/items/979b25ff555eb7ab96fc

を参考にし, systemd ベースで設定してみます.

$ sudo vi /etc/systemd/system/docker-ovpn.service
[Unit]
Description=My Service
After=docker.service
Requires=docker.service

[Service]
ExecStart=/usr/bin/docker run -v $OVPN_NAME:/etc/openvpn -d -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn

[Install]
WantedBy=multi-user.target

$OVPN_NAMEは, 最初のほうで作成したボリュームの名前になります.

今動いている OpenVPN インスタンスがあれば止めておきます.

$ sudo systemctl enable /etc/systemd/system/docker-openvpn.service
$ sudo systemctl start docker-openvpn.service

journalctl などで起動していることを確認し, CoreOS をリブートして openvpn インスタンスが自動起動すれば成功です.

クライアントに静的 ip アドレスを割り当てる

TODO

  • cloud init で openvpn インスタンスの自動立ち上げを行う.
  • 443 ポートに集約したほうがいいかも?
  • https://github.com/kylemanna/docker-openvpn にもあるように, docker で VPN を動かすことのセキュリティを考える旅に出たい