Skip to content
This repository has been archived by the owner on Apr 5, 2022. It is now read-only.

AWS でいう VPC を作り、その中に private subnet を作成する #132

Closed
a-know opened this issue Apr 1, 2016 · 19 comments
Closed

Comments

@a-know
Copy link
Owner

a-know commented Apr 1, 2016

@a-know
Copy link
Owner Author

a-know commented Apr 1, 2016

情報収集。

  • AWS でいう VPC の作成は、ネットワーク>ネットワークの作成、から。
    • 2016-04-01 9 17 18
  • 以前は、「ネットワーク=1サブネット」で、いちネットワーク内に複数のサブネットを持つようなことはできなかったっぽい。
  • 今は、新規ネットワーク作成時にサブネットワークの指定も可能に。
    • ネットワーク作成後にサブネットワークの管理をすることも可能
  • が、サブネットワークの作成ができるようになる以前に作成されたネットワークについては、サブネットワークの管理はできないもよう。

こちら http://naked123.hatenablog.com/entry/2015/12/21/142411 などを参考。

@a-know
Copy link
Owner Author

a-know commented Apr 1, 2016

ネットワークとサブネットワークを↓こんなかんじで作ってみる。

2016-04-01 9 27 43

gcloud compute --project "a-know-home" networks create "a-know-dogyard" --description "dog-yard for dog-fooding" --mode "custom"

gcloud compute --project "a-know-home" networks subnets create "public" --network "a-know-dogyard" --region "asia-east1" --range "10.0.100.0/24"

gcloud compute --project "a-know-home" networks subnets create "private" --network "a-know-dogyard" --region "asia-east1" --range "10.0.101.0/24"

@a-know
Copy link
Owner Author

a-know commented Apr 1, 2016

できた。

2016-04-01 9 30 51

@a-know
Copy link
Owner Author

a-know commented Apr 1, 2016

AWS でいうルートテーブル、GCP だとサブネットごとに自動で作られるっぽいので、ひとまずはそれを使っていく方向で。

2016-04-01 9 35 55

@a-know
Copy link
Owner Author

a-know commented Apr 1, 2016

2つサブネットを作って、それぞれに「public」「private」という名前を付けてはいるけど、実質的にはどちらもまだ同じ設定。
後者を本当に private な状態にしていくために、こちら http://d.hatena.ne.jp/graySpace/20140926/1411709472 を参考に続きをやっていく。

@a-know
Copy link
Owner Author

a-know commented Apr 1, 2016

プライベートサブネットについて、引用。

パブリックサブネットとプライベートサブネットの違いは何かと言うと、ルートテーブルの設定の違い。

パブリックサブネットの場合だと、destination「0.0.0.0/0」に対するターゲットをインターネットゲートウェイにしているが、プライベートサブネットの場合はそれがない。つまり自身のネットワークに対するルーティングの設定を行うということだ。

@a-know
Copy link
Owner Author

a-know commented Apr 1, 2016

いろいろ見てみたけど、AWS ではサブネットごとにルートテーブルを指定できるのに対し、GCP ではネットワーク毎、な気がしてきた。
なので、「a-know-dogyard というネットワーク内で、public / private なサブネットを作成する」のではなく、
「public なサブネットを持つ a-know-dogyard-public ネットワークと、private なサブネットを持つ a-know-dogyard-private の2つのネットワークを作成する」のが良さそうな気がしてきた。

一度、さっき作ったネットワークを破棄する。

@a-know
Copy link
Owner Author

a-know commented Apr 1, 2016

上記の方針で2つのネットワーク(とサブネットもそれぞれにひとつずつ)を作成してみた。

2016-04-01 21 03 07

2016-04-01 21 02 20

@a-know
Copy link
Owner Author

a-know commented Apr 1, 2016

次はルートテーブル。まずは public の方。

public / private 関係なくアクセスできる必要があるので、

  • 送信先:10.0.0.0/16、ネクストホップ:仮想ネットワーク
  • 送信先:0.0.0.0/0、ネクストホップ:デフォルト インターネット ゲートウェイ

にしたい。

で、 送信先:10.0.0.0/16、ネクストホップ:仮想ネットワーク というようなルートは新規作成できないっぽい。
ここでの予想が、

  • 同一プロジェクト内 ≒ AWS でいうところの VPC ?
  • 同一プロジェクト内であれば、その内部の通信用のルートテーブルは不要?( 送信先:10.0.0.0/16、ネクストホップ:仮想ネットワーク 相当?)

だとすると、public の方のルートテーブルには何もしなくてよさそう。

@a-know
Copy link
Owner Author

a-know commented Apr 1, 2016

続いて private の方のルートテーブル。

こちらは destination 0.0.0.0/0 の通信はダイレクトにはさせないので、そのルートテーブルを削除だけする。

2016-04-01 21 23 52

↑この状態に。

@a-know
Copy link
Owner Author

a-know commented Apr 1, 2016

続いて、それぞれのネットワークにひとつずつ、インスタンスを立ててみる。
その後、下記を試す。

  • public な方のインスタンスに ssh できるか。(要・tcp:22 許可)
  • public な方のインスタンスから private な方のインスタンスに ping が通るか。
  • public な方のインスタンスからインターネットへの通信ができるか。(要・ICMP許可)
  • private な方のインスタンスからインターネットへの通信ができないか。

@a-know
Copy link
Owner Author

a-know commented Apr 1, 2016

うーん、しょっぱなからダメっぽい。やっぱり考え方が間違ってるかも。

AWS と GCP の比較のやつ https://cloud.google.com/docs/google-cloud-platform-for-aws-professionals を読み解くか。。

@a-know
Copy link
Owner Author

a-know commented Apr 1, 2016

To create an instance in Google Compute Engine, you need a network. In Google Cloud Platform, we create a default network for you automatically, and you can create more as needed. These networks are private, much like Elastic Compute Cloud-VPC, and allow you to define firewall rules, routing, and Virtual Private Networks (VPNs). だから、本丸のインスタンスにグローバルな IP を与えなければいいだけ、なのかな。。

@a-know
Copy link
Owner Author

a-know commented Apr 2, 2016

構築したいなと思ってるネットワークの体系って、Google でいう Legacy Network なのかも?
だとするとここらへんが参考になる?

@a-know
Copy link
Owner Author

a-know commented Apr 2, 2016

まずは https://cloud.google.com/compute/docs/networking#natgateway これに従って、下記のようなコマンドを順番に発行し、ネットワーク・インスタンスを構築した。

$ gcloud compute networks create gce-network --range 10.240.0.0/16
$ gcloud compute firewall-rules create gce-network-allow-ssh --allow tcp:22 --network gce-network
$ gcloud compute firewall-rules create gce-network-allow-internal --allow tcp:1-65535;udp:1-65535;icmp \
         --source-ranges 10.240.0.0/16 --network gce-network
$ gcloud compute instances create nat-gateway --network gce-network --can-ip-forward \
         --zone asia-east1-b \
         --image centos-7 \
         --tags nat
$ gcloud compute instances create example-instance --network gce-network --no-address \
         --zone asia-east1-b --image centos-7 --tags no-ip
$ gcloud compute routes create no-ip-internet-route --network gce-network \
         --destination-range 0.0.0.0/0 \
         --next-hop-instance nat-gateway \
         --next-hop-instance-zone asia-east1-b \
         --tags no-ip --priority 800

腑に落ちないまま作成したので、これでなんで欲するものができるのか整理する。
tcp:1-65535;udp:1-65535;icmp のところはドキュメントではカンマ区切りになっていたがこれは間違い)

@a-know
Copy link
Owner Author

a-know commented Apr 2, 2016

priority は小さいほうがより優先される。
https://cloud.google.com/compute/docs/reference/latest/routes

@a-know
Copy link
Owner Author

a-know commented Apr 3, 2016

腑に落ちないまま作成したので、これでなんで欲するものができるのか整理する。

わかってきたかも。
本当に必要な NW を作るのと、わかってきたことを整理して表に出す。

@a-know
Copy link
Owner Author

a-know commented Apr 3, 2016

本当に必要な NW を作る

$ gcloud compute --project "a-know-home" networks create "a-know-home-network" --mode "custom"
$ gcloud compute --project "a-know-home" networks subnets create "home-subnet" --network "a-know-home-network" --region "asia-east1" --range "10.240.0.0/16"
$ gcloud compute firewall-rules create allow-ssh --allow tcp:22 --network a-know-home-network
$ gcloud compute firewall-rules create allow-internal --allow tcp:1-65535;udp:1-65535;icmp --source-ranges 10.240.0.0/16 --network a-know-home-network
$ gcloud compute --project "a-know-home" instances create "nat-gateway" --zone "asia-east1-a" --machine-type "f1-micro" --subnet "home-subnet" --metadata "ssh-keys=xxx" --can-ip-forward --maintenance-policy "MIGRATE" --image "/centos-cloud/centos-7-v20160329" --boot-disk-size "10" --boot-disk-type "pd-standard" --boot-disk-device-name "nat-gateway" --no-scopes
$ gcloud compute --project "a-know-home" instances create "web" --zone "asia-east1-a" --machine-type "f1-micro" --subnet "home-subnet" --no-address --metadata "ssh-keys=xxx" --maintenance-policy "MIGRATE" --tags "no-ip" --image "/centos-cloud/centos-7-v20160329" --boot-disk-size "10" --boot-disk-type "pd-standard" --boot-disk-device-name "web" --no-scopes
$ gcloud compute routes create no-ip-internet-route --network a-know-home-network \
         --destination-range 0.0.0.0/0 \
         --next-hop-instance nat-gateway \
         --next-hop-instance-zone asia-east1-a \
         --tags no-ip --priority 800
a-know@nat-gateway:~$ sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
a-know@nat-gateway:~$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

↑のコマンドの一部は、Web コンソールから生成されたものであるのにも関わらずそのままでは実行できないものがあるので注意。

@a-know
Copy link
Owner Author

a-know commented Apr 17, 2016

別リポジトリ https://github.com/a-know/a-know-home-network を作成し、この issue までは実施した。
以降、上記リポジトリでやっていく。

@a-know a-know closed this as completed Apr 17, 2016
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant