Google Cloud Platform IT

グローバルIPアドレスとプライベートIPアドレスの変換について

2022年5月28日

gcp
GCPやAWSなどクラウドで簡単にサーバなどが立てられるようになった反面、ネットワークの整備であったりが重要になってきました。
 

簡単にGCPではGUIでもポチポチ5分以内にはVPCが構築できてしまったりと、ネットワークエンジニアやインフラエンジニアでないとできなかった分野がより便利になった反面、
逆に簡単に構築できたとしても設定ミスであったり、うまくIPアドレスの変換だったりができず通信できないなどのことも発生しやすくなります。
誰でも手軽にネットワークを構築できるようになったからこそ、一回初心に戻ってネットワークについて考えてみたいと思います。
 

ここではそんなIPアドレスの変換であるNATやNAPTについて説明しつつ、GCP上のネットワークではどう構築するのかについて説明していこうと思います。

自宅wifiや社内wifiからインターネットへアクセスする場合

NAT

プライベートIPアドレスからインターネットに接続する場合は、グローバルIPアドレスに変換されます。
これをNAT(Network Address Transport)という。まさにアドレスを変換する。
 

通常グローバルIPアドレスは1つしか存在しないため、ネットにアクセスするときに1つのグローバルIPアドレスは1つのデバイスでしかアクセスできません。
 

 

でも実際、1つのルータには複数のデバイスが接続されていることがほとんどです。
しかし同時にインターネットにアクセスすると同じグローバルIPアドレスのものが複数存在するということになります。
それを解消するために、次のNAPTというものがあります。
 

NAPT(IPマスカレード)

NAPT(Network Address Port Transport)、つまりアドレス、ポートで変換するということ。
しかし自宅wifiでは複数のプライベートIPアドレスとなり、そうなった場合インターネットにアクセスするとグローバルIPアドレスはどれも同じになります。
そうなると、インターネット上で同じグローバルIPアドレスが複数存在してアクセスすることになってしまい、おかしくなります。
以下のような形です。
 


 

なので、プライベートIPアドレス:グローバルIPアドレス = 多:1になってしまうので、
グローバルIPアドレス1つに対して、複数のプライベートIPアドレスが紐づいて、どのデバイスからのアクセスかわからないため、
ポート番号をつけることで、フラグづけをして、グローバルにアクセスします。

 

例えば、PCにはポート100を自動的に付与して、スマホにはポート101を自動的に付与します。
そうすると、NAPTで変換するときに、以下のように紐付けが行われます。

プライベートIPアドレス グローバルIPアドレス:ポート
192.168.1.1 221.242.76.11:101
192.168.1.2 221.242.76.11:111

 

HTTP通信をするとき、HTTPリクエストヘッダには送信元IPアドレスがPCやスマホからリクエストするときに付与されます。
そしてルータで上記のようなNAPT変換をすると、
グローバルにアクセスするとき、HTTPリクエストヘッダの送信元IPアドレスはグローバルIPアドレス:ポート番号へ変換されます。
 

そして、Webサーバへリクエストがいくので、レスポンスをするとき、送信元IPアドレスが上記のグローバルIPアドレス:ポートがあるので、そこにレスポンスします。
そうするとルータに届いて、ルータで再度NAPTで変換してプライベートIPアドレスに転送されるという仕組みです。
 

以下のURLにアクセスするとグローバルIPアドレスとポート番号を確認することができます。
https://www.cman.jp/network/support/go_access.cgi


 

具体例

デバイスBは自宅wifiに繋がってるので、プライベートIPアドレスが付与され、192.168.1.2です。
そしてWebサーバにデバイスBからリクエストをしたとします。そうすると通信パケットがルータに向かい、ルータでNAPT変換が行われ、プライベートIPアドレスからグローバルIPアドレスに変換されます。
グローバルIPアドレスとポートは、221.242.76.11:111に変換されて、インターネット上をパケットが駆け巡り、Webサーバに到達して処理が行われます。
 

そして、Webサーバからレスポンスをします。WebサーバからすればグローバルIPアドレスとポート番号がわかるので、送り先のルータであったり、デバイスBがどこにあるかわかります。
なので、そこにレスポンスを返すようにします。
ルータで今度はグローバルIPアドレスとポート番号から、プライベートIPアドレスに変換されて、デバイスBにレスポンスされるという仕組みです。
 


 

グローバルから自宅wifiにアクセスする場合

これは別のネットワークから、別のネットワークへアクセスする場合かな?

その場合、上記のようにNAPT変換表的なものは存在していない。
別のネットワークのwebサーバへアクセスするとなると、当然社内サーバ(VPC)なのでそのアドレスはプライベートIPアドレスになります。
なのでその社内サーバのあるルータへアクセスできても、社内サーバのプライベートIPアドレスがわからないと、アクセスできない。
なのでこちらで自分で変換表を作成する必要があります。
 

これを静的NAPT(静的IPマスカレード)と言います。ポートフォワーディングとも言います。
静的なので静か、つまり手動で固定変換表ということです。
 

そうするとまず社内のWebサーバに置くことでプライベートIPアドレスが発行されます。(これを固定します。毎回変わってしまうので固定にする必要があります。)
そして、ルータのNAPTには、以下を指定します。
ルータのグローバルIPアドレス : port | プライベートIPアドレス
10.2.2.2:80 | 192.168.2.10(固定)
 

そして、グローバルIPアドレスが、10.2.2.2でポート番号を80にアクセスしたら、NAPTで192.168.2.10に転送するように変換表を作成します。
こうすることで、ルータにポート80でアクセスすると、192.168.2.10に転送、つまり社内のWebサーバにアクセスということになります。
 

https://www.buffalo.jp/support/faq/detail/183.html
 

同じネットワーク内からWebサーバへアクセスする場合

同一ルータにつながっている同じネットワーク内の別デバイスから、Webサーバにアクセスすることを考えます。
 

ルータを出てインターネットにあるWebサーバにアクセスするのではなく、同じルータのネットワーク内のWebサーバにアクセスするので、
プライベートIPアドレスでアクセスすることになります。
 

 

GCP内でVPCを立てて、その中に複数のコンピューティングを設定することがあるかと思います。
例えば、ComposerなどでCompute Engineなどインスタンスを最低3つ立てる必要があったりしますし、Composer v2ではKubernetesのオーケストレーションでオートスケーリングなどして、負荷の重い処理の場合はインスタンスを増やして処理などをしたりします。
しかしこれらをVPCの中にたてて、何か例えばIP制限がかかっているアプリケーションへAPIで処理をするなどをする場合、VPC内のサーバからそのIP制限がかかっているところへリクエストをかけるには以下のようなことを考えないといけません。
 

  • VPC内なので各インスタンスはプライベートIPアドレス
  • リクエスト先は外部なのでグローバルIPアドレス

そのため、まずこのVPCから外部へ出るためにはネットワークが変わるためルータが必要でGCPではCloud Routerになる。
さらにルータだけではダメで、IPアドレス変換が必要なので、Cloud NATの設定も必要になります。
 

ここでVPCを立てる必要としては、あえて変換のグローバルIPアドレスを1つにするためです。
 

以下のように、例えVPC内でGCEなどをオートスケーリングしたとしても、外部にリクエストが出るときに1つのグローバルIPアドレスに変換されるので、どんなにオートスケーリングしても外部サービスでその変換後のグローバルIPアドレスを指定しておけば、全てのGCEのリクエストを受けることが可能になる。
ただ、グローバルIPアドレスも固定にします。

 
※ ただこの場合Cloud RouterとCloud NATでネットワーキング料金(データ転送量など)で結構な金額が取られるので注意。

 
ではVPCにGCEを置かない場合、Cloud RouterやNATなど変換の必要がない。
すでに外部にGCEがあるのでグローバルIPアドレス変換の必要はなく、各GCEに付与されているからです。
しかしこの場合でGCEのオートスケーリングをすると、各GCEごとに固有のグローバルIPアドレスが付与されるので、外部サービスへリクエストするとき、IPアクセス制限ができなくなってしまうことが難点です。
オートスケーリングでいくつものグローバルIPアドレスが発行されてしまうということと、
GCEが建てられる、そして起動されるたびにグローバルIPアドレスが変わってしまうので、アクセス制限の設定は無理になります。

▼ お問合せはこちら

-Google Cloud Platform, IT

© 2022 Yosshi Blog Powered by AFFINGER5