はじめに
これのAWS版でやってみたかったからやりました。
最後にパブリックアクセスがないプライベートなAmazon RDSにVPN経由でさくらのクラウド側から接続します
注意
さくらのクラウド VPNルータとAWSのSite-to-Site VPNは相性が悪いのでしょうか。
私の知識(+ChatGPT5.2先生)ではこれが限界です。
詳しくは最後の補足を読んでいただけたら幸いです。
構成図
- AWS側
- VPC
10.0.0.0/23 - サブネット
10.0.0.0/2410.0.1.0/24
- VPC
- さくらのクラウド側
- VPC
192.168.0.0/23 - サブネット
192.168.0.0/24192.168.1.0/24
- VPC
構築
AWS側の下準備
VPC、サブネット、インターネットゲートウェイのデプロイをいつも通りします。ここでは省略します

さくらのクラウド側の下準備
VPNルータ(スタンダード、インターネット有)、スイッチ(ルータなし)、デプロイします。ここでは省略します

AWS側の設定
カスタマーゲートウェイ作成
他の設定はそのままでOK
仮想プライベートゲートウェイ(VGW)作成
作成できたらVPCにアタッチしておきましょう。
ルートテーブル設定
さくらのクラウドに転送する宛先IPアドレスはVGWにホップするように設定を入れます
ルート伝搬が有効になっていれば後で設定する静的ルートが降ってきます

Site-to-Site VPNを作成
| 名前 | 任意の名前 |
| ターゲットゲートウェイのタイプ | 仮想プライベートゲートウェイ |
| 仮想プライベートゲートウェイ | 先の手順で作成したもの |
| カスタマーゲートウェイ | 先の手順で作成したもの |
| ルーティングオプション | 静的 |
| 静的 IP プレフィックス | さくら側のサブネット(複数可) |
| 事前共有キーストレージ | スタンダード |
| ローカル IPv4 ネットワーク CIDR | 0.0.0.0 |
| リモート IPv4 ネットワーク CIDR | 0.0.0.0 |
トンネル 1 オプション - オプション
| トンネル 1 の内部 IPv4 CIDR | Amazonによる生成 |
| トンネル 1 の事前共有キー | 自分で決めても良い ※1 |
| トンネル 1 の詳細オプション | トンネル 1 オプションを編集する |
| フェーズ 1 暗号化アルゴリズム | AES128 |
| フェーズ 2 暗号化アルゴリズム | AES128 |
| フェーズ 1 整合性アルゴリズム | SHA1 |
| フェーズ 2 整合性アルゴリズム | SHA1 |
| フェーズ 1 DH グループ番号 | 2 |
| フェーズ 2 DH グループ番号 | 2 |
| IKE バージョン | ikev1 |
| フェーズ 1 の有効期間 (秒) | 28800 |
| フェーズ 2 の有効期間 (秒) | 1800 |
| リキーマージン時間 (秒) | 270 |
| リキーファズ (パーセント) | 100 |
| リキーウィンドウサイズ (パケット) | 1024 |
| DPD タイムアウト (秒) | 30 |
| DPD タイムアウトアクション | クリア |
| スタートアップアクション | 追加 |
※1 AWS側で自動生成された事前共有キーに記号が含まれていた場合、さくらのクラウド VPNルータに適合しない可能性があります

トンネル 2 オプション - オプション
どうせ使わないので無視
さくらのクラウド側の設定
VPNルータの設定を入れる
| 対向IPアドレス | 先程作成したSite-to-Site VPNのTunnel1に書いている外部IPアドレス |
| 対向ID | 先程作成したSite-to-Site VPNのTunnel1に書いている外部IPアドレス |
| Pre Shared Secret | トンネル 1 の事前共有キー |
| 対向Prefix | AWSのVPCに設定したCIDR |
| ローカルPrefix | さくらのクラウド側のCIDR |
保存して反映ボタンをクリックし、VPNルータの電源を投入します
適当に更新してやればそのうちトンネルがUPになるはずです(遅い)

確認
それぞれのサブネットに仮想マシンを建ててPINGやiperf3を実行します
EC2インスタンスのネットワーク情報
ubuntu@ip-10-0-0-88:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
link/ether 06:d9:46:80:57:1b brd ff:ff:ff:ff:ff:ff
altname enp0s5
inet 10.0.0.88/24 metric 100 brd 10.0.0.255 scope global dynamic ens5
valid_lft 3383sec preferred_lft 3383sec
inet6 fe80::4d9:46ff:fe80:571b/64 scope link
valid_lft forever preferred_lft forever
ubuntu@ip-10-0-0-88:~$
ubuntu@ip-10-0-0-88:~$ curl https://ipinfo.io/
{
"ip": "18.179.8.153",
"hostname": "ec2-18-179-8-153.ap-northeast-1.compute.amazonaws.com",
"city": "Tokyo",
"region": "Tokyo",
"country": "JP",
"loc": "35.6895,139.6917",
"org": "AS16509 Amazon.com, Inc.",
"postal": "101-8656",
"timezone": "Asia/Tokyo",
"readme": "https://ipinfo.io/missingauth"
}ubuntu@ip-10-0-0-88:~$
さくらのクラウド 仮想マシンのネットワーク情報
ubuntu@skic-aws-dx-skvm01:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 9c:a3:ba:33:46:5d brd ff:ff:ff:ff:ff:ff
altname enp0s3
altname ens3
inet 133.125.236.131/24 brd 133.125.236.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::9ea3:baff:fe33:465d/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 9c:a3:ba:33:b6:b1 brd ff:ff:ff:ff:ff:ff
altname enp0s4
altname ens4
inet 192.168.0.1/24 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::9ea3:baff:fe33:b6b1/64 scope link
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 9c:a3:ba:33:62:dd brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname ens5
ubuntu@skic-aws-dx-skvm01:~$ ip route
default via 133.125.236.1 dev eth0 proto static
10.0.0.0/23 via 192.168.0.254 dev eth1
133.125.236.0/24 dev eth0 proto kernel scope link src 133.125.236.131
192.168.0.0/24 dev eth1 proto kernel scope link src 192.168.0.1
ubuntu@skic-aws-dx-skvm01:~$
ubuntu@skic-aws-dx-skvm01:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 9c:a3:ba:33:46:5d brd ff:ff:ff:ff:ff:ff
altname enp0s3
altname ens3
inet 133.125.236.131/24 brd 133.125.236.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::9ea3:baff:fe33:465d/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 9c:a3:ba:33:b6:b1 brd ff:ff:ff:ff:ff:ff
altname enp0s4
altname ens4
inet 192.168.0.1/24 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::9ea3:baff:fe33:b6b1/64 scope link
valid_lft forever preferred_lft forever
4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 9c:a3:ba:33:62:dd brd ff:ff:ff:ff:ff:ff
altname enp0s5
altname ens5
ubuntu@skic-aws-dx-skvm01:~$
ubuntu@skic-aws-dx-skvm01:~$ ip route
default via 133.125.236.1 dev eth0 proto static
10.0.0.0/23 via 192.168.0.254 dev eth1
133.125.236.0/24 dev eth0 proto kernel scope link src 133.125.236.131
192.168.0.0/24 dev eth1 proto kernel scope link src 192.168.0.1
ubuntu@skic-aws-dx-skvm01:~$
ubuntu@skic-aws-dx-skvm01:~$ curl https://ipinfo.io/
{
"ip": "133.125.236.131",
"city": "Tokyo",
"region": "Tokyo",
"country": "JP",
"loc": "35.6895,139.6917",
"org": "AS7684 SAKURA Internet Inc.",
"postal": "101-8656",
"timezone": "Asia/Tokyo",
"readme": "https://ipinfo.io/missingauth"
}ubuntu@skic-aws-dx-skvm01:~$
さくら -> AWS
EC2のセキュリティグループにさくら側のサブネットを追加しておきます

PING
※スクショ取り忘れてました!すいません!
pingとtcpdumpには成功していました!
iperf3で帯域測定

VPNルータが接続している共有セグメントの帯域である100Mbps近く出ています。いい感じです
AWS -> さくら
PING
さくら側のもう一つのサブネットである192.168.1.0/24にもPINGしておきます。
仮想マシンやスイッチは高額なので、裏技を使用してVPNルータにIPアドレスをセットしておきました


OK!
iperf3で帯域想定
Q. さくら側からプライベートなAmazon RDSは呼び出せるのか?
作成したデータベース

PINGテストした仮想マシンがあるAZとは違うAZに無料枠のAmazon RDS for MySQLを建てました。
エンドポイントskic-aws-dx-awsrds.cje4y84uyoas.ap-northeast-1.rds.amazonaws.comはAWSの外にあるフルリゾルバでも解決できるのでこのまま使用します。
ubuntu@skic-aws-dx-skvm01:~$ nslookup skic-aws-dx-awsrds.cje4y84uyoas.ap-northeast-1.rds.amazonaws.com 133.242.0.3
Server: 133.242.0.3
Address: 133.242.0.3#53
Non-authoritative answer:
Name: skic-aws-dx-awsrds.cje4y84uyoas.ap-northeast-1.rds.amazonaws.com
Address: 10.0.1.136
ubuntu@skic-aws-dx-skvm01:~$
接続
ubuntu@skic-aws-dx-skvm01:~$ mysql -h skic-aws-dx-awsrds.cje4y84uyoas.ap-northeast-1.rds.amazonaws.com -P 3306 -u admin -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 29
Server version: 8.0.43 Source distribution
Copyright (c) 2000, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.03 sec)
mysql>
やったぜ
補足
AWS Site-to-Site VPNでは2本のトンネルを確立することが推奨されますが、さくらのクラウド VPNルータは異なるトンネルで同じ対向Prefixを設定できません。

構築初期はAWSのVPC10.0.0.0/16宛の通信に対して次のような設定をしてトンネルを2本確立していました
- Tunnel1で10.0.0.0/24 <-> 192.168.100.0/24、192.168.110.0/24、192.168.120.0/24
- Tunnel2で10.0.1.0/24 <-> 192.168.100.0/24、192.168.110.0/24、192.168.120.0/24
この構成で両方のトンネルが確立できますが、通信がめちゃくちゃになってしまいます。
下のスクショはEC2からVPNを経由してVPNルータのインタフェースに設定したIPアドレスへの接続性をdeadman( https://github.com/upa/deadman )で監視している様子です。

EC2からVPNルータのインターフェスへの接続性を監視していますが、通信に波が発生していますね。
これでは使い物になりません。
結局ChatGPT5.2先生と相談して次のような構成にすることにしました
- さくら側のVPNルータで設定するプレフィックスは1対1にすること
- 単一のトンネルにすること
この構成だと安定して通信できます
まとめ
意外となんとかなりました。たいへんだった。
AWS接続オプションを使いましょう
参考資料
使用させていただきました(神)










