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
次回:作成中