SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

リモートワークでの開発環境を改善しよう

VPNの課題を解決し、リモート開発環境をさらに便利にしよう

リモートワークでの開発環境を改善しよう 第2回

  • X ポスト
  • このエントリーをはてなブックマークに追加

実は簡単な、クラウド上でのVPNサーバの構築

 VPNサーバを自前で立ち上げるというと、かなりハードルがあがってしまうと感じる方もいると思います。筆者もOpenVPNなどの環境構築をしたことがありますが、構築に非常に苦労した経験があります。しかし、WireGuardというオープンソースVPNなら容易に環境を構築可能です。

 実際にどの程度簡単なのかを紹介する目的も含め、構築手順を紹介します。

VPNサーバのインストール

 Ubuntu上にWireGuardをインストールしていきます。

 インストールはリスト5のようにし、必要な鍵情報を作成します。

[リスト5]WireGuardのインストール手順例
#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]には、接続する相手先の情報を設定していきます。

図5:サーバとクライアントでの設定の関係
図5:サーバとクライアントでの設定の関係

 サーバ側にはリスト6のような内容で/etc/wireguard/wg0.confというファイルを作成します。「wg0」という名前は、仮想インターフェース名であり、慣例的にこの名前がよく利用されます。

[リスト6]サーバ側設定ファイルの内容例(/etc/wireguard/wg0.conf)
[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のような設定ファイルを作成します。

[リスト7]WireGuardのクライアント側の設定ファイルの内容例
[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のように起動します。

[リスト8]WireGuardのサービスの起動例
#systemctl enable wg-quick@wg0 // (1)
#systemctl start wg-quick@wg0  // (2)

 (1)ではVPNサービスをシステムサービスとして登録し、(2)でサービスを起動します。

 正常に動作すれば、リスト9のようにifconfigコマンドの結果、仮想インターフェースとして認識されます。また、wgコマンドを使うと、サーバの動作状況、接続状況がわかります。

[リスト9]WireGuardサーバの正常動作の確認例
#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のように設定をしても問題ありません。

図6:クライアントソフトウェアでの設定例
図6:クライアントソフトウェアでの設定例

 接続して実際に通信するとwgコマンドでリスト10のように状況が確認できるようになります。

[リスト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の記述を有効にします。

[リスト11]Ubuntu上のポートフォワードの設定方法(/etc/sysctl.confの抜粋)
net.ipv4.ip_forward=1

 また、設定を有効にするために以下のように実行してください。

#sysctl -p

 また前述した/etc/wireguard/wg0.confでのPostUpとPostDownの設定も、この目的のために行っています。ここまで完了したら、クライアント側から再接続してください。

 接続するクライアント端末が増える度に設定を追記する面倒はありますが、構築は非常に簡単です。

会社と開発用VPN環境のセキュリティ制限上の不整合

 会社全体として社員にVPN環境を提供していて、開発用に別途VPN接続を許可しないケースもあります。そのような場合は、先ほど紹介したWireGuardを利用すると図7のような環境にすることで迂回したVPN環境も構築可能です。

図7:WireGuardを利用したVPN環境構築の応用例
図7:WireGuardを利用したVPN環境構築の応用例

 また最近ではWireGuardのVPNサーバ機能だけではなく、クライアント機能をもった家庭用Wi-Fiルータなどの商品もあります。

 これらの商品を使えば、手軽にそして安価にVPN環境の構築が可能です。特に、Wi-Fiルータ上のWireGuardのクライアント機能を使えば、各端末にWireGuardのクライアントソフトをインストールせずに使えるので、非常に便利になります。

 ただし、このような応用は別途ネットワーク管理者がいる環境においては管理外のセキュリティの抜け穴ができてしまうことでもあるため、必ずネットワーク責任者と相談したうえで構築してください。

さいごに

 前回と今回を通じて、実際に筆者が構築したリモート開発環境の実例について紹介してきました。

 特にツールの応用例や構成の考え方のヒントを知ってもらう目的で説明したために、実際に読者の環境で作業するためには、具体的な手順としては不十分な点もあるかと思います。

 しかし、できるだけ必要なキーワードは網羅するように説明しましたので、ネット上にあるその他の情報などで補足しながら、自分たちに適した環境構築をしていただければと思います。

 実際には全く同じ環境を構築するということはないと思いますので、必要に応じて部分的に採用したり、またはカスタマイズする際にも必要なことになるはずです。そして、自分たちのチームが使いやすいリモート開発環境を勉強しながら構築していってもらえればと思います。

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
リモートワークでの開発環境を改善しよう連載記事一覧
この記事の著者

WINGSプロジェクト 小林 昌弘(コバヤシ マサヒロ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/17625 2023/05/24 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング