GCPのGCEにOpenVPN serverを立てて外出先から自宅へリモートアクセスする

非ネットワークエンジニアが長期休暇中に苦戦しつつ試行錯誤してみたんで備忘録。
セキュリティ的に穴がないかはよくわかりません。

背景

自宅の固定(?)回線をUQ WiMAXからSoftbank系LTEに変えたら、グローバルIPがなくなって自宅にアクセスしづらくなった。

やったこと

・Google Cloud Platform(GCP) / Google Computing engine(GCE)の無料枠でOpenVPN serverを立てた
・OpenVPNで下記のようなネットワーク構築した(draw.io便利ですね…)

GCEの無料枠でOpenVPN serverを立てた

サーバー準備

まずこの通りにサーバーを準備。

GCPで無料枠のサーバを立るときに、初見でハマりそうなところ
https://qiita.com/ndxbn/items/7ef0a96e409a5b5837bd

OSはCentOS7にした。
あと外部へのGWなVPNとして使うならforwardingを有効にすること。

OpenVPN初期設定

続いてOpenVPNのインストール。
$ sudo su
# yum -y install openvpn

RSA鍵生成

CA/鍵はローカルのUbuntu(on-Win10)で生成。
WSL(Windows subsystem for linux)便利ですね。MSのStoreからubuntu appを入れて初期設定したら、
cmd.exeを起動して
> ubuntu
$ sudo su
# apt-get install easy-rsa

あとは

AWS環境にOpenVPNでVPNを構築
https://qiita.com/hideki/items/657a5701133e713fcf8c

の”各種keyの作成”以降な感じで。
$ cd /usr/share/easy-rsa
$ sudo su
# source ./vars
# ./clean-all
# ./build-ca
“source ./vars”の前にvarsを編集して置くと楽。
Server側は
# ./build-key-server server
# ./build-dh

Client側の鍵は
# ./build-key gateway
# ./build-key client
と準備する。

ネットワーク構築

上記で作った各種鍵(ca.crt,server.crt,server.key,dh2048.pem)を/etc/openvpn/keys以下に転送する。
あとは下記OpenVPNのプロファイルでルーティング指定するくらい。

Server側

Server用Profile
/etc/openvpn/server.conf

/etc/openvpn/ccd/gateway
ifconfig-push 10.8.0.100 10.8.0.101
iroute 192.168.1.0 255.255.255.0
push "route 10.8.0.0 255.255.255.0"

/etc/openvpn/ccd/client
push "route 192.168.1.0 255.255.255.0"
最後に
[root@GCE] # systemctl enable openvpn@server.serviceでサービス化

Client/Gateway側

・OpenWRT/LEDEにpackageを追加(openvpn-openssl,luci-app-openvpn)
・VPNなzoneを作って、tun0を入れて、in/out/forwardをacceptした
・/etc/config/openvpnに下記へ追記
config openvpn 'gw_gce'
option enabled '1'
option config '/etc/openvpn/client.conf'

下記プロファイルを/etc/openvpn/client.confとして配置する

Client側は鍵は埋め込むと楽。
easy-rsaで生成したもののうち、
ca: ca.crt
cert: gateway.crt
key: gateway.key
tls-auth: ta.key
をテキストで開いて中身を貼り付ける。

Client/Remote側

AndroidのOpenVPN clientを使った。
プロファイルはgatewayで使ったものと同じ。
埋め込む鍵をclient.crt/client.keyに変更すること。

感想

・topologyを公式がrecommendしているsubnetにしたら”ip r get”で問題なさそうなのにtun内で詰まってしまい時間を浪費→net30にしたら解決
・OpenWRTだとOpenVPNが2.3で、CentOSに入れた2.4系と接続が怪しい。OpenWRTはここ2年更新されないし、と思って調べたらLEDEに変わっていた。
・CentOS7って初期状態だとiptableとかroute入っていない!?でも覚えればipコマンド便利ですね
・CentOS7って初期状態だとipconfig無いの(以下略
・pingの受け側でtcpdumpを使うと色々デバッグできる。