Google Cloud Platformを使ってVPNを構築してみた VPN構築編

前回までのあらすじ

yzk-yzk-yzk.hatenablog.com

前回,GCPの環境構築を完了させました.

今回は本題であるVPNの構築を完了させます.

環境

必要なものをインストールする

それでは前回環境構築したGCPVMインスタンスをTera Tarmから起動します.

f:id:yzk_yzk_yzk:20200507140951p:plain

ここに必要なものをインストールしていきます.

まずはOpenVPNをインストールします.

sudo apt -y install openvpn

次にeasy-rsaをインストールします.

現在いるディレクトリにインストールされますので,別の場所にインストールしたい場合は任意のディレクトリに移動してください.

git clone https://github.com/OpenVPN/easy-rsa.git

インストール完了後,easy-rsaのフォルダーに移動します.

cd easy-rsa/easyrsa3

前提となる証明書を発行していこう

初期設定

まずはイニシャライズ(initialize),初期設定を行います.

./easyrsa init-pki

CA証明書発行

次にVPNに必要な証明書を発行していきます.

./easyrsa build-ca

Enter New CA Key Passphraseと表示されるので,任意のパスフレーズを入力します.

そのあと,もう一度入力を要求されますので同じパスフレーズを入力します.

そのあと,証明書の名前を要求されるので任意の名前(なるべく覚えやすい名前)を入力します.

これで証明書を発行できたので/etc/openvpnopenvpnをインストール時生成されたフォルダー)にコピーします.

sudo cp pki/ca.crt /etc/openvpn

サーバ証明書発行

次に前に発行した証明書とは別にサーバ証明書を発行します.

./easyrsa build-server-full server nopass

Enter pass phraseと先ほど設定したパスフレーズを要求されるので,設定したパスフレーズを入力します.

これでこちらの証明書も発行できましたのでこちらも/etc/openvpnにコピーします.

sudo cp pki/issued/server.crt /etc/openvpn
sudo cp pki/private/server.key /etc/openvpn

DH鍵発行

次に鍵となるDH鍵を発行します.

./easy-rsa gen-dh

This is going to take a long timeと表示されるように,発行に時間がかかりますのでしばらく待ちます.

DH parameters of size 2048 created at ~/easy-rsa/easyrsa3/pki/dh.pemと表示されれば発行完了します.

このdh鍵を上と同じように/etc/openvpnにコピーします.

sudo cp pki/dh.pem /etc/openvpn

クライアント証明書発行

証明書としてもう1つ,クライアント証明書を発行します.

./easy-rsa gen-crl

Enter pass phraseとこちらもパスフレーズを要求されるので,設定したパスフレーズを入力します.

これでこちらの証明書も発行できましたのでこちらも/etc/openvpnにコピーします.

sudo cp pki/crl.pem /etc/openvpn

そして,crl.pemの書き込み権限をo+rにします.

sudo chmod o+r /etc/openvpn/crl.pem

これで前提となる証明書を発行できました!

ls /etc/openvpn
ca.crt  crl.pem  dh.pem  server.crt  server.key  update-resolv-conf

となればちゃんと発行完了しています.

f:id:yzk_yzk_yzk:20200513082421p:plain

前提証明書発行まとめ

./easyrsa init-pki
./easyrsa build-ca
sudo cp pki/ca.crt /etc/openvpn
./easyrsa build-server-full server nopass
sudo cp pki/issued/server.crt /etc/openvpn
sudo cp pki/private/server.key /etc/openvpn
./easyrsa gen-dh
sudo cp pki/dh.pem /etc/openvpn
./easyrsa gen-crl
sudo cp pki/crl.pem /etc/openvpn
sudo chmod o+r /etc/openvpn/crl.pem

OpenVPNの設定

次にOpenVPNの設定を行います.

任意のエディタ(私はvi)を使って設定ファイルを作ります.

vi /etc/openvpn/server.conf

server.conf内に以下の設定を記載していきます.

port 1194
proto udp
dev tun

ca ca.crt
cert server.crt
key server.key
dh dh.pem
crl-verify crl.pem

ifconfig-pool-persist ipp.txt

server 10.8.0.0 255.255.255.0

push "redirect-gateway def1 bypass-dhcp"
push "route 10.8.0.0 255.255.255.0"
push "dhcp-option DNS 8.8.8.8"

client-to-client
keepalive 10 120
comp-lzo

user nobody
group nogroup

persist-key
persist-tun

status /var/log/openvpn-status.log
log /var/log/openvpn.log
log-append /var/log/openvpn.log

verb 3

設定ファイル内を説明していきます.

port

接続する際のポート番号です,openvpnにおけるデフォルト番号は1194です.

1194が他のソフトに利用されていたり使用できない場合はこの値を任意の番号に変更してください.

proto

プロトコルを選択します.tcpもしくはudpを選択します.

こちらもデフォルトはudpですが,使用できない場合はtcpに変更してください.

dev

接続方式を選択します.私はtun(ルーティング方式)を選択しています.

その他にもtap(ブリッジ方式)がありますのでそちらを選択したい場合は変更してください.

(但し,設定ファイルをその他にも変更する必要があります.詳細はその項目に記載します.)

ca~crl-verify

前述した証明書のファイルの場所を記載しています.

ip-config-pool-persist

vpnに接続するクライアントを管理するファイルを指定しています.

任意のファイル名を記載すれば大丈夫です.

server

vpnで使用するプライベートipとサブネットマスクを指定しています.

デフォルトとして10.8.0.0 255.255.255.0です.任意の番号に変えたい場合は適切な番号に変更してください.

(tap(ブリッジ方式)で接続する場合は例として,

server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100

と設定してください.

こちらはvpnサーバーのipアドレス10.8.0.4サブネットマスク255.255.255.0を割り振られています.

クライアントには10.8.0.50から10.8.0.100を割り振ります.

こちらの任意の番号に変えたい場合は適切な番号に変更してください.)

push

redirect-gateway def1 bypass-dhcpは,すべてのトラフィック(ネットワーク接続)をVPN接続経由に行うための設定です.

route 10.8.0.0 255.255.255.0は,クライアント側にVPNで使用するipアドレスサブネットマスクを通知するための設定です.

dhcp-option DNS 8.8.8.8は,使用するDNSを指定するための設定です.

今回はGoogleDNSサービスを使用しています.

developers.google.com

他のDNSサービスを使用したい場合は任意の番号に変更してください.

参考にCloudfireのDNSサービスを紹介します.

1.1.1.1

client-to-client

クライアント間の接続を許可する場合はこの項目を追加してください.

必要ない場合はコメントアウトしてもらっても大丈夫です.

#client-to-client

keepalive

vpn通信を行っている際のタイムアウトを設定します.デフォルトは10 120です.

左の値が通信確認の間隔,右の値が切断するまでの秒数です.

comp-lzo

通信する際のパケットを圧縮する指定です.

圧縮すると通信速度が上がりますが,性能の低いマシンだと下がる場合が有ります.

そのため,マシンの性能によってこの設定を無効にする場合はコメントアウトしてください.

#comp-lzo

user group

OpenVPNをどのユーザ,グループ権限で行うかを指定します.

デフォルトは,userがnobody,groupがnogroupです.

適切なユーザ,またはグループに書き換えたい場合は任意の権限に設定してください.

persist-key,persist-tun

OpenVPNが再起動したい際に,鍵ファイルなどを再読み込みしないようにする設定です.

特別な理由がない限り設定して大丈夫です.設定しない場合はコメントアウトしてください.

#persist-key
#persist-tun

(tap(ブリッジ方式)の場合は

persist-tun

persist-tap

に書き換えてください.)

status,log,log-append

クライアントの状態を書き込むファイルとOpenVPNのログを書き込むファイルを指定しています.

デフォルトはstatusはopenvpn-status.log,log,log-appendはopenvpn.logです.

今回ログの保存場所を/var/log内に設定しています.

verb

ログファイルに書き込む際にどれぐらいの事態によって書き込むかを指定しています.

デフォルトは3です.

3か4がおすすめです.

ファイアウォール設定

これでOpenVPNの設定は(ほぼ)完了しました!

後はこのマシンに外部から接続させてやればVPN構築が完了します.

まずはファイアウォールの設定をしましょう!

まず前準備としてすべてのポートを遮断します.

sudo ufw default deny

その後,先ほど指定した接続するポート番号を開けます.

sudo ufw allow 1194/udp

また,当環境はsshにて接続しているのでsshで接続したい番号を開けておきます.

デフォルトは22番ですが任意の番号にしたい場合はここで開けておいてください.

sudo ufw allow 2222

その後,ファイアウォールを有効化します.

sudo ufw enable

ちゃんと空いたか確認するために以下のコマンドを実行して指定のポートが空いているか確認してください.

sudo ufw status

私は2222ポート1194/udpポートを開けています.

f:id:yzk_yzk_yzk:20200513085351p:plain

GCP再設定

しかし,この状態だとGCP側のファイアウォールが開いてないため,OpenVPNにもsshにも接続できません.

一回GCPの設定に戻り,VPNネットワーク→ファイアウォールルールを選択します.

f:id:yzk_yzk_yzk:20200513085739p:plain

ファイアウォールの設定画面が開くのでまず,default-allow-sshを編集します.

編集画面のプロトコルとポートからtcpの値を22→2222に変更して保存します.

f:id:yzk_yzk_yzk:20200513090123p:plain

次に,上のファイアウォールルール作成を押してOpenVPN用のファイアウォール設定を作成します.

そして次のように設定します.

これで保存すれば完了です!

Ubuntuに戻ろうか

これでVPNには接続できます.

しかし,接続した後インターネットには接続できない設定になっています.

この状態を直すためにさらなる設定を行います.

任意のエディタ(私はvi)にて

vi /etc/default/ufw

を開きます.

その中のDEFAULT_FORWARD_POLICYDROP→ACCEPTに変更します.

#DEFAULT_FORWARD_POLICY="DROP"
DEFAULT_FORWARD_POLICY="ACCEPT"

次に

vi /etc/ufw/sysctl.conf

を開きます.

こちらではnet.ipv4.ip_forward=1をアンコメントします.

#net.ipv4.ip_forward=1
net.ipv4.ip_forward=1

次にifconfigを開きます.

ifconfig

すると環境によりますが複数のインターフェイスが出てきます.

ens4      Link encap:Ethernet  HWaddr 42:01:0a:8a:00:05
          inet addr:グローバルip もしくは 内部ip(どちらもGCPで確認可能)
          inet6 addr: 割り振られた値 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1460  Metric:1
          RX packets:881674 errors:0 dropped:0 overruns:0 frame:0
          TX packets:804183 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:365106167 (365.1 MB)  TX bytes:152643986 (152.6 MB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          inet addr:10.8.0.1  P-t-P:10.8.0.2  Mask:255.255.255.255
          inet6 addr: fe80::86e3:757c:3306:3ce2/64 Scope:Link
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1358  Metric:1
          RX packets:48995 errors:0 dropped:0 overruns:0 frame:0
          TX packets:53594 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:25728319 (25.7 MB)  TX bytes:43320430 (43.3 MB)

インターフェイスの中にグローバルipか内部ip(GCPで確認可能)が割り振られているインターフェイスの名前(今回はens4)を覚えておきます.

エディタにて,

vi /etc/ufw/before.rules

を開きます.

一番下の行まで進んで,COMMITと書かれたその下から次のような文章を書きます.

*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/24 -o 先ほど覚えたインターフェイスの名前 -j MASQUERADE
COMMIT

設定後,ファイアウォールを再起動します.

sudo ufw reload

OpenVPN起動

ようやくOpenVPNを起動しましょう!

sudo systemctl start openvpn

以下のコマンドを実行して,プロセスが動いていれば成功しています.

ps -ef | grep openvpn | grep -v grep

(起動できなかった場合は

sudo systemctl start openvpn@server

にて起動できるか確認してください.

こちらで起動できない場合は,スペルミスやポート開放ミスが発生している恐れがあるので,/var/log/openvpn.logを見てエラー原因を見つけてください.

これでVPN構築は完了しました!!

後はVPNを外部から接続するテストだけです!

近日中にテストのための準備とテストについて記載したいと思いますのでよろしくお願いします.

前回:

Google Cloud Platformを使ってVPNを構築してみた GCP環境構築編 - yzk_yzk_yzk’s blog

次回:作成中

Google Cloud Platformを使ってVPNを構築してみた GCP環境構築編

あらすじ

大学が延期になったり、オンラインになったりでいろいろと大変なことが起きている現状です.

この機に何か面白いことしてみたいなーと思った頃,突然思いついたこととしてVPN構築してみたいなーと思いました.

(ついでにUbuntuとかに建てればLinux触れて楽しいとか思ったりしてました)

VirtualBoxにて仮想環境を組んだうえで建てるやり方とクラウドサービスを利用して外部にサーバーを建てるやり方をまず考え,少し考えた結果今後クラウドサービスを使う機会も多くなると考え後者を選ぶことにしました.

 

環境

Google Cloud Platform

Ubuntu 16.04 LTS

OpenVPN 2.4.8

・easy-rsa 3.0.7-1

 

まずはGCPの環境構築

そんなわけでまずはGCPに登録してクラウドを借りるところから始まります.

cloud.google.com

サクッと無料トライアル押してGoogleアカウントとクレジットカードを使って登録していきます.

無料枠内での使用であれば料金は自動発生しません.

登録が完了した後はVPNを構築するための機械を作成していきます.

まずは機械を管理するためのプロジェクトを作成します.

プロジェクト作成

初期画面にて①をクリックして②の新しいプロジェクトを選択します.

 

f:id:yzk_yzk_yzk:20200503210339p:plain


プロジェクト名に任意の名前を入力します.

※後から名前は変更できません

f:id:yzk_yzk_yzk:20200503210537p:plain

VMインスタンス作成

次にプロジェクト内にVPNサーバとなる機械,VMインスタンスを作成します.

左上のハンバーガーメニューからCompute EngineからVMインスタンスを選択します.

f:id:yzk_yzk_yzk:20200503211325p:plain

作成ボタンを選択した後,VMインスタンスの設定画面が開きます.

無料枠内での利用のために次のように設定します.

  • 名前
     任意の名前を入力します
  • リージョン・ゾーン
    リージョンを「us-west1」,ゾーンを「us-west1-a」にします
  • マシンの構成
    マシンタイプを「f1-micro」にします
  • ブートディスク
    オペレーティングシステムを「Ubuntu」 バージョンを「Ubuntu 16.04 LTS」にします
  • 管理、セキュリティ、ディスク、ネットワーク、単一テナンシー内のネットワーキング
    IP転送を「オン」にします

設定後作成を押せば無事に作成することが出来ました!

f:id:yzk_yzk_yzk:20200503214030p:plain

VPNを構築するための準備

それではVMインスタンスの機械を動かしてみましょう!

上の画面内の接続からSSHを選択するとGCP内にて起動することが出来ます.

この中にVPNサーバを立てていきます.

ただ私はTera Tarmなどで接続したい人なのでもうひと手間加えます.

(外部ソフトで接続しなくてもいい人は飛ばしても大丈夫です.)

 

SSH鍵を生成する

自分の利用しているPCに戻り,ターミナルを起動します.(windowsの場合はWindowsPowerShell

ターミナル内にて下記のコードを実行します.

ssh-keygen -t rsa -b 4096 -C "任意のユーザ名"

そのあと3回入力を求められます.

1回目は保存場所(とファイル名)を指定されますので任意の場所に保存します.

2回目と3回目はパスワードを聞かれますので,任意のパスワードか空欄のままエンターを押します.

続いて,保存先のフォルダ内に2つファイルが生成されていますので,.pubのほうをターミナルのcatを使うか,メモ帳などで開いて表示します.

 中身の文字列をコピーします.文字列を利用するので他の物をコピーしたりしないでください.

ssh-rsa AAAA ........... 設定したユーザ名

SSH鍵をGCP内に登録する

先ほど作成したVMインスタンスをクリックして詳細を開きます.

その後上の編集を選択した後,SSH鍵がN個ありますの下の表示して編集するを選択します.

f:id:yzk_yzk_yzk:20200503223301p:plain

選択した後,先ほどコピーした文字列を貼り付けます.

その後,下の保存を選択します.

Tera Tarmにて接続する

最後にTera Tarmにて外部から接続します.

Tera Tarmを開いて以下のように設定してOKを押します.

  • ホスト
    設定したユーザ名@VMインスタンスの外部IP
    (外部IPはインスタンス一覧から確認します)
  • サービス
    SSH
  • TCPポート
    22(後で変更します その時はその番号に変更してください)

OKを押すと認証画面が出るので,RSA/DSA/ESDSA/ED25519鍵を使うを選択して,秘密鍵から先ほど生成された.pubじゃないほうを選択してOKを押します.

これで接続できれば完了です.

(ターミナルで接続する場合は

ssh 設定したユーザ名@VMインスタンスの外部IP -i ~/.ssh/”.pubじゃないほうのファイル名”

にて接続できます.)

 

最低限のGCP設定完了です

これでGCPを「とりあえず」使えるようになりました!

近日中にてVMインスタンス内にVPNサーバ構築方法について記載したいと思うのでよろしくお願いします.

次回:

Google Cloud Platformを使ってVPNを構築してみた VPN構築編 - yzk_yzk_yzk’s blog