「Private Google Access for オンプレミスホスト」の設定
この記事は「GCP の細かすぎて伝わらないハイブリッドネットワーキング」の補足の位置付けです。
「Private Google Access for オンプレミスホスト」を使うと、オンプレミス環境から Cloud VPN や Cloud Interconnect などの閉域接続を通って Google の API に直接アクセスできます。
設定方法は公式ドキュメントにもありますが、この記事では補足も入れながら、改めて設定方法をご紹介したいと思います。
- 名前解決への仕掛け
- ルーティングへの仕掛け
の二種類の仕掛けを組合わることで実現されています。
名前解決への仕掛け
オンプレミス環境から、たとえば BigQuery の API ( bigquery.googleapis.com
)にアクセスしようとすると、当たり前ですがそのままでは普通にインターネット越しにアクセスすることになってしまいます。
$ curl -s -v https://bigquery.googleapis.com/bigquery/v2/projects⏎ |& head -1
* Trying 172.217.25.202...
そこでまずは、(クライアントに)オンプレミス環境から閉域接続(Cloud VPN や Cloud Interconnect)を通って通信させるような仕掛けが必要になります。
そもそも、なぜ「そのままだとインターネット越し」になっちゃうのでしょう?それは、bigquery.googleapis.comを
名前解決した結果がパブリック IP アドレスだからです。
$ host bigquery.googleapis.com
bigquery.googleapis.com has address 172.217.161.42
そこで、これをパブリック IP アドレスじゃなく、閉域接続経由となるような IP アドレスにしちゃえばいいのです。GCP ではそのために199.36.153.8/30
という 4 つのIPアドレスが用意されており、private.googleapis.com
という名前がつけられています。
$ host private.googleapis.com
private.googleapis.com has address 199.36.153.11
private.googleapis.com has address 199.36.153.8
private.googleapis.com has address 199.36.153.9
private.googleapis.com has address 199.36.153.10
ドキュメントには
restricted.googleapis.com
とprivate.googleapis.com
の二種類が載っていますが、前者は VPC Service Controls という機能と組み合わせて使うものなのでここでは後者のみ説明します。VPC Service Controls について詳しく知りたい方は公式ドキュメントや、Google Cloud Next ’19 in Tokyo での「実例から学ぶ、VPC Service Control Deep Dive」というセッションをご覧ください。
クライアントがbigquery.googleapis.com
にアクセスしようとする際、本来の IP アドレスではなく、これらの IP アドレスにアクセスするように仕向けるには、たとえば、各クライアントの /etc/hosts や Hosts ファイルをいじる方法があります。
$ grep bigquery /etc/hosts
199.36.153.8 bigquery.googleapis.com
また DNS サーバーの設定に手を入れる方法も考えられます。公式ドキュメントでは BIND での設定例が紹介されています。最小限の設定をするとこんな感じになります。
$ cat /etc/bind/named.conf
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";$ cat /etc/bind/named.conf.options
options {
response-policy { zone "googleapis.zone"; };
};$ cat /etc/bind/named.conf.local
zone "googleapis.zone" {
type master;
file "/etc/bind/googleapis.zone";
allow-query {none;};
};$ cat /etc/bind/googleapis.zone
$TTL 1H
@ SOA LOCALHOST. noreply.localhost(3 1h 15m 30d 2h)
NS LOCALHOST.bigquery.googleapis.com CNAME private.googleapis.com.
private.googleapis.com CNAME rpz-passthru.
このような設定をすることで、bigquery.googleapis.com
には CNAME としてprivate.googleapis.com
(199.36.153.8/30)が返り、それ以外の名前(API)には普通の IP アドレスが返ります。
$ dig @127.0.0.1 bigquery.googleapis.com +short
private.googleapis.com.
199.36.153.8
199.36.153.10
199.36.153.9
199.36.153.11$ dig @127.0.0.1 compute.googleapis.com +short
172.217.26.42$ curl -s -v https://bigquery.googleapis.com/bigquery/v2/projects⏎ |& head -1
* Trying 199.36.153.8...
もし、すべての .googleapis.com
へのアクセスを private.googleapis.com
経由にしてよいということであれば、公式ドキュメント通り、ゾーンファイルの bigquery.googleapis.com
となっているところを*.googleapis.com
に変更すればオッケーです。
ちなみに、すべての.googleapis.com
へのアクセスを閉域接続経由にしてよければ、BIND 以外にも NSD や、GCP のサービスである Cloud DNS を利用することもできます。↓ は NSD での設定例です。
$ cat /etc/nsd/nsd.conf
zone:
name: "googleapis.com"
zonefile: "googleapis.com.zone"$ cat /etc/nsd/googleapis.com.zone
@ SOA LOCALHOST. noreply.localhost(1 1h 15m 30d 2h)* A 199.36.153.8
A 199.36.153.9
A 199.36.153.10
A 199.36.153.11
Cloud DNS を使うためには、Cloud DNS でのゾーンの設定とゾーンでクエリーを受ける設定に加え、オンプレミス環境から Cloud DNS へクエリーを飛ばす設定が必要になります。
オンプレミス環境から Cloud DNS へクエリを飛ばすのはリゾルバサーバーでの設定になりますが、たとえば unbound だとこんな設定になります。
$ cat /etc/unbound/unbound.conf.d/googleapis-forward-zone.conf
forward-zone:
name: "googleapis.com."
forward-addr: 192.168.0.3
forward-addr: 192.168.1.3
なお、unbound では ↓ のように設定することで、特定のホスト名のクエリだけ Cloud DNS へ飛ばすことができます。(例: bigquery.googleapis.com
)
$ cat /etc/unbound/unbound.conf.d/googleapis-forward-zone.conf
forward-zone:
name: "bigquery.googleapis.com."
forward-addr: 192.168.0.3
forward-addr: 192.168.1.3
ルーティングへの仕掛け
上記の設定により、bigquery.googleapis.com
へのアクセスは199.36.153.8/30
へと向かうようになりました。しかし、このままでは実際には通信できません。199.36.153.8/30
という (4つの) IP アドレスはパブリック IP アドレスではありますが、インターネット経由では通信できないからです。
そこで次に、199.36.153.8/30
が閉域接続を経由して GCP へ向かうよう、ルーティングに仕掛けをする必要があります。
といっても設定は簡単で、Cloud Router のカスタム経路広告で199.36.153.8/30
をオンプレミス環境向けに広告するよう設定するか、GCP と閉域接続しているオンプレミス環境のルーターで、199.36.153.8/30
が GCP へ向かうよう静的経路を設定すればいいのです。
ここまでの設定により、オンプレミス環境のクライアントからのbigquery.googleapis.com
へのアクセスは無事、199.36.153.8/30
へのアクセスとなり、そのアクセスは閉域接続を通って GCP へと向かうことになりました。
さて、GCP (の VPC)に到達したリクエストはその後どうなるのでしょう?
オンプレミス環境からのリクエストがGCP に到達した後は、Google Compute Engine の VM からのリクエストと同じように扱われ、通常設定されているdefault-internet-gateway
宛ての経路 0.0.0.0/0
にしたがって GCP 内部へとルーティングされていきます。
$ gcloud compute routes list --filter="network=vpc2 AND⏎ destRange=0.0.0.0/0"
NAME NETWORK DEST_RANGE NEXT_HOP⏎ PRIORITY
default-route-d6f11a8f97507201 vpc2 0.0.0.0/0 default-internet-gateway 1000
逆に言うと、
199.36.153.8/30
の宛先はdefault-internet-gateway
となってる必要があるので気をつけてください。
以上がすべて正しく設定できると、晴れてオンプレミス環境のクライアントから Google の API へと閉域接続を通って直接アクセスできるようになります。
$ curl -H "Authorization: Bearer $(gcloud auth application-default⏎ print-access-token)"⏎ https://bigquery.googleapis.com/bigquery/v2/projects
{
"kind": "bigquery#projectList",
"etag": "K6p0p0jcurt6d8tTzrNi3g==",
"projects": [
{
"kind": "bigquery#project",
"id": "project-ongcp",
"numericId": "87689973147",
"projectReference": {
"projectId": "project-ongcp"
},
"friendlyName": "project-ongcp"
}
],
"totalItems": 1
}
「Private Google Access for オンプレミスホスト」の設定は以上となります。
では、引き続き「GCP の細かすぎて伝わらないハイブリッドネットワーキング」をご笑覧ください。