家庭のネットワークに影響を与えないように考慮しながら Cloud VPN を検証する
こんにちは。クラウドエース株式会社で Google Cloud 認定トレーナーをしている廣瀬 隆博です。先日、「とある有名なメタルバンド」の来日公演が 2024 年末に開催されるという嬉しい発表がありました。彼らは 50 年以上 活動しているようで、厳しいであろう業界でそれだけ長く活動できていることは素晴らしいの一言につきます。
私が日常的に関わっている IT 業界においてもトレンドの移り変わりは早く、彼らのように何十年も活躍し続けている技術は多くはありません。そんな中、業務用ネットワーク機器の設定方法 は昔からあまり変わっていないんじゃないかと個人的に感じています。もちろんイマドキな Web ブラウザを用いた設定画面はあるのですが、多くのエンジニアはターミナル ソフトを用いて コマンドでコンフィグを投入 している気がします。少なくとも 2022 年頃は私もそうやっていました。
そこで、今回はオンプレミスと Google Cloud の Cloud VPN 接続を題材として、ルーターをコマンドで設定していきたいと思います。
構想
本題に入る前に、検証環境の構想を記載します。当初考えていた構成案と実際に検証した構成にはちょっとした乖離があり、私の苦慮した内容が伝われば嬉しいですね。また、結果だけではなく、検討過程にも需要があるのではないかと感じています。
最初に考えた案
この記事を作り始める前に考えていたのは スマートフォンのテザリングを使えばどこでも手軽に Cloud VPN が検証できるんじゃないか!? でした。現代人ならほぼ全員持っているデバイスだし良いアイデアだと思ったのですが、この目論見は外れてしまいます。
詳しい方ならピンときているかもしれませんが、大手の携帯電話会社は グローバル IP アドレスを提供していない ためですね。オプションで提供している事業者も一部存在するようですが、当初の狙いでもあった「どこでも手軽に検証」が実現できないため、この案は諦めることになりました。
検証のために新しい回線を契約するのはちょっとイヤですもんね。
妥協案
次に考えたのは、Cloud VPN の検証に際してネットワークが止まってはいけないよね でした。一人暮らしであれば自宅のネットワーク回線を占有できることも多いと思いますが、家族と共有している場合、うっかりネットワーク回線を止めてしまうような状況は避けるべきでしょう。家庭の平和に影響が発生した場合、貴重なお小遣いにも影響が及ぶ懸念があります。恐ろしい事態ですね。
なお、本記事では企業のネットワーク回線を用いた検証は考慮していません。詳細は後ほど出てきますが、少しだけ既存ネットワークの設定を変更しています。具体的には ポート フォワーディング ですね。それほど大きな変更ではありませんが、だからといって企業のネットワーク機器は気軽に触れるものではないでしょう。お小遣いとか言ってる場合ではない影響が発生するかもしれませんので、ホントに止めておきましょう。
スマートフォンのテザリングで検証が実現できたら良かったのになぁ。
システム構成
これまでの経緯もあって、最終的に以下の構成となりました。
- 家庭ネットワーク
- 既設ルーターが管理する
192.168.0.0/24
であり、インターネットと接続する
- 既設ルーターが管理する
- 検証ネットワーク
- 検証用に用意したルーターが管理する
192.168.100.0/24
であり、Cloud VPN と接続する
- 検証用に用意したルーターが管理する
- Cloud ネットワーク
- Google Cloud 上に構築する
10.0.0.0/24
であり、検証用ネットワークと VPN 接続する
- Google Cloud 上に構築する
おまけ
この記事がおおよそ完成した頃に悲劇が起きました。後輩とネタが被ったんです。かなり絶望しましたが、幸いにも公開された記事はルーターを Web ブラウザで設定していたので、本記事はコマンドでの 古式ゆかしい設定方法 を主張することで九死に一生を得ました。
機器構成
必要なネットワークは上記のように決まりましたが、ルーターの VPN 接続検証をするためには機材も必要ですね。具体的には Security Architecture for Internet Protocol(以下、IPSec) に対応したルーターが必要となります。
用意した機器
ここはしかるべき投資なので、なるべく節約しつつ必要なものを揃えました。最終的な検証機材は画像の通りです。
ルーター
かなり古い機器ですが、YAMAHA RTX1100 を用意しました。フリー マーケット アプリで 1100 円という安価で手に入れることができました。我が家の既存ルーターでも IPSec に対応していそうだったのですが、ここは当初のコンセプトである 既存ネットワークに影響を与えない を実現するために投資しました。
無線中継器
今回は TP-LINK の TL-WA850RE を用意しましたが、無線中継器は必須ではありません。構想で偉そうに書いてますが、テザリングでやってみてダメだったからメッチャ調べたらグローバル IP アドレスの件が発覚した というのが実態ですね。
そんな経緯もありましたが、使ってみると意外と便利でした。ルーターと自宅のネットワーク回線を無線で接続できるようになるので、コンセントさえあればどこでも検証可能となります。我が家はキッチン付近にネットワーク機器を設置しているので、そんなところで検証をしていたら恐ろしい事になっていたでしょう。君子危うきに近寄らず。
LAN ケーブル
ネットワークを扱うエンジニアはご存じの Local Area Network ケーブル(以下、LAN ケーブル)です。改めて説明するほどでもないのかもしれませんが、スマホ全盛の時代に育った方々はネットワークの有線接続を知らないかもしれないので、ここは手を抜けませんね。
最近のノートパソコンは有線の LAN コネクタが存在しないことも多く、私は個人持ちの USB コネクタを使ってルーターと接続しました。他にも無線中継器とルーターの接続も必要なので、合計 2 本の LAN ケーブルが必要になります。上記画像における白と青のケーブルですね。
余談
ネットワーク機器の設定と言えばシリアル ケーブルだ! と個人的に思っています。わずかながらもネットワーク機器を触ったことがある私としても、個人的にシリアル ケーブルを持っていました。さぁ初期設定だ!と意気込んでシリアル ケーブルを接続しようとしたところ、画像の通り両方ともオスでした・・・
オスメス変換コネクタを持っていなかったのでシリアル ケーブルは接続できませんでしたが、色々調べてなんとかした経緯を以下にまとめています。主題からは外れるので折りたたみにしてありますが、興味のある方はご参照ください。電源入れてから起動するまでのコンソールメッセージとか、見たかったなぁ。
ルーターにログインするまで
RTX 1100 を初期化すると IPv4 アドレスが設定されていません。 つまり IPv4 アドレスを指定して Telnet 接続ができないんですね。この機器はシリアル ケーブルで接続して IPv4 アドレスを設定するものなのですが、それができなかった私は割と本気で焦りました。
困ったら Google で検索 しながらエンジニアとして成長してきた私は、今回もすぐに検索してみました。諸先輩方の知見は素晴らしく、見事に解決することができました。ここまで意図的に IPv4 と書いたことで気づいた方もいるかもしれませんが、IPv6 で解決することができたんですね。
要は、IPv6 なら初期設定されている わけです。リンクローカル アドレスをご存じの方はピンと来るでしょう。詳細は省きますが、この IPv6 アドレスに接続してしまえば初期設定が可能なんですね。私の場合は Wireshark を使って IPv6 アドレスを特定しましたが、Mac アドレスから計算することも可能です。
ここを読んでいる皆さんは、きっと私と同じように RTX 1100 を LAN ケーブルだけで設定しようとしていると思います。是非とも色々試してみてください。出来なくて困った? Google で検索しましょう! 細かい手順を書いても良かったのですが、主題からあまりにも外れるのでご了承ください。
VPN 接続設定
それでは、具体的な手順に入っていきましょう。Cloud VPN には High Availability(以下、HA) VPN と Classic VPN があり、名称からも分かるように前者が主流となっています。それぞれ選択基準はあるのですが、せっかくなので今回は両方試してみました。
なお、冗長構成の要否も選択基準になりますが、今回はルーターが 1 台だけなのでそこは考慮していません。
無線中継器の設定
まずは危うきに近づかないための無線中継器を設定しました。やっていることはとても簡単で、我が家の無線に接続しただけですね。中継器の LAN コネクタと RTX1100 を有線接続することでルーターを無線化することが目的ですので、本当に繋いだだけです。
こちらも主題からは外れるので、細かい手順は省略しています。スマートフォンを無線接続したことがあれば、同じ雰囲気でいけるでしょう。
ポート フォワーディング設定
続いてもお小遣いを守るための ポート フォワーディング設定 です。これも各ご家庭で機器が違うので詳細は省きますが、以下の 3 種類が家庭用ルーターから検証用ルーターに転送されるよう設定しましょう。お持ちの機器名とポート フォワーディングで Google 検索すれば、設定のヒントが出てくると思います。
- ポート フォワーディング設定
- 500/UDP
- 4500/UDP
- 50/TCP and UDP
Google Cloud ネットワーク設定
Cloud VPN を接続するのが今回の目的ですが、結果を確かめるためには家庭のローカル IP アドレスと Google Cloud のローカル IP アドレスで通信してみる必要があります。そのために必要なリソースを準備していきましょう。
Compute Engine API 有効化
まずは、Application Programming Interface(以下、API)を有効化しましょう。具体的には Compute Engine API ですね。
デフォルト VPC 削除
続いて、デフォルトの Virtual Private Cloud(以下、VPC)を削除しましょう。プロジェクトを作成すると default
VPC が作成されますが、これは自動的にアレコレ設定されているので検証には不向きです。必要なものを順次手動設定していくことが理解に繋がりますよね。
Cloud ネットワーク 作成
デフォルト VPC を削除したので、検証に用いる VPC を作成しましょう。ここでは、カスタムモードで東京リージョンにサブネットを作成する形としました。
また、ファイアウォール ルールは有効にしていません。次のステップで必要なものを手動設定しています。
- VPC 名
- cloud-network
- サブネット作成モード
- カスタム
- サブネット名
- tokyo
- リージョン
- asia-northeast1
- IP スタックタイプ
- IPv4(シングル スタック)
- IPv4 範囲
- 10.0.0.0/24
ファイアウォール ポリシー 作成
ファイアウォール ルールではありません。ファイアウォール ポリシー を作成します。前者が旧来のもので、最近機能追加されているのが後者です。せっかくなので新しいものを使いましょう。
なお、各種ファイアウォール サービスの違いは我が社の イケてるエンジニア が以下の記事で解説しています。是非とも読んでみてください。
それでは、ファイアウォール ポリシーを用いて以下の通信を許可します。これを忘れたり間違えていると通信確認に失敗するので、確実に設定しましょう。
- ポリシー名
- allow-connect-vm
- ルール
- 優先度 100
- トラフィックの方向
- 上り
- 一致したときのアクション
- 許可
- ターゲット タイプ
- ネットワーク上のすべてのインスタンス
- 送信元
- IP タイプ
- IPv4
- IP 範囲
- 192.168.0.0/24
- 192.168.100.0/24
- IP タイプ
- 宛先
- IP タイプ
- IPv4
- IP 範囲
- 10.0.0.0/24
- IP タイプ
- プロトコルとポート
- すべて許可
- トラフィックの方向
- 優先度 101
- トラフィックの方向
- 下り
- 一致したときのアクション
- 許可
- ターゲット タイプ
- ネットワーク上のすべてのインスタンス
- 宛先
- IP タイプ
- IPv4
- IP 範囲
- 192.168.0.0/24
- 192.168.100.0/24
- IP タイプ
- 送信元
- IP タイプ
- IPv4
- IP 範囲
- 10.0.0.0/24
- IP タイプ
- プロトコルとポート
- すべて許可
- トラフィックの方向
- 優先度 100
- ポリシーと VPC ネットワークの関連付け
- cloud-network
検証用 VM 作成
ネットワークの準備ができたら Virtual Machine(以下、VM)を作成します。この VM は家庭のローカル IP アドレスとの通信を確認する目的のため、コストを意識して安価なインスタンスを選択します。また、VPN 接続後に Secure Shell(以下、SSH) で通信してみたいので、操作用の Windows パソコンで生成した SSH 公開鍵を登録してあります。
- SSH 鍵関連
- 鍵生成
- ssh-keygen -C "ssh-test"
- 鍵確認
- type <生成された.pubファイル>
- 鍵生成
- VM 作成
- 名前
- vpn-vm
- リージョン
- asia-northeast1
- ゾーン
- asia-northeast1-c
- マシンタイプ
- e2-micro
- 可用性ポリシー
- スポット
- 名前
Classic VPN
準備が整ったので、いよいよ Classic VPN を設定していきましょう。こちらは静的なルーティングを選択していることが特徴ですね。
グローバル IP アドレス取得
まずは、VPN に使用するグローバル IP アドレスを取得します。
- 名前
- vpn-cloud-ip
- ネットワーク サービス ティア
- プレミアム
- IP バージョン
- IPv4
- 種類
- リージョン
- asia-northeast1
- リージョン
Classic VPN 設定
続いて、Google Cloud 側の Classic VPN を設定します。家庭ネットワークと Google Cloud のグローバル IP アドレスの間で VPN を接続するため、Google Cloud から見たリモートピア IP アドレスには、家庭ネットワークのグローバル IP アドレスを指定します。192.168
みたいな ローカルなアドレスではない ことにご注意ください。
- VPN オプション
- Classic VPN
- VPN 接続の作成
- 名前
- classic-vpn
- ネットワーク
- cloud-network
- リージョン
- asia-northeast1
- IP アドレス
- vpn-cloud-ip
- 名前
- トンネル
- 名前
- classic-vpn-tunnel-1
- リモートピア IP アドレス
- <家庭ネットワーク グローバル IP アドレス>
- IKE バージョン
- IKEv1
- IKE 事前共有キー
- <生成したものを記録しておく>
- ルーティング オプション
- ルートベース
- リモート ネットワーク IP の範囲
- IP 範囲
- 192.168.0.0/24
- 192.168.100.0/24
- IP 範囲
- 名前
Classic VPN 検証用ルーター設定
Google Cloud 側は準備できたので、ルーター側を設定しましょう。今回用意した機器は初期設定では Telnet しか使えませんので、接続の際には注意してください。
なお、YAMAHA ルーターは特権に入るためのコマンドが administrator
です。つい CISCO のつもりで en
とか conf t
と打ちたくなりますね。
検証ネットワーク設定
最初に、ルーター内の検証ネットワークを設定します。ルーター自身の IP アドレス を 192.168.100.1
とし、192.168.100.2-192.168.100.254/24
を Dynamic Host Configuration Protocol(以下、DHCP)で割り当てる対象とします。こうすることで LAN 1 に接続した機器へ IP アドレスが自動的に払い出されるようになります。
ip lan1 address 192.168.100.1/24
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.2-192.168.100.254/24
家庭ネットワーク設定
続いて、ルーターを家庭ネットワークへ接続できるようにします。一般的な家庭のネットワークは DHCP で自動的に IP アドレスが払い出されるので、LAN 3 は DHCP で IP アドレスを取得する設定とします。
ip lan3 address dhcp
検証ネットワーク インターネット アクセス設定
ルーターを家庭ネットワークへ接続できたら、検証ネットワークがインターネットへアクセスできるようにします。
その前に、前提となる NAT(Network Address Translation)や、NAPT(Network Address Port Translation) について少し触れておきましょう。
少し前あたりから IPv4 アドレスの枯渇が世間で話題になっていました。しかし、家庭内にパソコンやスマートフォンを追加してもこの問題には影響がありません。特に意識せずインターネット回線を契約すると、接続するための機器としてルーターが貸与され、それによって家庭内と家庭外の IP アドレスが変換されているためです。この仕組みを実現しているのが NAT や NAPT です。NAT は 1 対 1 で IP アドレスを変換し、NAPT は多対 1 で変換する仕組みです。つまり、後者の技術によって 家庭内の IP アドレスはインターネット向けのものへ変換 されており、これによってインターネット回線 1つ に必要な IP アドレスが節約されているわけですね。
さて、検証中の構成に戻りましょう。ルーターには検証ネットワークと家庭ネットワークが設定されていますが、それ以外の宛先への通信は LAN 3 へ向かうようにデフォルト ゲートウェイを設定します。LAN 3 には IP マスカレード を設定することで、検証ネットワークから家庭ネットワークへアクセスする際には IP アドレスが変換されるようになります。NAPT じゃなくて IP マスカレードなの?と思った方はしっかり理解しながら読んでくださっていますね。これらは同じものであり、NAPT が Linux 上で実装された際に IP マスカレードと呼ばれており、今回用意したルーターにおいてパラメータが masquerade
であったため、ここでは紹介も兼ねて IP マスカレードと表記しました。
更に、Domain Name System(以下、DNS)サーバーもこのタイミングで設定しておきましょう。8.8.8.8
はダミーのような値に見えますが、実はこれ Google が公開している DNS サーバー なんです。家庭のネットワークを調べて DNS サーバーを設定するのはひと手間なので、今回のような検証では活躍しますね。
ip route default gateway dhcp lan3
ip lan3 nat descriptor 1
nat descriptor type 1 masquerade
nat descriptor address outer 1 primary
nat descriptor address inner 1 192.168.100.1-192.168.100.254
dns server 8.8.8.8
VPN 設定前の動作確認
ここまでの設定で、ルーターに接続した機器が無線中継器と家庭ネットワークを経由してインターネットへアクセスできるようになっています。LAN 3 に無線中継器、LAN 1 にお手持ちのパソコンを繋いで試してみましょう。もしうまくいかない場合、LAN 1 のケーブルを一度取り外してから再接続してみると良いですね。
VPN 設定
いよいよ本題ですね。IPSec のトンネルモードを用いて Classic VPN と接続してみましょう。なお、IPSec はトランスポート モードもありますが、こちらはホスト間の接続であり、今回のようにネットワーク間の接続に使うものではありません。
tunnel select 1
description tunnel GoogleCloudVPN
Cloud VPN とルーター間のコネクションは Security Association(以下、SA) と呼ばれています。SA ポリシーとして通信や暗号化の方式を定義することになります。下記コマンド内での esa
aes-cbc
sha-hmac
ですね。興味のある方は調べてみると理解が深まります。
ipsec sa policy 10 1 esp aes-cbc sha-hmac anti-replay-check=off
Internet Key Exchange(以下、IKE) とは、読んで文字のごとく鍵を交換するための仕組みです。IKE の設定に従って SA が生成されるといった形ですね。ちょっと設定が多いので、小分けにして見ていきましょう。
ローカル アドレス
家庭ネットワークと Google Cloud のグローバル IP アドレスの間で VPN を接続するため、ルーターから見たローカルなアドレスには、家庭ネットワークのグローバル IP アドレスを指定します。
ipsec ike local address 1 <家庭ネットワーク グローバル IP アドレス>
リモート アドレス
検証用ルーターからみて接続先がリモート アドレスですので、Google Cloud のグローバル IP アドレスを指定します。先ほど取得した静的な IP アドレスですね。
ipsec ike remote address 1 <Google Cloud グローバル IP アドレス>
事前共有キー
Classic VPN をした際に生成された事前共有キーを指定します。
ipsec ike pre-shared-key 1 text <事前共有キー>
暗号化・ハッシュ
IKE における暗号化およびハッシュの方式を定義します。SA で同じようなの指定したじゃない? と感じる方もいそうですが、これは IPSec の接続方式によるものです。詳しく知りたい方は是非調べてみましょう。
ipsec ike encryption 1 aes-cbc
ipsec ike hash 1 sha
NAT トラバーサル
NAT 超え とも表記される NAT トラバーサル です。今回は NAPT によって検証ネットワークと家庭のネットワークを変換していますが、検証用のルーターとしては、家庭用ルーターを超えて Cloud VPN と IPSec 接続をする必要があります。前述したように家庭ネットワークでも NAPT によって IP アドレスが変換されているため、検証ネットワークから家庭ネットワークの NAPT を超えるためにこの設定が必要となります。まさに NA(P)T 超えですね。
ipsec ike nat-traversal 1 on
VPN 関連通信を NAT 変換しない
NAT は超えられるようになりましたが、VPN 接続に必要な通信は変換されてはいけません。前述のポート フォワーディングで家庭のルーターから検証用のルーターまで特定の通信のみ変換されずに届くようにしていたので、それと対になる設定ですね。この設定により、家庭のネットワークは維持されつつも VPN に関する通信だけはポート変換されずに検証用のルーターへ届く ようになります。
nat descriptor masquerade static 1 1 192.168.100.1 udp 500
nat descriptor masquerade static 1 2 192.168.100.1 esp
nat descriptor masquerade static 1 3 192.168.100.1 udp 4500
接続維持に関する設定
商用環境を意識した場合、VPN 接続は常時維持したいですよね。しかし、ルーターも機械なのでいろんな要因で止まってしまうことがあります。そういった際に再接続を試みるための設定ですね。詳細は省きますが、常時 VPN を接続してね という設定と、ここへの通信が途切れたら現在の接続は破棄してね という設定を実装しています。
ipsec ike always-on 1 on
ipsec ike keepalive use 1 on icmp-echo <Google Cloud グローバル IP アドレス>
VPN 有効化
ここまでの内容で VPN は設定できたので、設定を有効化します。ちょっと分かりにくいんですけど、トンネル 1 番に SA 10 番を適用しています。また、auto refresh
で自動的に接続を開始しています。なお、mss
は Maximum Segment Size の略であり、今回の主題からは外れるのでおまじないだと思っておいてください。
ipsec tunnel 10
ipsec auto refresh 1 on
ip tunnel tcp mss limit auto
tunnel enable 1
Cloud ネットワーク ルーティング
VPN が設定できたら、検証ネットワークから Cloud ネットワークへのルートを明示しておきましょう。ここまでに作成したトンネル 1 番を通って 10.0.0.0/24
に通信して欲しいという内容ですね。
ip route 10.0.0.0/24 gateway tunnel 1
その他の設定
ここまでの内容で Cloud ネットワークとの通信設定はできたのですが、他にも細かな設定を以下のように実装しました。
この 2 行は時刻に関する設定であり、日本標準時に設定しつつ、定期的に Google の Network Time Protocol サーバーと同期することで時間がズレにくいようにしました。
timezone +09:00
schedule at 1 */* 02:34 * ntpdate time.google.com syslog
また、以下の4行でルーターへのログインユーザーを admin
に設定し、ログイン時にパスワードを要求するようにしました。Telnet は暗号化されていない通信なので、SSH のみ許可するように変更しています。
login user admin <ログインパスワード>
sshd host key generate
sshd service on
telnetd service off
設定保存
全ての設定を終えたので、コンフィグを保存して特権モードを終了しましょう。
save
exit
動作確認
Classic VPN が無事に稼働したはずなので、動作を確認していきましょう。
SA 状態確認
まずはルータから見て Google Cloud との SA が確立していることを確認しましょう。show ipsec sa
コマンドで以下のような結果が返ってこれば OK です。
show ipsec sa
sa sgw connection dir life[s] remote-id
--------------------------------------------------------------------------
1 1 isakmp - 36423 <Google Cloud グローバル IP アドレス>
2 1 tun[001]esp send 10623 <Google Cloud グローバル IP アドレス>
3 1 tun[001]esp recv 10623 <Google Cloud グローバル IP アドレス>
(略)
Classic VPN トンネル状態確認
続いて、Google Cloud から見て、検証ネットワークのルーターとのトンネルが確立していることを確認します。作成した Classic VPN の詳細を確認し、画像のように 確立済み
と表示されたら OK ですね。
検証ネットワークから Cloud ネットワークへ接続
いよいよ Cloud ネットワークの IP アドレスへ接続してみましょう。まずは Ping による疎通確認ですね。
C:\Users\hirose.takahiro>ping 10.0.0.2
10.0.0.2 に ping を送信しています 32 バイトのデータ:
10.0.0.2 からの応答: バイト数 =32 時間 =17ms TTL=62
10.0.0.2 からの応答: バイト数 =32 時間 =17ms TTL=62
10.0.0.2 からの応答: バイト数 =32 時間 =18ms TTL=62
10.0.0.2 からの応答: バイト数 =32 時間 =18ms TTL=62
10.0.0.2 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 17ms、最大 = 18ms、平均 = 17ms
C:\Users\hirose.takahiro>
問題ないので、SSH でサーバーにログインしてみましょう。事前に作成していた vpn-vm
のプロンプトが返ってこれば OK です。
C:\Users\hirose.takahiro>ssh ssh-test@10.0.0.2 -i c:\Users\hirose.takahiro\.ssh\id_rsa
The authenticity of host '10.0.0.2 (10.0.0.2)' can't be established.
ECDSA key fingerprint is SHA256:VjwzbFzrHhUno4k9m5rXcY66i+ynpIPbwBbidKLSjLU.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.0.2' (ECDSA) to the list of known hosts.
Linux vpn-vm.c.ca-hirose-takahiro-vpn-test.internal 6.1.0-20-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.85-1 (2024-04-11) x86_64
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Tue May 14 06:55:25 2024 from 192.168.100.2
ssh-test@vpn-vm:~$
Cloud ネットワークから検証ネットワークへ接続
Ping や SSh が繋がっている時点でおおよそ問題ないのは想定できるのですが、念のために Cloud ネットワークから検証ネットワークに対しても疎通を確認しましょう。
ssh-test@vpn-vm:~$ ping -c 4 192.168.100.1
PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
64 bytes from 192.168.100.1: icmp_seq=1 ttl=254 time=15.2 ms
64 bytes from 192.168.100.1: icmp_seq=2 ttl=254 time=12.9 ms
64 bytes from 192.168.100.1: icmp_seq=3 ttl=254 time=16.0 ms
64 bytes from 192.168.100.1: icmp_seq=4 ttl=254 time=14.0 ms
--- 192.168.100.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 12.895/14.523/15.967/1.165 ms
ssh-test@vpn-vm:~$
ルーター操作ログ
Classic VPN が無事に検証できたので、これまでの操作ログを以下に記載しておきます。ここまでの流れをまとめたものなので内容的には重複しており、折りたたみにしておきます。改めて確認したい方は開いてみてください。
Classic VPN ルーター操作ログ
Password:
RTX1100 Rev.8.03.94 (Thu Dec 5 19:06:16 2013)
Copyright (c) 1994-2012 Yamaha Corporation. All Rights Reserved.
Copyright (c) 1991-1997 Regents of the University of California.
Copyright (c) 1995-2004 Jean-loup Gailly and Mark Adler.
Copyright (c) 1998-2000 Tokyo Institute of Technology.
Copyright (c) 2000 Japan Advanced Institute of Science and Technology, HOKURIKU.
Copyright (c) 2002 RSA Security Inc. All rights reserved.
Copyright (c) 1997-2004 University of Cambridge. All rights reserved.
Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, All rights reserved.
Copyright (c) 1995 Tatu Ylonen , Espoo, Finland All rights reserved.
Copyright (c) 1998-2004 The OpenSSL Project. All rights reserved.
Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) All rights reserved.
Copyright (c) 2006 Digital Arts Inc. All Rights Reserved.
00:a0:de:31:0f:98, 00:a0:de:31:0f:99, 00:a0:de:31:0f:9a,
Memory 32Mbytes, 3LAN, 1BRI
> administrator
Password:
# ip lan1 address 192.168.100.1/24
#
# dhcp service server
# dhcp server rfc2131 compliant except remain-silent
# dhcp scope 1 192.168.100.2-192.168.100.254/24
#
# ip lan3 address dhcp
#
# ip route default gateway dhcp lan3
# ip lan3 nat descriptor 1
# nat descriptor type 1 masquerade
# nat descriptor address outer 1 primary
# nat descriptor address inner 1 192.168.100.1-192.168.100.254
# dns server 8.8.8.8
#
# save
セーブ中... CONFIG0 終了
#
# exit
> exit
(SSH でルーターの 192.168.100.1 へ再接続)
Password:
RTX1100 Rev.8.03.94 (Thu Dec 5 19:06:16 2013)
Copyright (c) 1994-2012 Yamaha Corporation. All Rights Reserved.
Copyright (c) 1991-1997 Regents of the University of California.
Copyright (c) 1995-2004 Jean-loup Gailly and Mark Adler.
Copyright (c) 1998-2000 Tokyo Institute of Technology.
Copyright (c) 2000 Japan Advanced Institute of Science and Technology, HOKURIKU.
Copyright (c) 2002 RSA Security Inc. All rights reserved.
Copyright (c) 1997-2004 University of Cambridge. All rights reserved.
Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, All rights reserved.
Copyright (c) 1995 Tatu Ylonen , Espoo, Finland All rights reserved.
Copyright (c) 1998-2004 The OpenSSL Project. All rights reserved.
Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) All rights reserved.
Copyright (c) 2006 Digital Arts Inc. All Rights Reserved.
00:a0:de:31:0f:98, 00:a0:de:31:0f:99, 00:a0:de:31:0f:9a,
Memory 32Mbytes, 3LAN, 1BRI
> administrator
Password:
# tunnel select 1
tunnel1# description tunnel GoogleCloudVPN
tunnel1#
tunnel1# ipsec sa policy 10 1 esp aes-cbc sha-hmac anti-replay-check=off
tunnel1#
tunnel1# ipsec ike local address 1 <家庭ネットワーク グローバル IP アドレス>
tunnel1#
tunnel1# ipsec ike remote address 1 <Google Cloud グローバル IP アドレス>
tunnel1#
tunnel1# ipsec ike pre-shared-key 1 text <事前共有キー>
tunnel1#
tunnel1# ipsec ike encryption 1 aes-cbc
tunnel1# ipsec ike hash 1 sha
tunnel1#
tunnel1# ipsec ike nat-traversal 1 on
tunnel1#
tunnel1# nat descriptor masquerade static 1 1 192.168.100.1 udp 500
tunnel1# nat descriptor masquerade static 1 2 192.168.100.1 esp
tunnel1# nat descriptor masquerade static 1 3 192.168.100.1 udp 4500
tunnel1#
tunnel1# ipsec ike always-on 1 on
tunnel1# ipsec ike keepalive use 1 on icmp-echo <Google Cloud グローバル IP アドレス>
tunnel1#
tunnel1# ipsec tunnel 10
tunnel1# ipsec auto refresh 1 on
tunnel1# ip tunnel tcp mss limit auto
tunnel1# tunnel enable 1
tunnel1#
tunnel1# timezone +09:00
tunnel1# schedule at 1 */* 02:34 * ntpdate time.google.com syslog
tunnel1#
tunnel1# login user admin admin
tunnel1# sshd host key generate
Generating public/private dsa key pair ...
|*******
Generating public/private rsa key pair ...
|*******
tunnel1# sshd service on
tunnel1# telnetd service off
tunnel1#
tunnel1# save
セーブ中... CONFIG0 終了
tunnel1#
tunnel1# exit
tunnel1>
tunnel1> show ipsec sa
sa sgw connection dir life[s] remote-id
--------------------------------------------------------------------------
1 1 isakmp - 36423 <Google Cloud グローバル IP アドレス>
2 1 tun[001]esp send 10623 <Google Cloud グローバル IP アドレス>
3 1 tun[001]esp recv 10623 <Google Cloud グローバル IP アドレス>
SA[1] 寿命: 36423秒
自分側の識別子: 192.168.100.1
相手側の識別子: <Google Cloud グローバル IP アドレス>
プロトコル: IKE
SPI: 54 b9 43 f8 bc 8d 00 bc a6 d6 eb ae 9e 9e 51 d5
鍵 : ** ** ** ** ** (confidential) ** ** ** ** **
----------------------------------------------------
SA[2] 寿命: 10623秒
自分側の識別子: 192.168.100.1
相手側の識別子: <Google Cloud グローバル IP アドレス>
送受信方向: 送信
プロトコル: ESP (モード: tunnel)
アルゴリズム: AES-CBC (認証: HMAC-SHA)
SPI: b4 36 e2 bf
鍵 : ** ** ** ** ** (confidential) ** ** ** ** **
----------------------------------------------------
SA[3] 寿命: 10623秒
自分側の識別子: 192.168.100.1
相手側の識別子: <Google Cloud グローバル IP アドレス>
送受信方向: 受信
プロトコル: ESP (モード: tunnel)
アルゴリズム: AES-CBC (認証: HMAC-SHA)
SPI: 7e 99 a3 81
鍵 : ** ** ** ** ** (confidential) ** ** ** ** **
----------------------------------------------------
tunnel1>
tunnel1> ping <Google Cloud グローバル IP アドレス>
<Google Cloud グローバル IP アドレス>から受信: シーケンス番号=0 ttl=105 時間=15.039ミリ秒
<Google Cloud グローバル IP アドレス>から受信: シーケンス番号=1 ttl=112 時間=11.948ミリ秒
2個のパケットを送信し、2個のパケットを受信しました。0.0%パケットロス
往復遅延 最低/平均/最大 = 11.948/13.493/15.039 ミリ秒
tunnel1>
tunnel1> ping 10.0.0.2
10.0.0.2から受信: シーケンス番号=0 ttl=62 時間=18.775ミリ秒
10.0.0.2から受信: シーケンス番号=1 ttl=62 時間=15.163ミリ秒
2個のパケットを送信し、2個のパケットを受信しました。0.0%パケットロス
往復遅延 最低/平均/最大 = 15.163/16.969/18.775 ミリ秒
tunnel1>
tunnel1> show config
# RTX1100 Rev.8.03.94 (Thu Dec 5 19:06:16 2013)
# MAC Address : 00:a0:de:31:0f:98, 00:a0:de:31:0f:99, 00:a0:de:31:0f:9a,
# Memory 32Mbytes, 3LAN, 1BRI
# main: RTX1100 ver=c0 serial=N1A018837 MAC-Address=00:a0:de:31:0f:98 MAC-Addr
ess=00:a0:de:31:0f:99 MAC-Address=00:a0:de:31:0f:9a
# Reporting Date: May 14 10:00:45 2024
login user admin *
timezone +09:00
ip route default gateway dhcp lan3
ip route 10.0.0.0/24 gateway tunnel 1
ip lan1 address 192.168.100.1/24
ip lan3 address dhcp
ip lan3 nat descriptor 1
tunnel select 1
description tunnel GoogleCloudVPN
ipsec tunnel 10
ipsec sa policy 10 1 esp aes-cbc sha-hmac anti-replay-check=off
ipsec ike always-on 1 on
ipsec ike encryption 1 aes-cbc
ipsec ike hash 1 sha
ipsec ike keepalive use 1 on icmp-echo <Google Cloud グローバル IP アドレス>
ipsec ike local address 1 <家庭ネットワーク グローバル IP アドレス>
ipsec ike nat-traversal 1 on
ipsec ike pre-shared-key 1 *
ipsec ike remote address 1 <Google Cloud グローバル IP アドレス>
ipsec auto refresh 1 on
ip tunnel tcp mss limit auto
tunnel enable 1
nat descriptor type 1 masquerade
nat descriptor address outer 1 primary
nat descriptor address inner 1 192.168.100.1-192.168.100.254
nat descriptor masquerade static 1 1 192.168.100.1 udp 500
nat descriptor masquerade static 1 2 192.168.100.1 esp
nat descriptor masquerade static 1 3 192.168.100.1 udp 4500
telnetd service off
dhcp service server
dhcp server rfc2131 compliant except remain-silent
dhcp scope 1 192.168.100.2-192.168.100.254/24
dns server 8.8.8.8
schedule at 1 */* 02:34 * ntpdate time.google.com syslog
sshd service on
sshd host key generate *
tunnel1>
tunnel1> exit
HA VPN
Classic VPN が動作したので、次は HA VPN ですね。動的なルーティングであり、相手側ネットワークのサブネットを登録しなくても良い点に注目しましょう。
また、HA VPN では、トンネルを 2 つ以上に増やすことが可能です。ルーターを 2 台にして個別にトンネルを接続することで、機器が 1 台故障しても VPN の利用が継続できるという、まさに HA な構成が実現できます。いつかルーターをもう 1 台手に入れたら、そういった検証もしてみたいですね。
なお、今回はルーターが 1 台だけなので冗長構成にはなりません。
Classic VPN 削除
HA VPN の設定を始める前に、ややこしくならないように Classic VPN を削除しましょう。VPN トンネルを削除してから VPN ゲートウェイを削除する必要があることに注意してください。
HA VPN 設定
さて、Classic VPN も削除できたので、HA VPN を作成していきましょう。動的なルーティングを支える Autonomous System Number(以下、ASN)と Border Gateway Protocol(以下、BGP)が新たに登場します。静的なルーティングであった Classic VPN では双方に個別設定した経路情報を自動的に交換するための仕組みであることを理解しながら設定していきましょう。
なお、Classic VPN で解説済みの技術要素に関する解説は省いて進めますのでご了承ください。
ピア VPN ゲートウェイ設定
まずは、検証ネットワークのルーターを ピア VPN ゲートウェイ として設定します。そんなに難しいものではないので、画面を見れば設定できると思います。
- 名前
- home-network-gateway-01
- ピア VPN ゲートウェイ インターフェース
- 1 つのインターフェース
- <家庭ネットワーク グローバル IP アドレス>
- 1 つのインターフェース
Cloud Router 設定
続いて、Cloud Router を設定します。ここまで検証ネットワークのルーターを触っていたのでおおよそ理解いただいたかと思いますが、Google Cloud 側の経路を選択するためのプロダクトが、文字通り Cloud Router です。実は Classic VPN の時にも自動作成されていたんですよね、これ。
HA VPN 設定
事前準備が整ったので、HA VPN を作成していきましょう。
HA VPN 検証用ルーター設定
さて、楽しいルーター設定の時間です。特権でログインするところまでは省略しますが、失念してしまった方は本記事を見返しましょう。
動的ルーティングの技術的な解説
動的ルーティングでは静的なものとは異なり、お互いのネットワークを意識せずともルーター同士で経路情報を交換します。そのために用いられる仕組みが BGP であり、各機器を一意に識別するための値が ASN です。3文字の略語って覚えるの大変ですよね。私は苦手です。
BGP
詳しい事を語りだすと終わらなくなるので省きますが、ネットワーク同士で経路情報を交換する仕組みが BGP です。この仕組みを用いることで、相手側にサブネットの情報を伝える必要がなくなります。ウチのネットワークに xxx.xxx.xxx.xxx/xx
が増えたから、これも転送してね と相手側の機器に伝える感じですね。
ASN
ASN、日本語で表記すると 自律システム番号 です。BGP においてルーターを特定するための一意な番号と思っていただければ大体 OK です。フワッと概念を伝えて理解の助けになれば良いのかなっていう軽い気持ちで書けるのが技術ブログの良いところだなぁとよく思います。
リンクローカル アドレス
HA VPN で頻繁に出くわすのが リンクローカル アドレス です。169.254
で始まる IPv4 アドレスであることが特徴ですね。 IPv6 では fe80::/64
なのですが、ややこしいのでこの場では忘れましょう。
ちなみに、Automatic Private IP Addressing(APIPA) で伝わる方も多いかもしれません。本来的には DHCP では IP アドレスが設定できなかった場合に設定に用いられるものですが、ここでは BGP のために使用します。
色々書きましたが、ざっくりと 169.254
から始まる BGP 関連の IP アドレスはリンクローカル アドレスだということを覚えておけば良いでしょう。Google Cloud で BGP を設定し始めると急に出てくるので困惑しがちですので。
既存設定変更
それでは、既存の設定から変更していきましょう。HA VPN を新たに設定したことで、IKE 事前共有キーや Google Cloud の グローバル IP アドレスが新たに発行されています。
また、接続が維持されているかどうかの判定に用いる IKE キープアライブの宛先をリンクローカル アドレスに変更しました。VPN が切断されたら到達できなくなる IP アドレスなので、接続の判定には適切ですね。
ipsec ike keepalive use 1 on icmp-echo 169.254.103.25
ipsec ike pre-shared-key 1 text <事前共有キー>
ipsec ike remote address 1 <Google Cloud グローバル IP アドレス>
tunnel select 1
トンネル インターフェース の IP アドレス設定
今回は VPN を接続した後に BGP コネクションを確立するため、その際に使用する IP アドレスを設定します。HA VPN を作成した際に提示されるものをそのまま設定すれば良いですね。
ip tunnel address 169.254.103.26
ip tunnel remote address 169.254.103.25
BGP 設定
BGP による経路交換を始めるための設定です。検証用ルーターの ASN や 双方のリンクローカル アドレス、BGP で相手に伝えたいネットワークの情報を定義していきます。なお、一番最後の bgp configure refresh
は実は設定ではなく、ここまでに設定した BGP 設定を有効化するものですね。
bgp use on
bgp autonomous-system 65001
bgp neighbor 1 64512 169.254.103.25 local-address=169.254.103.26
bgp import filter 1 equal 192.168.100.0/24
bgp import 64512 static filter 1
bgp configure refresh
HA VPN 動作確認
無事に設定できたので動作確認といきたいのですが、結果は Classic VPN とまったく同じになってしまうので、ここでは記載の多くを省略します。静的だろうが動的だろうが所詮は手段であり、目的は同じですからね。
では、何を確認するべきか。BGP ですね。IPSec を初めて繋いだ時と同様に、BGP についても双方でセッションが確立されていることを確認しておきましょう。show status bgp neighbor
で BGP State = Active になっていれば OK ですね。
tunnel1> show status bgp neighbor
BGP neighbor is 169.254.103.25, remote AS 64512, local AS 65001, external link
BGP version 4, remote router ID 0.0.0.0
BGP state = Active
Last read 00:00:00, hold time is 0, keepalive interval is 0 seconds
Received 0 messages, 0 notifications, 0 in queue
Sent 2 messages, 1 notifications, 0 in queue
Connection established 0; dropped 0
Last reset never
Local host: unspecified
Foreign host: 169.254.103.25, Foreign port: 0
tunnel1>
Google Cloud 側も同様に VPN トンネルの BGP セッションが確立されていればバッチリですね。あとは Ping や SSH でローカル IP アドレス同士の疎通を確認しましょう。
まとめ
Classic VPN と HA VPN、2 種類の Cloud VPN を接続して動作を確認してみました。理屈は知っていても実際に設定したことはないという方もいると思いますが、やはり手を動かしてみると理解が深まりますね。
当初考えていたテザリングでの検証は実現できませんでしたが、今回の方式でも既存回線への影響はありませんでした。私自身の就業形態がフル リモートワークなのですが、この検証をしている最中にも各種業務は滞りなく 進めることができています。
もちろん、お小遣いへの影響も発生しませんでした。とても大事なことですね。
今回は YAMAHA RTX1100 での検証でした。YAMAHA ルーターはフリー マーケット アプリはもちろんのこと、中古の IT 機器を取り扱う店舗であっても入手可能ですので、本記事を読んで興味を持たれた方は是非試してみてください。確証はありませんが、YAMAHA ルーターで IPSec に対応しているものであれば、同じような操作で再現できると思います。また、IPSec に対応したルーターであれば同様の検証は可能なはずです
クラウドエース株式会社 Google Cloud 認定トレーナーの廣瀬 隆博がお届けしました。また次の記事でお会いしましょう。
Discussion