AWSにSoftEther VPNServerで簡単にVPN接続しよう
まえがき
おはようございます。加藤です。EC2への接続を制限したい場合は、セキュリティグループで送信元IPで規制するのが有名・簡単ですね。 しかし、流行りのDS-LiteやWiMAXなどのグローバルIPを共有するサービスを利用している場合はセキュアでないしグローバルIPが変更される都度セキュリティグループを変更する必要があります。これはやや面倒でオペミスも怖いです。 そこで、SoftEther VPNServerを使ってAWSにリモートアクセスでVPN接続します。接続方式はL2TP/IPSecを選択しました。
対象
- VPC・EC2について基礎レベルの理解があり構築が行える
- 公開鍵認証を使ったSSH接続ができる
環境・前提
アプリケーション | バージョン |
---|---|
MacOS | 10.13.3(17D47) |
SoftEther | v4.24-9651-beta |
- パブリックからアクセスできるVPC・サブネットが存在する
EC2構築
早速、EC2を作成しましょう。パラメータは以下のように設定しました。 IPv6からのアクセスを許可していないのはSoftEtherがL2TP/IPSecでIPv6をサポートしていない為です。 グローバルIPは以下のコマンドなどで確認してください。一時的に使用するのものなので構築中に変化しなければOKです。 ElasticIPの割り当てを忘れないようにしてください!!
curl ifconfig.me
基本
項目 | 値 |
---|---|
AMI | Amazon Linux 2 LTS Candidate AMI 2017.12.0.20180115 x86_64 HVM GP2 |
AMI-ID | amzn2-ami-hvm-2017.12.0.20180115-x86_64-gp2 (ami-c2680fa4) |
インスタンスタイプ | t2.micro |
ストレージ | SSD(GP2) 8GB |
ElasticIP | 1つ |
セキュリティグループ
タイプ | プロトコル | ポート範囲 | ソース | 説明 |
---|---|---|---|---|
SSH | TCP | 22 | [グローバルIP]/0 | 一時的に利用 |
カスタムUDPルール | UDP | 500 | 0.0.0.0/0 | - |
カスタムUDPルール | UDP | 4500 | 0.0.0.0/0 | - |
SoftEther構築
ローカル
- EC2作成時に指定した鍵を使用してSSH接続
- 接続先はコンソールからパブリックDNS(IPv4)を確認
ssh -l ec2-user -i ~/.ssh/id_rsa ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com
サーバ
- タイムゾーン修正
- パッケージ最新化
- 必要なパッケージをインストール
sudo timedatectl set-timezone Asia/Tokyo sudo yum -y update sudo yum -y install git gcc
- ソースをダウンロード
- 解凍
- ビルド
cd ~/ curl -L -O https://github.com/SoftEtherVPN/SoftEtherVPN/releases/download/v4.24-9651-beta/softether-vpnserver-v4.24-9651-beta-2017.10.23-linux-x64-64bit.tar.gz tar zxvf softether-vpnserver-v4.24-9651-beta-2017.10.23-linux-x64-64bit.tar.gz cd vpnserver yes 1 | make cd ..
yes
コマンドはひたすらyesという入力を繰り返すコマンドです。今回の様にyes 1
と入力するとひたすら1を入力します。 ビルド時の対話にすべて1で回答したかった為、このように使用しました。
- 設置場所を移動
- systemd用の起動ファイルを作成
- パーミッション変更
- 起動ファイルを読み込み
- SoftEtherを起動
- SoftEtherの自動起動を設定
sudo mv vpnserver /opt/vpnserver sudo vi /etc/systemd/system/vpnserver.service sudo chmod 755 /etc/systemd/system/vpnserver.service sudo systemctl daemon-reload sudo systemctl start vpnserver sudo systemctl enable vpnserver
/etc/systemd/system/vpnserver.service
[Unit] Description=Softether VPN Server Service After=network.target [Service] Type=forking User=root ExecStart=/opt/vpnserver/vpnserver start ExecStop=/opt/vpnserver/vpnserver stop Restart=on-abort WorkingDirectory=/opt/vpnserver/ ExecStartPre=/sbin/ip link set dev eth0 promisc on [Install] WantedBy=multi-user.target
これでSoftEtherの構築は完了です! 接続するために設定をしていきましょう。
SoftEther設定
GUIの管理ツールがありますが、今回はCLIで設定していきます。
- SoftEther VPNServerの管理ツールを起動
sudo /opt/vpnserver/vpncmd
下記が管理ツールの画面です。これからServerの設定を行うので、1
を入力してEnter
を押下してください。
vpncmd コマンド - SoftEther VPN コマンドライン管理ユーティリティ SoftEther VPN コマンドライン管理ユーティリティ (vpncmd コマンド) Version 4.24 Build 9651 (Japanese) Compiled 2017/10/23 01:52:32 by yagi at pc33 Copyright (c) SoftEther VPN Project. All Rights Reserved. vpncmd プログラムを使って以下のことができます。 1. VPN Server または VPN Bridge の管理 2. VPN Client の管理 3. VPN Tools コマンドの使用 (証明書作成や通信速度測定) 1 - 3 を選択:
サーバは自分自身で、まだ仮想HUBを作成していません。2つとも空のままでEnter
を押下してください。
VPN Server>
とコンソールが表示されていれば問題なく進行できています。
接続先の VPN Server または VPN Bridge が動作しているコンピュータの IP アドレスまたはホスト名を指定してください。 'ホスト名:ポート番号' の形式で指定すると、ポート番号も指定できます。 (ポート番号を指定しない場合は 443 が使用されます。) 何も入力せずに Enter を押すと、localhost (このコンピュータ) のポート 443 に接続します。 接続先のホスト名または IP アドレス: サーバーに仮想 HUB 管理モードで接続する場合は、仮想 HUB 名を入力してください。 サーバー管理モードで接続する場合は、何も入力せずに Enter を押してください。 接続先の仮想 HUB 名を入力: VPN Server "localhost" (ポート 443) に接続しました。 VPN Server 全体の管理権限があります。 VPN Server>
ここからは、SoftEtherのコンソール上で作業します。視認性向上の為に大文字小文字を使用していますが、全て小文字でも問題なく入力できます。
- 仮想HUB作成
- 仮想HUB(main)に切り替え
- ユーザ作成
- ユーザパスワード設定
HubCreate main # パスワード入力を求められるので入力してください。 HUB main UserCreate kato.ryo /Group:none /REALNAME:kato.ryo /NOTE:none # グループ、本名、説明の入力は任意です。設定しない場合は[none]と入力してください。 UserPasswordSet kato.ryo # パスワード入力を求められるので入力してください。
- IPSec有効化
- セキュアNAT機能有効化
- ルーティングの設定
- コンソール終了
ルーティングの設定ではDHCPで以下のルーティングを流しています 10.0.0.0/16へのアクセスをVPN経由にする VPCのネットワーク帯域に応じて変更してください
IPsecEnable /L2TP:yes /L2TPRAW:no /ETHERIP:no /DEFAULTHUB:main # 事前共有キーの入力を求められるので入力してください。 SecureNatEnable Dhcpset /Start:192.168.30.10 /End:192.168.30.200 /Mask:255.255.255.0 /Expire:7200 /GW:192.168.30.1 /DNS:192.168.30.1 /DNS2:none /Domain:none /Log:yes /PushRoute:"10.0.0.0/255.255.0.0/192.168.30.1" exit
後で動作確認に使うので、ホスト名を確認しておきましょう。
- ホスト名確認
hostname
クライアント設定(MacOSの場合)
- システム環境設定からネットワークを開く
- インターフェイスの追加をクリック
- インターフェイス・VPNタイプを選択し、任意のサービス名を入力
- サーバアドレス・アカウント名を入力
- 認証設定を押下
- パスワード・共有シークレットを入力
- 接続を押下
アカウント名は ユーザ名@仮想HUB名 形式
動作確認
- VPNサーバにPingを打つ
- VPNサーバにSSHアクセスする
ping [SoftEtherのホスト名] ssh -l ec2-user -i ~/.ssh/id_rsa [SoftEtherのホスト名]
あとがき
みなさま無事にVPN接続できましたでしょうか?検証は行っていませんがAndroid・iOSでも接続できるはずです。 今回はEC2で構築しましたが、ECSで構築してELBを挟んで冗長化できたら、もっとおもしろそうですね!(技術的に可能か未確認です...) ツッコミどころありましたら是非コメントをお願いします!!