実は簡単な、クラウド上でのVPNサーバの構築
VPNサーバを自前で立ち上げるというと、かなりハードルがあがってしまうと感じる方もいると思います。筆者もOpenVPNなどの環境構築をしたことがありますが、構築に非常に苦労した経験があります。しかし、WireGuardというオープンソースVPNなら容易に環境を構築可能です。
実際にどの程度簡単なのかを紹介する目的も含め、構築手順を紹介します。
VPNサーバのインストール
Ubuntu上にWireGuardをインストールしていきます。
インストールはリスト5のようにし、必要な鍵情報を作成します。
#apt install wireguard // サーバ側の秘密鍵を作成 #wg genkey | tee /etc/wireguard/server.key // サーバ側の公開鍵を作成 #cat /etc/wireguard/server.key | wg pubkey | tee /etc/wireguard/server.pub // 接続するクライアント用の秘密鍵を作成 #wg genkey | sudo tee /etc/wireguard/client.key // クライアント用の公開鍵を作成 #cat /etc/wireguard/client.key | wg pubkey | tee /etc/wireguard/client.pub
設定情報の作成
続いて、先ほど作成した鍵情報をもとに、サーバ側の設定とクライアント側の設定を作成します。今回はクライアント側の設定もサーバ上で行っていますが、作成したファイルはあとで利用者に配布する前提です。
また、似たような情報を設定するのでわかりにくいですが、図5のような関係をあらかじめ理解しておくと、設定の意味がわかりやすくなります。[Interface]はその設定を使う端末の情報です。従って、サーバ側にはサーバの情報、クライアント側にはクライアントの情報を設定していきます。一方、[Peer]には、接続する相手先の情報を設定していきます。
サーバ側にはリスト6のような内容で/etc/wireguard/wg0.confというファイルを作成します。「wg0」という名前は、仮想インターフェース名であり、慣例的にこの名前がよく利用されます。
[Interface] PrivateKey = (/etc/wireguard/server.keyの内容) Address = 10.0.0.1 // (1) ListenPort = 51820 // (2) PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] // (3) PublicKey = (/etc/wireguard/client.pubの内容) AllowedIPs = 10.0.0.2/32 // (4)
(1)のAddressは、VPNネットワーク内のクライアント側からみたサーバのIPで、wg0というインターフェースに付与するIPでもあります。(2)のListenPortは、VPNサーバの待ち受けポートで、クライアントからVPN接続をするためのポートになります。
また、PostUpとPostDownは、ここで詳しくは説明しませんが、後述するVPNネットワークの外部にアクセスするための設定になります。eth0はVPNサーバでのネットワークインターフェースの実名です。
eth0という名称が一般的ですが、実際に構築している環境によって異なる場合もありますので、その場合には置き換えて設定してください。
複数の接続クライアントを用意する場合には、同様にクライアント側の鍵情報と設定ファイルを作成し、その情報毎にサーバ側には(3)の[Peer]情報を追加します。
(4)のAllowedIPsは、指定したIP、もしくはネットワークをどの相手と通信するのかという指定になりますが、ここでは相手先の端末が1つのためにクライアント側に付与されるIPと同じ意味になります。
同様にクライアント側のためにはリスト7のような設定ファイルを作成します。
[Interface] PrivateKey = (/etc/wireguard/client.keyの内容) Address = 10.0.0.2 // (1) [Peer] PublicKey = (/etc/wireguard/server.pubの内容) AllowedIPs = 0.0.0.0/0 // (2) EndPoint = X.X.X.X:51820 (サーバ側への接続情報) // (3)
基本的にサーバ側と項目の意味は同じですが、(1)のAddressがVPNネットワーク上で付与されるクライアントのIPアドレスです。
そして、(2)のAllowedIPsでは「0.0.0.0/0」のように設定しています。これは、端末側の外部通信はすべてVPN経由でアクセスされることを意味しています。
これにより、接続先から見たIPがVPNサーバのIPとなります。そして(3)のEndPointが、クライアント側から接続するVPNサーバのIPアドレスとポート番号を指定します。
サーバの起動
設定ファイル(/etc/wireguard/wg0.conf)ができたら、続いてサービスとしてリスト8のように起動します。
#systemctl enable wg-quick@wg0 // (1) #systemctl start wg-quick@wg0 // (2)
(1)ではVPNサービスをシステムサービスとして登録し、(2)でサービスを起動します。
正常に動作すれば、リスト9のようにifconfigコマンドの結果、仮想インターフェースとして認識されます。また、wgコマンドを使うと、サーバの動作状況、接続状況がわかります。
#ifconfig : (省略) wg0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.0.0.1 P-t-P:10.0.0.1 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MTU:8921 Metric:1 : (省略) #wg interface: wg0 public key: q7EaleQ+tjL8GvkZw1Uh6SY5JixvDH2pnS1wzZbxuWo= private key: (hidden) listening port: 51820 peer: hAztGwsh5ycevbUNbts6PtpA/Ums4DR7iyXD2hruZWc= allowed ips: 10.0.0.2/32
クライアントからの接続
クライアント用のソフトウェアは各種OSに対応しているツールが提供されていますので、WireGuardのサイトからダウンロードもしくは、各アプリストアなどからインストールが可能です。
そして、[トンネルの管理 > ファイルからトンネルをインポート]で先ほど作成したクライアント側の設定ファイルをインポートすれば接続準備が完了です。
または、[設定が空のトンネルを追加]で、図6のように設定をしても問題ありません。
接続して実際に通信するとwgコマンドでリスト10のように状況が確認できるようになります。
#wg interface: wg0 : (省略) peer: hAztGwsh5ycevbUNbts6PtpA/Ums4DR7iyXD2hruZWc= endpoint: 122.249.95.79:49828 allowed ips: 10.0.0.2/32 latest handshake: 6 minutes, 42 seconds ago transfer: 219.96 KiB received, 502.80 KiB sent
VPN環境から別の環境にアクセスするための設定
ここまでの設定では、クライアント側からVPNネットワーク内のサービスにアクセスできても、当初の目的である外部サービスにアクセスできません。
そのためには、VPNサーバ上のポートフォワードの設定を行う必要があり、/etc/sysctl.confファイルのリスト11の記述を有効にします。
net.ipv4.ip_forward=1
また、設定を有効にするために以下のように実行してください。
#sysctl -p
また前述した/etc/wireguard/wg0.confでのPostUpとPostDownの設定も、この目的のために行っています。ここまで完了したら、クライアント側から再接続してください。
接続するクライアント端末が増える度に設定を追記する面倒はありますが、構築は非常に簡単です。
会社と開発用VPN環境のセキュリティ制限上の不整合
会社全体として社員にVPN環境を提供していて、開発用に別途VPN接続を許可しないケースもあります。そのような場合は、先ほど紹介したWireGuardを利用すると図7のような環境にすることで迂回したVPN環境も構築可能です。
また最近ではWireGuardのVPNサーバ機能だけではなく、クライアント機能をもった家庭用Wi-Fiルータなどの商品もあります。
これらの商品を使えば、手軽にそして安価にVPN環境の構築が可能です。特に、Wi-Fiルータ上のWireGuardのクライアント機能を使えば、各端末にWireGuardのクライアントソフトをインストールせずに使えるので、非常に便利になります。
ただし、このような応用は別途ネットワーク管理者がいる環境においては管理外のセキュリティの抜け穴ができてしまうことでもあるため、必ずネットワーク責任者と相談したうえで構築してください。
さいごに
前回と今回を通じて、実際に筆者が構築したリモート開発環境の実例について紹介してきました。
特にツールの応用例や構成の考え方のヒントを知ってもらう目的で説明したために、実際に読者の環境で作業するためには、具体的な手順としては不十分な点もあるかと思います。
しかし、できるだけ必要なキーワードは網羅するように説明しましたので、ネット上にあるその他の情報などで補足しながら、自分たちに適した環境構築をしていただければと思います。
実際には全く同じ環境を構築するということはないと思いますので、必要に応じて部分的に採用したり、またはカスタマイズする際にも必要なことになるはずです。そして、自分たちのチームが使いやすいリモート開発環境を勉強しながら構築していってもらえればと思います。