GCPとSoftEther VPNで固定IPゲートウェイ環境を作る

会社のISP回線は固定IPじゃないのだが、GCPを使って固定IPゲートウェイを作ったのでメモ

まず最初に某オープンVPN使ったが速度が遅い、というか通信途切れる。
MTUとMSS調整してもどうも接続が途切れるので2日で諦めたw

次いで、昔外から家の中のPCにつなぐ時に使ってたSoftetherがさらに進化してるというのでトライ。

1. GCEでVM立てる

まずはGCEでUbuntuインスタンスを立てる。
マシンタイプはn1-standard-1にした。個人用途ならg1-smallでもいいが、会社で数名が使うのでスタンダードで。

ネットワーク設定で、IP forwarding(IP転送)の設定をONにした。
てか、これいらないのかな?某オープンVPNの時は必須だったのでそれを倣っただけ。
VM作ったあとだとIP forwarding設定を変更出来ないのよね。

Network Tagに「vpn」という文字列をセットする。
あとでVPC Firewall Rules設定で、vpnタグに対しての通信を許可するため。

そしてExtenal IPをStaticにして固定IPにしておく事。

IP転送設定とネットワークタグを追加

2. VPC Firewall Rules設定で穴をあける

新しいFirewallルールをdefault-allow-vpnという名前で作る。
ネットワークタグ「vpn」に対してIngress通信を許可で、許可ポートは下記のもの

tcp:5555
udp:500,1701,4500

tcp:5555がSoftether用で、udpポートはMacのL2TP/IPSec用のポート。マカー社員用の措置。

VPC Firewall設定

3. Softether VPN Serverのインストール

Ubuntuへのインストールは公式の方法だとinitdを使う起動方法しか書いてないので、このサイトを参考にしてsystemdで起動するようにした↓

自分だけのVPNサーバを作る!Ubuntu 18.04 に SoftEther VPN Serverをインストール

ビルドに必要なライブラリを先にインストールしておく必要があるので、

$ sudo apt install build-essential

で先にインストールしておく。

ファイヤーウォールはGCPのVPC Firewall設定でやるので、ufwは使わない。

インストール後、vpncmdというコマンドラインのCUI管理機能でセットアップするんだが、これが分かりづらかったの代替案。
Virtualbox内のWindowsゲストOSにSoftetherVPN Server ManagerというGUI管理ツールをインストールして設定。
これは楽だw

ゲストWindows上でSoftetherのGUIツールを実行すると楽

※話が脱線するが、VirtualboxをUbuntuにインストールする手順はこちらに書いてます。で、Windowsもってない場合はここから60日間だけ使える検証用WindowsのOVAファイルをダウンロードして、Virtualboxにインポートすれば60日間使えます。

やることは仮想ハブとユーザーを作成し、SecureNAT機能をONにするのと、あとはDHCPサーバー機能もONにした。

そして、ローカルブリッジ機能は絶対にONにしてはイケない。
やりたことはNATなのでローカルブリッジは不要。
しかし、最初よくわからずローカルブリッジをONにした結果、CPU利用率が100%になって全く通信出来ない状況になった。
というわけで、SecureNAT機能を使う時は、ローカルブリッジは必ず無効にする。

External IPを固定にしてるので、ダイナミックDNS機能は無効化する。
GUIから無効化しようとしると、設定ファイルを編集してオフにしろという。
というわけで設定ファイル編集画面から一旦設定ファイルをエクスポートして、それを編集してDDNSをオフ→そして再びインポートすればDDNS無効化できる。

DDNS設定を無効化

ユーザーを追加して、次はSoftetherクライアントのインストール

4. Softether VPN Clientのインストール

サーバーはUbuntu、そしてクライアントもUbuntu(Xubuntu)である。

Linuxクライアントのインストール方法はServer版と全く同じです。
なので、上記でやった手順の「server」を「client」に読み替えて、クライアントをインストールします。

vpncmdでの設定はこうした。

VPN Client>NicCreate vpn

#サーバーアドレスとユーザー名は正しいものを入れる
VPN Client>AccountCreate softether /SERVER:203.0.113.9:5555 /HUB:VPN /USERNAME:orenomemo /NICNAME:vpn

#パスワードは正しいものを入れる
VPN Client>AccountPasswordSet softether /PASSWORD:mypassword /TYPE:standard 

VPN Client>AccountEncryptEnable softether

VPN Client>AccountStartupSet softether

コマンドライン設定がメンドクサイ場合は、これまたVirtualboxのゲストWindowsにSoftetherVPN Client ManagerをインストールしてGUIで仮想NICの作成と接続設定を作成すればOK.
vpncmdで、RemoteEnableを実行しておくとVirtualboxクライアントからリモート接続できます。
Vitrualboxホストオンリーネットワークを有効にしてるので、そこから繋ぎます。

そして厄介なのがSoftether接続後に自分でルーティング設定を変える必要がある。
そしたらsoftetherクライアント起動後にルーティング設定を追加するためのスクリプトを書いた人がいたので、それを参考にした。

SoftEther VPN ClientをUbuntu 14.04LTSで使うときにちょっとはまったこと – KITA Eng.

ちょっと修正してある。
vpnclient起動にちょっと時間がかかる時があるのでsleepを入れた。
あとは、テザリングしてる時でも使えるようにデフォルトゲートウェイのIPアドレスをコマンドラインで取得して一時ファイルに記録しておくようにした。


#!/bin/bash

DAEMON=/home/orenomemo/vpnclient/vpnclient #vpnclient のパスに変える
VPNUP=`ps -ef | grep vpnclient | grep -v grep | wc -l`
VPNNAME=vpn_vpn
DEFROUTE=$(ip route show | grep -E -m1 '^default'|awk '{print $3}')
NEWDEFROUTE=192.168.30.1
CONFIG=~/.softethercfg

if [ ${DEFROUTE} = ${NEWDEFROUTE} ]; then
    DEFROUTE=$(cat ${CONFIG})
fi

SERVER=203.0.113.9 #softetherサーバのIPに変える
NIC=wlp0s20f3

test -x ${DAEMON} || exit 0

case "$1" in
  start)
 
    if [ ${VPNUP} = 0 ]; then
        sudo ${DAEMON} start

        sleep 3
        
        VPNLINK=`ip -4 -o addr | grep -c vpn_`

        sudo dhclient ${VPNNAME}

        while [ ${VPNLINK} = 0 ]
        do
          echo "Waiting for startup vlan up..."
          sleep 1
          VPNLINK=`ip -4 -o addr | grep -c vpn_`          
        done

        sudo ip route add ${SERVER} via ${DEFROUTE} dev ${NIC}
        sudo ip route replace default via ${NEWDEFROUTE} dev ${VPNNAME}

        echo ${DEFROUTE} > ${CONFIG}
        
      else
        echo "VPN Client has already started!"
        exit 1
    fi
  ;;
  stop)

    if [ ${VPNUP} = 0 ]; then
        echo "VPN client has already stoped"
        exit 1
      else
        sudo ip route del ${SERVER} via ${DEFROUTE} dev ${VPNNAME}
        sudo ip route replace default via ${DEFROUTE} dev ${NIC}
        sudo ${DAEMON} stop
        rm -rf ${CONFIG}
    fi
  ;;
  restart)
    $0 stop
    sleep 3
    $0 start
  ;;
  *)
  echo "Usage: $0 {start|stop|restart}"
  exit 1
esac

exit 0

ルーティング変更後、下記ページを開いてIPアドレスがGCEのExternal IPアドレスになってれば、Softetherをゲートウェイにしたアクセス完了という事。

IPアドレス確認 | KWONLINE.ORG

これで、DHCPで度々IPアドレスが変わる会社でも常に固定IPでネットにアクセスできる固定IPゲートウェイの出来上がり。