🛡️

EC2でVPNサーバを自作して安全にフリーWi-Fiを利用する!

2023/07/09に公開

本記事の目的

カフェやラウンジで開発を行なっているエンジニアの皆様、フリーWi-Fiをもっと安全に利用したいなーと思われたことはありませんか?フリーWi-Fi下では、localhostのポートを開けたり、http:のサイトを開くのはちょっぴり怖いですよね・・・。そんな時VPNを利用するという手がありますが、このVPNも信頼性の高いものを使おうとすると月1500円程度かかってしまいます。ならばいっそAWSの無料枠でEC2を立て、VPNサーバーを自作してしまおう!というのが今回の記事の試みです。
もちろん、他にもVPNを使うメリットはあります。下記のようなものが挙げられます。

  • 動的にWi-FiのIPが変わる状況でも、IPを固定して使える(インスタンスにセキュリティグループを設定する時などにIPを変更せずに済む)
  • スマホでフリーWi-Fiを使うときにSecureに使える
  • ネットワークやAWSの勉強になる

メリットだらけですね^^今回の記事ではEC2にssh接続しCLIでVPNを構築する方法を主に述べていきます。EC2インスタンスの立て方やCLIではないGUIツールの使い方、VPNそのものの詳細な仕組みは参考記事が他にも大量にあるためスコープ外とします。

今回構築するVPNの全体像

詳細な仕組みは省くのですが、メンタルモデルとしてざっくりと今回構築するVPNの全体像を下記に示します。

準備

用意するものは次の通りです。

  • AWSアカウント(VPC, EC2, Elastic IPを利用)
  • SoftEther(VPNサーバ設定用ソフトウェア)
  • 接続用PC

Elastic IPを利用する場合は少しだけ料金が発生してしまうため注意です!もちろんElastic IPを使わずに構築することも可能です。

EC2インスタンスを作成しssh接続

EC2は下記のコンポーネントを利用しました。

  • Amazon Linux AMI 2023
  • 64ビット(x86)
  • t2.micro

インバウンドのセキュリティグループは下記になります。

タイプ プロトコル ポート範囲 ソース
SSH TCP 22 [グローバルIP]/0
カスタムUDPルール UDP 500 0.0.0.0/0
カスタムUDPルール UDP 4500 0.0.0.0/0

以下各ルールの説明です。

  • SSH TCP 22 [グローバルIP]/0
    • AWSのインスタンスへのSSH (Secure Shell) 接続を許可しています。
  • カスタムUDPルール UDP 500 0.0.0.0/0:
    • Internet Key Exchange (IKE)プロトコルに関連するもので、UDPポート500を使用します。
    • IKEはVPN接続を確立する際の認証と鍵交換を行うために使用されます。
  • カスタムUDPルール UDP 4500 0.0.0.0/0:
    • NATトラバーサル(NAT-T)に関連するもので、UDPポート4500を使用します。
    • NAT-TはVPN接続がNAT(Network Address Translation)またはファイアウォールを通過することを可能にします。

EC2の構築などの手順は大量に参考記事があるためここでは省きます。例として下記の記事などを参考にしてみてください。

  1. 公式ドキュメント(こちらがおすすめです)
  2. 簡単な構築手順

Elastic IPを使う場合は下記も参考にして設定してみてください。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-eips.html

SoftEtherをダウンロードする

ここから先は作ったEC2インスタンスにssh接続して作業していきます。下記のプロジェクトからSoftEtherというVPNサーバーを構築するためのソフトウェアをインストールすることができます。かの有名な登大遊さんが作ったソフトウェアですね。個人でVPNを自作するならこれ、というものです。

プロジェクトサイト:
https://www.softether.org/

Github:
https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/

基本的にインストールの手順は上記プロジェクトに書いてあるため、上記を読んで概要を把握しておくことをお勧めします。シンプルに読み物としても面白いです!

ダウンロード可能パッケージ検索ページで、下記の写真のように入力します。

softether-image

ここで注意なのが、SoftEtherで用意されている検索ページの該当するパッケージと、ビルドできるパッケージが異なるということです。CPUをEC2インスタンスにssh接続してlscpuコマンドを打つと下記のCPUであることが確認できます。

出力
Architecture:            x86_64
  CPU op-mode(s):        32-bit, 64-bit
  (以下略)

SoftEtherで用意されている検索ページで該当するのはIntel x86(32bit)ということがわかります。しかしこれをダウンロードしてビルドすると下記のようなエラーが出てビルドすることができません・・・。

出力
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
/usr/bin/ld: cannot find -lm: No such file or directory
/usr/bin/ld: cannot find -lrt: No such file or directory
/usr/bin/ld: cannot find -lpthread: No such file or directory
/usr/bin/ld: cannot find -ldl: No such file or directory
/usr/bin/ld: cannot find /lib/libgcc_s.so.1: No such file or directory
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:30: main] Error 1
make[1]: Leaving directory '/home/ec2-user/vpnserver'

そのため、Intel x64/AMD64(64bit)を選択するようにします。

選択後、最新版のurlを右クリックでコピーし、EC2にssh接続後下記のコマンドでパッケージをダウンロードします

curl -O -L <ダウンロードurl>

ダウンロードが終わったら解凍を行い、ディレクトリを移動します

tar zxvf <ダウンロードしたパッケージ>
cd vpnserver

次にビルドに必要なパッケージをインストールし、makeコマンドでビルドします。

sudo yum -y groupinstall "Development Tools"
sudo yum -y install readline-devel ncurses-devel openssl-devel
make

ビルドすると、下記のようなメッセージを含む利用方法が出力されます。

出力
*** How to start the SoftEther VPN Server Service ***

Please execute './vpnserver start' to run the SoftEther VPN Server Background Service.
And please execute './vpncmd' to run the SoftEther VPN Command-Line Utility to configure SoftEther VPN Server.

Of course, you can use the VPN Server Manager GUI Application for Windows / Mac OS X on the other Windows / Mac OS X computers in order to configure the SoftEther VPN Server remotely.

SoftEtherを設定する

ここから先は、先程のメッセージに従ってコマンドを実行しSoftEtherの設定を行なっていきます。

sudo ./vpnserver start
sudo ./vpncmd

下記のような表示が出ます。1を入力してenterを押します。

出力
By using vpncmd program, the following can be achieved. 

1. Management of VPN Server or VPN Bridge 
2. Management of VPN Client
3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)

Select 1, 2 or 3: 1

下記のような表示がされ対話型の設定モードに移行します。GUIツールも用意されていますが、今回はCLIを使います。

出力
VPN Server>

コマンドを打ち込んでSoftEther VPNサーバーを設定していきます。コマンドに--helpオプションを付けるとコマンドの詳細な説明が出力されますので、コマンドを実行する前に説明を出力しそちらに従うようにしてください。余談ですが、helpコマンドを打つと全コマンドのリストが表示され概要を把握することができるため確認してみてください。(できるだけ一時情報に従うというのはエンジニアの基本ですね!)

  • ServerPasswordSetコマンドを使用してサーバーのパスワードを設定します。
  • HubCreateコマンドで仮想HUBを作成します。このコマンドではHUB名と管理パスワードを設定します。
  • UserCreateコマンドを使用して新規ユーザーを作成します。
  • IPsecEnableコマンドでL2TP over IPsecを有効にします。これにより、Macの内蔵VPNクライアントから接続できるようになります。設定は下記のように行なってください。
出力
IPsecEnable command - Enable or Disable IPsec VPN Server Function
Enable L2TP over IPsec Server Function (yes / no): yes

Enable Raw L2TP Server Function (yes / no): no

Enable EtherIP / L2TPv3 over IPsec Server Function (yes / no): no

Pre Shared Key for IPsec (Recommended: 9 letters at maximum): <任意の事前共有キー名>

Default Virtual HUB in a case of omitting the HUB on the Username: main
  • SecureNatEnableコマンドでネットワークアドレス変換とDHCPサーバー機能を有効にします。
    • ローカルブリッジという仕組みを使う方法もあるそうですが、EC2では利用できないらしいです。(→SoftEtherフォーラム)

VPNに繋ぐPCを設定する

VPNサーバーが設定できたらお使いのPCの設定を行なっていきます。今回はMacを利用しますがWindowsやiOS, Androidでも同様の内容の設定を行なってください。

Macのシステム環境設定からVPN接続を設定します。"ネットワーク"設定から"新規サービスの追加(+)"をクリックし、VPNの設定を行います。ここで設定するべき項目は以下の通りです:

  • インターフェース: VPN
  • VPNタイプ: L2TP over IPsec
  • サービス名: 任意の名前

次に"作成"をクリックします。その後、以下の設定を行います:

  • サーバーアドレス: AWSのVPNサーバーのパブリックIP
  • アカウント名: SoftEtherで設定したユーザー名

"認証設定"をクリックし、以下を設定します:

  • ユーザー認証: パスワード、SoftEtherで設定したユーザーのパスワード
  • 共有シークレット: SoftEtherで設定したIPsecの事前共有キー

右下の"詳細"をクリックし、オプションタブから「すべてのトラフィックをVPN接続経由で送信」にチェックを入れます。 これで接続がフルトンネリング方式になります。

以上でMacからVPN接続設定が可能となりました!!!試しに「接続」を押して繋いでみましょう。

上記のような緑色の表示になったら接続成功です!!!次に、PCからサイトへアクセスした際の接続元IPアドレスがEC2のグローバルIPと同じか確かめます。下記のurlに接続します。

https://www.cman.jp/network/support/go_access.cgi

表示されているIPアドレスがEC2のグローバルIPと同一になっていればVPN接続は成功です!

これでセキュアにフリーWi-Fiに接続できるようになりました!お疲れ様でした!!快適なフリーWi-Fiライフを送りましょう^^

Discussion