AWSとSite-to-Site VPN接続をする要件が結構あります。CiscoやFortigateなど実機を使う前に仮想環境を使ってconfigなどを確認しておきたいこともままあります。
そこで検証用としてさくらクラウドにルータOSであるVyattaを立て、VyattaとAWSをSite-to-Site VPN接続し、Vyattaの配下にいるUbuntuからAWSのプライベートサブネットにいるEC2へpingを飛ばして、SSHできるようになるまでを構築します。
構成図
構成としてはこのようになります。
大まかな流れ
AWS側は構築済みとします。今回はIGW、VGW、EC2(ubuntu)というミニマムな構成にしています。
さくらクラウドにVPCを立てるとVPCルータにグローバルIPアドレスが割り当てられるので、そのIPへ向けたCGW(カスタマーゲートウェイ)をAWSに作っておきます。
さくらクラウド側では以下のような流れになります。
・VPCルータを作る
・スイッチを2つ作る
・Vyattaを立てる
・VyattaをNATルータにする
・ubuntuを立て、Vyattaとスイッチを介して接続する
・VyattaからAWSへSite-to-Site接続をする
構築していく
さくらクラウドで構築していきます。画面は2023年12月時点のUIになります。
VPCを作る
さくらクラウドにもAWSと同じくVPCという概念があるのですが、AWSと違うのはさくらでは「VPCルータを作る」ことでVPCが自動的に構築されることです。
AWSだと「VPCという箱を作った後、IGW(Internet Gateway)を作ってインターネットと接続する」となりますが、これが逆になります。
左側のメニューから「アプライアンス」→「VPCルータ」と進みます。右上の「追加」を押して、新規にVPCルータを作成します。
プランは「スタンダード」にし、名前と説明を適当に入れて「作成」ボタンを押します。
直後は「コピー中」という有効状態になります。
しばらくすると「利用可能」となるので、これでVPCは作成完了です。
今回は「接続できればいい」という検証環境なので、VPCルータにファイアウォールはかけていません。デフォルトの何も入っていない状態は、「双方向ですべての通信が許可された」状態になります。
ちなみにスタンダードプランの場合はVPCルータは自動的にNATルータになります。内部から外部への通信はグローバルIPにIPマスカレードされて出ていきます。
次にVPCルータ内部にサーバなどを接続するためにスイッチを1つ作成します。
なお、作成したVPCの電源はまだ起動しません。起動してしまうと、この後作成するスイッチが作成できないからです(電源を落としてくださいと警告が出る)。
「インターフェース」を選択し、「プライベート1」の右側の鉛筆マークをクリックします。
スイッチの設定画面になります。
今回は新規に作るので「新規スイッチを作成」を選択し、プライベートIPアドレスを設定します。このIPがVPCルータのLAN側のIPになり、この後作るVyattaから見た時のデフォゲになります。
「更新前チェック」ボタンを押して、エラーがないか確認します。問題なければ「更新」ボタンを押します。
ステータスが成功するとスイッチが設置されるので
右上にある「反映」ボタンを押します。反映ボタンを押さないと設置した機器や変更した設定が反映されません。
もうひとつスイッチを作る
Vyattaとその下に作るUbuntuを接続するためのスイッチを作ります。
これもAWS的な感覚からすると混乱するのですが、AWSでは同じセグメントやゾーン内だとEC2などのインスタンスを設置するだけで(ルーティングが問題なければ)疎通できるのに対し、さくらの場合はインスタンスを作っただけでは疎通できません。
インスタンス同士を接続するスイッチなりルータが必要になります。
今回はVyattaをNATルータにし、Vyattaから見たLANセグメントにUbuntuを配置します。オンプレ(今回はさくら側)とAWSのそれぞれのプライベートセグメント同士が通信できるという環境を目指すためです。
「ネットワーク」→「スイッチ」を進むと先程VPC構築中に作ったスイッチが1つ見えています。ここで右上の「追加」ボタンを押します。
適当に名前をつけて「作成」ボタンを押します。
ステータスが「成功」になると、
もう1つスイッチが追加されました。
VPCの電源を入れる
配置すべきスイッチを作成したので、「アプライアンス」→「VPCルータ」と進んで、右上の「電源操作」プルダウンから「起動」を選択して、VPCの電源を入れます。
確認画面が出るので右上の「起動」を押すと
さらに念押しされて
しばらくするとVPCが起動します。グローバルIPが振られているので、この時点でインターネットからグローバルIP(今回は153.127.192.171)にpingを打つと返ってきます。
なお、この記事を書いている時点でVPCはすでに落としているので、今はpingは返りません。
VyOSを立てる
AWSのVPNルータになるVyOSを立てます。現時点で(無償版の)最新は1.5ですが、AWSにsite-to-site接続できなかったので、実績が豊富な1.3を使います。
さくらクラウドで用意されているサーバ/ネットワークOSのイメージにVyOSはないので自分で用意する必要があります。
公式サイトで無償版の「Rolling Release」へ進むと最新版(2023年12月時点で1.5)しかダウンロードできません。gitでも過去のバージョンは公開されていません。
「vyos 1.3 dockerから作る」などでググると解説ページがいくつか出てくるので、その通りにしてISOイメージを作りました。
ISOを作ったら、それをさくらクラウドへアップロードします。
「ストレージ」→「ISOイメージ」→「追加」と進みます。
サイズは一番小さい5GB(デフォルト)、名前はファイル名そのままを入力して「作成」を押します。
するとISOイメージのファイル空間が予約されます。この時アップロード情報が表示されるのでコピペしておきましょう。
有効状態が「アップロード」になり、アップロード待機状態になります。
PCにあるVyOSのISOをアップロードします。ボクはWSLを使って、先程表示されていたcurlコマンドにおいて「YOUR-FILENAME」のところだけVyOS IOSファイル名に変更して、アップロードします。
350MBぐらいのファイルサイズなのでアップロードはすぐに終わります。
アップロードが終わったら右上の「FTPを完了」ボタンを押します。
確認後
しばらくすると有効状態が「利用可能」になります。この状態になるとアップロードしたISOファイルが使えるようになります。
「サーバ」→「追加」と進み、サーバを作る画面に行きます。
リソースはデフォルトの最小構成のままにし、「ディスクソース」で「ブランク」を選択します。すると下の方に「IOSイメージを使う」という選択肢が出てくるので、プルダウンメニューを出します(ここ、わかりにくいですよね。さっきアップしたISOはどこで選択できるのだろうとあちこち迷いました)。
すると先程アップしたVyOSのISOイメージファイルが出てくるので選択します。
「スイッチに接続」を選択し、VPCルータを選択します。
あとは適当に名前や説明を入れて作成します。
しばらく待つと
完了し、
起動した状態になります。
作成時に「自動で電源を入れる」にチェックを入れたままのため電源が入ってしまっていました。この状態だとNICを追加できないので、一度電源を落とします。
確認が出るので「実行」します。
電源が落ちたら、「NIC」→「追加」と押します。
確認後
成功すると、
NICが追加されます。この状態だと「未接続」となり、どことも通信できません。
右側の▼プルダウンから「接続を編集」を選択します。
ここで、追加したNICをInternal_SW(VyattaとUbuntuを接続するスイッチ)に接続します。
成功すると、
eth0がVPCルータに、eth1がInternal_SWに接続された状態になります。
ここで改めてVyOSを起動します。
コンソール画面が用意されているのでログインします。ユーザー名:vyos、パスワード:vyosでログインできます。
ログインして、「show system image」コマンドを打つと、LiveCDで起動していることが分かります。
「install image」でSSDにOSをインストールします。
5-10分ぐらいでインストールが完了するので
rebootコマンドを打って、再起動します。
webブラウザのコンソール画面だとコピペがしづらいので基本的な設定だけをここで済ませた後はSSHで作業します。
入れるコマンドは以下の通り。WAN側、LAN側のIPアドレス、デフォゲ、SSHサーバ有効化、IPマスカレの設定を入れています(configureと打って設定モードにしてから下記を1行ずつコピペしていきます)。
set interfaces ethernet eth0 address 192.168.254.254/24 set interfaces ethernet eth1 address 172.0.0.254/24 set protocols static route 0.0.0.0/0 next-hop 192.168.254.1 set service ssh set nat source rule 10 outbound-interface eth0 set nat source rule 10 source address 172.0.0.0/24 set nat source rule 10 translation address masquerade
終わったら「commit」→「save」します。
IPとデフォゲを設定したので、この時点でインターネットにつながるはずです。8.8.8.8にpingを打つと返ってきます。
インターネットからVyOSにSSHできるようにするため、FWとNATの設定をします。
まずVPCルータのファイアウォールに行き
WAN側10022番→LAN側22番へTCPを許可します。
1つだけルールが追加されました。
次にNATの画面でグローバルの10022をVyOSのeth0のIPである192.168.254.254の22番へポートフォワードします。
1つだけ追加されました。
こうするとインターネットからVyOSへsshできるようになり、設定作業が圧倒的に楽になります。
Ubuntuを立てる
VyOSへインターネットからSSHできるところまで来たら、次は内部ネットワークにいる想定のUbuntuサーバを立てます。
「サーバ」→「追加」と進み、「アーカイブ」からデフォルトで用意されているUbuntu Server 22.04 LTSを選択します。なお、(cloudimg)「ではない方」を選びます。
接続するスイッチは「Internal_SW」です。
IPアドレスをプライベートセグメント側のIPにし、デフォゲをVyOSのeth1(LAN側)に設定します。「管理ユーザのパスワード」が、この後ubuntuにログインする時のパスワードになります。
しばらくするとインストールが終わり、
ubuntuが起動します。インターネットからは直接は見えないので、VyOSにSSHして、さらにUbuntuへSSHすることでインターネットからアクセスできます。
AWSとSite-to-Site VPN接続するconfigを入れる
さて、いよいよsite-to-siteのconfigを入れます。SSHでVyOSにログインし、configureコマンドを入れてから、configを入れます。
configはAWSの設定テンプレートでVyattaを選んでダウンロードし、それをカスタマイズします。デフォルトでは使えないので変更する必要があります。
変更するのはインターフェースの名前、local-address(CGWのIPではなく、VyOSのプライベートIPにする)、BGP広報部分は書式が違うので修整する、などです。
以下に今回接続に使ったconfigを張っておきます。
set vpn ipsec ike-group AWS lifetime '28800' set vpn ipsec ike-group AWS proposal 1 dh-group '2' set vpn ipsec ike-group AWS proposal 1 encryption 'aes128' set vpn ipsec ike-group AWS proposal 1 hash 'sha1' set vpn ipsec site-to-site peer 35.74.112.103 authentication mode 'pre-shared-secret' set vpn ipsec site-to-site peer 35.74.112.103 authentication pre-shared-secret '45F8.vMIdfx9pbpiXdGsDsV4mr8SQ3P7' set vpn ipsec site-to-site peer 35.74.112.103 description 'VPC tunnel 1' set vpn ipsec site-to-site peer 35.74.112.103 ike-group 'AWS' set vpn ipsec site-to-site peer 35.74.112.103 local-address '192.168.254.254' set vpn ipsec site-to-site peer 35.74.112.103 vti bind 'vti0' set vpn ipsec site-to-site peer 35.74.112.103 vti esp-group 'AWS' set vpn ipsec ipsec-interfaces interface 'eth0' set vpn ipsec esp-group AWS compression 'disable' set vpn ipsec esp-group AWS lifetime '3600' set vpn ipsec esp-group AWS mode 'tunnel' set vpn ipsec esp-group AWS pfs 'enable' set vpn ipsec esp-group AWS proposal 1 encryption 'aes128' set vpn ipsec esp-group AWS proposal 1 hash 'sha1' set vpn ipsec ike-group AWS dead-peer-detection action 'restart' set vpn ipsec ike-group AWS dead-peer-detection interval '15' set vpn ipsec ike-group AWS dead-peer-detection timeout '30' set interfaces vti vti0 address '169.254.171.90/30' set interfaces vti vti0 description 'VPC tunnel 1' set interfaces vti vti0 mtu '1436' set protocols bgp 65000 neighbor 169.254.171.89 remote-as '64512' set protocols bgp 65000 neighbor 169.254.171.89 address-family ipv4-unicast soft-reconfiguration 'inbound' set protocols bgp 65000 neighbor 169.254.171.89 timers holdtime '30' set protocols bgp 65000 neighbor 169.254.171.89 timers keepalive '10' set vpn ipsec ike-group AWS lifetime '28800' set vpn ipsec ike-group AWS proposal 1 dh-group '2' set vpn ipsec ike-group AWS proposal 1 encryption 'aes128' set vpn ipsec ike-group AWS proposal 1 hash 'sha1' set vpn ipsec site-to-site peer 54.64.232.49 authentication mode 'pre-shared-secret' set vpn ipsec site-to-site peer 54.64.232.49 authentication pre-shared-secret 'JL6.LVZLI510ZyYEYhGD0OXzJ5LTR_xL' set vpn ipsec site-to-site peer 54.64.232.49 description 'VPC tunnel 2' set vpn ipsec site-to-site peer 54.64.232.49 ike-group 'AWS' set vpn ipsec site-to-site peer 54.64.232.49 local-address '192.168.254.254' set vpn ipsec site-to-site peer 54.64.232.49 vti bind 'vti1' set vpn ipsec site-to-site peer 54.64.232.49 vti esp-group 'AWS' set vpn ipsec ipsec-interfaces interface 'eth0' set vpn ipsec esp-group AWS compression 'disable' set vpn ipsec esp-group AWS lifetime '3600' set vpn ipsec esp-group AWS mode 'tunnel' set vpn ipsec esp-group AWS pfs 'enable' set vpn ipsec esp-group AWS proposal 1 encryption 'aes128' set vpn ipsec esp-group AWS proposal 1 hash 'sha1' set vpn ipsec ike-group AWS dead-peer-detection action 'restart' set vpn ipsec ike-group AWS dead-peer-detection interval '15' set vpn ipsec ike-group AWS dead-peer-detection timeout '30' set interfaces vti vti1 address '169.254.84.254/30' set interfaces vti vti1 description 'VPC tunnel 2' set interfaces vti vti1 mtu '1436' set protocols bgp 65000 neighbor 169.254.84.253 remote-as '64512' set protocols bgp 65000 neighbor 169.254.84.253 address-family ipv4-unicast soft-reconfiguration 'inbound' set protocols bgp 65000 neighbor 169.254.84.253 timers holdtime '30' set protocols bgp 65000 neighbor 169.254.84.253 timers keepalive '10' set protocols bgp 65000 address-family ipv4-unicast network 0.0.0.0/0 set protocols bgp 65000 address-family ipv4-unicast network 192.168.254.0/24
エラーなく投入が終われば、commit、saveします。この瞬間からAWSへBGPが張られます。
configureモードをexitして、「show ike sa」するとVPNトンネルの状態が表示されます。失敗していると「no vpn」と表示されます。
「show bgp summary」でBGPの状況が分かります。
AWS側でルート伝播とセキュリティ設定が完了していると、この段階でAWSのプライベートセグメントにいるEC2にpingが飛びます。
AWS側で確認/設定しておくべき事項は、まず対象のプライベートセグメントに対する「ルートテーブル」で「ルート伝播」が有効化されていることです。
有効化されていると、「ルート」にさくらクラウド側のプライベートセグメントがちゃんと広報されています。
また、EC2にセットしているセキュリティグループでpingとsshを許可しておきます。今回は検証環境のため「0.0.0.0/0.0.0.0」というオールパーミットな設定を入れています。
ここまで来るとVyOSの下にいるUbuntuからもpingが飛び、SSHでEC2にログインできます。EC2を作った時の鍵ファイルは予め.ssh/の下に置いておき(パーミッションは400)、「ssh -i .ssh/key_file_name ec2-user@10.0.77.47」でログインします。
無事ログインできれば見慣れた鳥のアスキー文字が見えます。
以上となります。お疲れ様でした。