AWSにSoftEther VPNServerで簡単にVPN接続しよう
まえがき
おはようございます。加藤です。EC2への接続を制限したい場合は、セキュリティグループで送信元IPで規制するのが有名・簡単ですね。
しかし、流行りのDS-LiteやWiMAXなどのグローバルIPを共有するサービスを利用している場合はセキュアでないしグローバルIPが変更される都度セキュリティグループを変更する必要があります。これはやや面倒でオペミスも怖いです。
そこで、SoftEhter VPNServerを使ってAWSにリモートアクセスでVPN接続します。接続方式はL2TP/IPSecを選択しました。
対象
- VPC・EC2について基礎レベルの理解があり構築が行える
- 公開鍵認証を使ったSSH接続ができる
環境・前提
| アプリケーション | バージョン |
|---|---|
| MacOS | 10.13.3(17D47) |
| SoftEhter | v4.24-9651-beta |
- パブリックからアクセスできるVPC・サブネットが存在する
EC2構築
早速、EC2を作成しましょう。パラメータは以下のように設定しました。
IPv6からのアクセスを許可していないのはSoftEtherがL2TP/IPSecでIPv6をサポートしていない為です。
グローバルIPは以下のコマンドなどで確認してください。一時的に使用するのものなので構築中に変化しなければOKです。
ElasticIPの割り当てを忘れないようにしてください!!
1 | 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)を確認
1 | ssh -l ec2-user -i ~/.ssh/id_rsa ec2-XXX-XXX-XXX-XXX.ap-northeast-1.compute.amazonaws.com |
サーバ
- タイムゾーン修正
- パッケージ最新化
- 必要なパッケージをインストール
1 2 3 | sudo timedatectl set-timezone Asia/Tokyosudo yum -y updatesudo yum -y install git gcc |
- ソースをダウンロード
- 解凍
- ビルド
1 2 3 4 5 6 | cd ~/tar zxvf softether-vpnserver-v4.24-9651-beta-2017.10.23-linux-x64-64bit.tar.gzcd vpnserveryes 1 | makecd .. |
yesコマンドはひたすらyesという入力を繰り返すコマンドです。今回の様にyes 1と入力するとひたすら1を入力します。 ビルド時の対話にすべて1で回答したかった為、このように使用しました。
- 設置場所を移動
- systemd用の起動ファイルを作成
- パーミッション変更
- 起動ファイルを読み込み
- SoftEtherを起動
- SoftEtherの自動起動を設定
1 2 3 4 5 6 | sudo mv vpnserver /opt/vpnserversudo vi /etc/systemd/system/vpnserver.servicesudo chmod 755 /etc/systemd/system/vpnserver.servicesudo systemctl daemon-reloadsudo systemctl start vpnserversudo systemctl enable vpnserver |
/etc/systemd/system/vpnserver.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [Unit]Description=Softether VPN Server ServiceAfter=network.target[Service]Type=forkingUser=rootExecStart=/opt/vpnserver/vpnserver startExecStop=/opt/vpnserver/vpnserver stopRestart=on-abortWorkingDirectory=/opt/vpnserver/ExecStartPre=/sbin/ip link set dev eth0 promisc on[Install]WantedBy=multi-user.target |
これでSoftEtherの構築は完了です! 接続するために設定をしていきましょう。
SoftEther設定
GUIの管理ツールがありますが、今回はCLIで設定していきます。
- SoftEhter VPNServerの管理ツールを起動
1 | sudo /opt/vpnserver/vpncmd |
下記が管理ツールの画面です。これからServerの設定を行うので、1を入力してEnterを押下してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 | vpncmd コマンド - SoftEther VPN コマンドライン管理ユーティリティSoftEther VPN コマンドライン管理ユーティリティ (vpncmd コマンド)Version 4.24 Build 9651 (Japanese)Compiled 2017/10/23 01:52:32 by yagi at pc33Copyright (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>とコンソールが表示されていれば問題なく進行できています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 接続先の 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)に切り替え
- ユーザ作成
- ユーザパスワード設定
1 2 3 4 5 6 7 | HubCreate main# パスワード入力を求められるので入力してください。HUB mainUserCreate kato.ryo /Group:none /REALNAME:kato.ryo /NOTE:none# グループ、本名、説明の入力は任意です。設定しない場合は[none]と入力してください。UserPasswordSet kato.ryo# パスワード入力を求められるので入力してください。 |
- IPSec有効化
- セキュアNAT機能有効化
- ルーティングの設定
- コンソール終了
ルーティングの設定ではDHCPで以下のルーティングを流しています
10.0.0.0/16へのアクセスをVPN経由にする
VPCのネットワーク帯域に応じて変更してください
1 2 3 4 5 | IPsecEnable /L2TP:yes /L2TPRAW:no /ETHERIP:no /DEFAULTHUB:main# 事前共有キーの入力を求められるので入力してください。SecureNatEnableDhcpset /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 |
後で動作確認に使うので、ホスト名を確認しておきましょう。
- ホスト名確認
1 | hostname |
クライアント設定(MacOSの場合)
- システム環境設定からネットワークを開く
- インターフェイスの追加をクリック
- インターフェイス・VPNタイプを選択し、任意のサービス名を入力
- サーバアドレス・アカウント名を入力
- 認証設定を押下
- パスワード・共有シークレットを入力
- 接続を押下
アカウント名は ユーザ名@仮想HUB名 形式
動作確認
- VPNサーバにPingを打つ
- VPNサーバにSSHアクセスする
1 2 | ping [SoftEtherのホスト名]ssh -l ec2-user -i ~/.ssh/id_rsa [SoftEtherのホスト名] |
あとがき
みなさま無事にVPN接続できましたでしょうか?検証は行っていませんがAndroid・iOSでも接続できるはずです。
今回はEC2で構築しましたが、ECSで構築してELBを挟んで冗長化できたら、もっとおもしろそうですね!(技術的に可能か未確認です...)
ツッコミどころありましたら是非コメントをお願いします!!