目次
全般
今回はハンズオンではありません(;^ω^)VPN構築で詰まった方のお役に立てればと思い、記事にしました。私は詰まりに詰まって泣きそうでした(;^ω^)困っていない方もどうぞ見ていってください。
手順
- EC2で証明書を発行
- ACMに証明書をアップロード
- ovpnファイルの編集
- OpenVPNソフトを使用してクライアントVPNエンドポイントを経由してインターネット接続
VPC作成
- リージョンを確認。
- 作成するリソース「VPCなど」
- 自動生成 チェック付ける「vpn-test(任意)」
- IPv4 CIDR ブロック「10.255.0.0/22」
- アベイラビリティゾーン (AZ) の数「1」
- パブリックサブネットの数「1」
- ap-northeast-1a のパブリックサブネット CIDR ブロック
「10.255.0.0/23」
- ap-northeast-1a のパブリックサブネット CIDR ブロック
- プライベートサブネットの数「1」
- ap-northeast-1a のプライベートサブネット CIDR ブロック
「10.255.2.0/23」
- ap-northeast-1a のプライベートサブネット CIDR ブロック
- ap-northeast-1a のパブリックサブネット CIDR ブロック「1」
- NAT ゲートウェイ「1」
あとはデフォルトで大丈夫です。
セキュリティグループ作成
- クライアントVPNエンドポイント用
- セキュリティグループ名「test-vpn(任意)」
- 説明「test-vpn(任意)」
- VPC「vpn-test-vpc」
- インバウンドルール「なし」
- アウトバウンドルール「すべてのトラフィック」
- 証明書発行EC2用
- セキュリティグループ名「test-vpn-ec2(任意)」
- 説明「test-vpn-ec2(任意)」
- VPC「vpn-test-vpc」
- インバウンドルール「SSH(※適時プレフィックスリストを指定しましょう。)」
- アウトバウンドルール「すべてのトラフィック」
ルートテーブル設定
Natへのルート
- 名前 「test-vpn-private-rt」
- 送信先「10.255.0.0/22」
- ターゲット「local」
- 送信先「0.0.0.0/0」
- ターゲット「作成したNatゲートウェイ」
- サブネットの関連付けを編集「作成したプライベートサブネット」
igw(インターネット)へのルート
- 名前 「test-vpn-public-rt」
- 送信先「10.255.0.0/22」
- ターゲット「local」
- 送信先「0.0.0.0/0」
- ターゲット「作成したインターネットゲートウェイ」
- サブネットの関連付けを編集「作成したパブリックサブネット」
EC2作成
特にディスクのサイズ指定などはないものとして作成しちゃいましょう。
参考:
- 名前「test-vpn-ec2」
- Amazon マシンイメージ (AMI)「Amazon Linux 2 AMI (HVM) - Kernel 5.10, SSD Volume Type」
- インスタンスタイプ「t2.micro」
- キーペア (ログイン) 「(任意のキーペアを使用)」
- ネットワーク設定
- VPC「vpn-test-vpc」
- サブネット「パブリックサブネットを選択」
- パブリック IP の自動割り当て「無効化」
- ファイアウォール (セキュリティグループ)「test-vpn-ec2」
- ストレージを設定「8GiB gp2」
以降はデフォルトで大丈夫です。
Elastic IPの作成、関連付け
- ネットワークボーダーグループ「ap-northeast-1」
- パブリック IPv4 アドレスプール「Amazon の IPv4 アドレスプール」
関連付け - リソースタイプ「インスタンス」
- test-vpn-ec2
- プライベート IP アドレス「プルダウンから選択」
IAMポリシーの作成、アタッチ
ポリシー
JSONを選択
次を貼り付け(IDは任意)
インポートのみ許可します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "acm:ImportCertificate",
"Resource": "arn:aws:acm:ap-northeast-1:xxxxxxxxxxxx:certificate/*"
}
]
}
- ポリシー名「test-vpn-ec2-acm」
ロールの作成
- 信頼されたエンティティタイプ「AWSのサービス」
- ユースケース「EC2」
- 検索窓から「test-vpn-ec2-acm」を検索
- ロール名「test-vpn-ec2-acm(任意)」
EC2の画面へ移動します。
アクションボタンから、セキュリティ、「IAMロールを変更」をクリックします。
- IAMロールを選択「test-vpn-ec2-acm」
証明書発行及びACMへのアップロード
今回は直接SSMで接続して作業しちゃいます。
接続をクリックします。
スクロールして、「接続」をクリックします。
サーバ証明書を「server-test.jp」
クライアント証明書はアップロードしませんが「client-test」として進めます。
CloudShellを使用する場合や、Cloud9を使用する場合によってコマンドが多少増減します。今回はEC2を使用します。
AWS公式サイト
gitをインストールします。
sudo yum install git
gitクローンを行います。
git clone https://github.com/OpenVPN/easy-rsa.git
クローンで作成されたディレクトリがあるか確認します。
cd easy-rsa/easyrsa3
Easy-RSAのinit-pkiコマンドによる初期化によって公開鍵インフラ(PKI)のセットアップのためのディレクトリとファイル構造を作成します。
つまり、公開鍵を使う前の構成のみ作成する。
./easyrsa init-pki
認証局をセットアップするため、CAの秘密鍵(ca.key)と自己署名された証明書(ca.crt)がpkiディレクトリ内に生成されるコマンド。
途中でパスを求められるが、そのままEnterを押下し、未設定で進める。
./easyrsa build-ca nopass
ここは注意が必要です。
サーバー証明書を作成します。次のコマンドを実行すると、「追加の名前の数」なしのドメイン名でインポートすることが可能です。
./easyrsa build-server-full server-test.jp nopass
ここで発行を継続するか確認されるので「yes」で進めます。
もし「追加の名前の数」つまり、複数のドメインに証明書を有効(SAN(Subject Alternative Name))にしたい場合次のコマンドを参考に編集してみましょう。
./easyrsa --san=DNS:server123.com build-server-full example.jp nopass
クライアント証明書を作成します。
./easyrsa build-client-full client-test nopass
証明書や鍵をわかりやすいディレクトリにコピーさせます。
このまま/easyrsa3ディレクトリで次のコマンドを実行します。
mkdir ~/custom_folder/
cp pki/ca.crt ~/custom_folder/
cp pki/issued/server-test.jp.crt ~/custom_folder/
cp pki/private/server-test.jp.key ~/custom_folder/
cp pki/issued/client-test.crt ~/custom_folder
cp pki/private/client-test.key ~/custom_folder/
cd ~/custom_folder/
次に、ACMにサーバー証明書のみ、インポートします。
aws acm import-certificate --certificate fileb://server-test.jp.crt --private-key fileb://server-test.jp.key --certificate-chain fileb://ca.crt --region ap-northeast-1
ACMの画面にて、インポートされたことを確認します。
確認後、ローカルにクライアントのcrtファイルとkeyファイルを移動させます。
今回はTeraTermを使用します。
ファイルから、SSH SCPを選択します。
次のファイルパスを参考に入力し、ダウンロードファイルにダウンロードします。
入力ができたら、受信をクリックし、ダウンロードフォルダを確認します。
ファイルのパス
/home/ec2-user/custom_folder/client-test.crt
/home/ec2-user/custom_folder/client-test.key
クライアントVPNエンドポイント作成
- 名前タグ - オプション「test-client-vpn」
- 説明 - オプション「test-client-vpn」
- クライアント IPv4 CIDR「10.255.252.0/22」
自身のPCのIPアドレス、VPCのIPアドレスとの重複を回避します。 - サーバー証明書 ARN「server-test.jp」
- 認証オプション「相互認証を使用」をチェック
- クライアント証明書 ARN「server-test.jp(サーバー証明書)」
※蛇足
証明書を更新する場合、ここでサーバー証明書を指定するため、更新が上手くできない場合があります。その場合はここの設定を確認して、必要に応じてクライアントVPNエンドポイントを再作成しましょう。
ところどころ割愛していますが、お好みで設定しても良い箇所と思います。
-
その他のパラメータ - オプション DNS サーバー 1 IP アドレス 「(必要に応じて設定しましょう)」
※蛇足2
名前解決されず、接続できない場合は、AWSが提供するDNSサーバーを使用します。
VPCサイダー範囲の末尾を「2」にすることで利用可能です。
例:VPC 10.0.0.0/16 ⇒ 10.0.0.2
例2:VPC 192.168.0.0/16 ⇒ 192.168.0.2
今回の場合:10.255.0.2 -
ネットワークの関連付け「vpn-test-vpc」
-
関連付けるサブネットを選択「作成したプライベートサブネット」
-
承認ルール
- アクセスを有効にする送信先ネットワーク「0.0.0.0/0」
- アクセス権を以下に付与する:「アクセス権をすべてのユーザーに許可する」
-
ルートテーブル ルート送信先「0.0.0.0/0」
- ターゲットネットワーク関連付けのサブネット ID「プライベートのサブネットID」
-
クライアント設定をダウンロードをクリック
OpenVPN接続
OpenVPNのダウンロードは割愛します。
OpenVPNサイト
ovpnファイル作成方法
テキストエディタを使用して、ovpnファイルを編集していきます。
クライアントcrtファイル
<cert>
-----BEGIN CERTIFICATE-----
省略
-----END CERTIFICATE-----
</cert>
クライアントkeyファイル
<key>
-----BEGIN PRIVATE KEY-----
省略
-----END PRIVATE KEY-----
</key>
接続確認
クライアントVPNエンドポイント画面にてスクロールすると接続タブがあるので、選択するとステータスが「Active」か確認します。また、そのままブラウザで「https://www.denet.co.jp/
」と検索し(^^)、インターネットに接続されていることを確認できれば問題なく接続できています。
お疲れ様でした。
では!
1つずつ誠実に取り組み、技術を身に着けて発信も併せて行っていきます!