Google Cloud Platformを使ってVPNを構築してみた VPN構築編
前回までのあらすじ
前回,GCPの環境構築を完了させました.
今回は本題であるVPNの構築を完了させます.
環境
必要なものをインストールする
それでは前回環境構築したGCPのVMインスタンスをTera Tarmから起動します.
ここに必要なものをインストールしていきます.
まずは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/openvpn(openvpnをインストール時生成されたフォルダー)にコピーします.
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
となればちゃんと発行完了しています.
前提証明書発行まとめ
./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
こちらもデフォルトは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を指定するための設定です.
他のDNSサービスを使用したい場合は任意の番号に変更してください.
参考にCloudfireのDNSサービスを紹介します.
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ポートを開けています.
GCP再設定
しかし,この状態だとGCP側のファイアウォールが開いてないため,OpenVPNにもsshにも接続できません.
一回GCPの設定に戻り,VPNネットワーク→ファイアウォールルールを選択します.
ファイアウォールの設定画面が開くのでまず,default-allow-sshを編集します.
編集画面のプロトコルとポートからtcpの値を22→2222に変更して保存します.
次に,上のファイアウォールルール作成を押してOpenVPN用のファイアウォール設定を作成します.
そして次のように設定します.
これで保存すれば完了です!
Ubuntuに戻ろうか
これでVPNには接続できます.
しかし,接続した後インターネットには接続できない設定になっています.
この状態を直すためにさらなる設定を行います.
任意のエディタ(私はvi)にて
vi /etc/default/ufw
を開きます.
その中のDEFAULT_FORWARD_POLICYをDROP→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に登録してクラウドを借りるところから始まります.
サクッと無料トライアル押してGoogleアカウントとクレジットカードを使って登録していきます.
無料枠内での使用であれば料金は自動発生しません.
登録が完了した後はVPNを構築するための機械を作成していきます.
まずは機械を管理するためのプロジェクトを作成します.
プロジェクト作成
初期画面にて①をクリックして②の新しいプロジェクトを選択します.
プロジェクト名に任意の名前を入力します.
※後から名前は変更できません
VMインスタンス作成
次にプロジェクト内にVPNサーバとなる機械,VMインスタンスを作成します.
左上のハンバーガーメニューからCompute EngineからVMインスタンスを選択します.
作成ボタンを選択した後,VMインスタンスの設定画面が開きます.
無料枠内での利用のために次のように設定します.
- 名前
任意の名前を入力します - リージョン・ゾーン
リージョンを「us-west1」,ゾーンを「us-west1-a」にします - マシンの構成
マシンタイプを「f1-micro」にします - ブートディスク
オペレーティングシステムを「Ubuntu」 バージョンを「Ubuntu 16.04 LTS」にします - 管理、セキュリティ、ディスク、ネットワーク、単一テナンシー内のネットワーキング
IP転送を「オン」にします
設定後作成を押せば無事に作成することが出来ました!
VPNを構築するための準備
上の画面内の接続から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個ありますの下の表示して編集するを選択します.
選択した後,先ほどコピーした文字列を貼り付けます.
その後,下の保存を選択します.
Tera Tarmにて接続する
最後にTera Tarmにて外部から接続します.
Tera Tarmを開いて以下のように設定してOKを押します.
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