1. 개요
Cloud NAT는 강력한 도구입니다. 이 도구를 사용하면 Compute Engine과 Google Kubernetes Engine (GKE) 워크로드에서 실행 중인 워크로드를 외부 IP를 사용하여 외부 액세스에 노출하지 않고도 확장 가능하고 안전한 방식으로 인터넷 리소스에 액세스할 수 있습니다.
Cloud NAT는 프록시가 없는 설계를 특징으로 하여 Andromeda SDN 레이어에서 직접 NAT를 구현합니다. 따라서 워크로드에 성능 영향이 없으며 여러 VM, 리전, VPC로 쉽게 확장됩니다.
NAT 규칙은 Cloud NAT의 확장 프로그램입니다. Cloud NAT의 NAT 규칙 기능을 사용하면 Cloud NAT를 사용해 인터넷에 연결하는 방법을 정의하는 액세스 규칙을 만들 수 있습니다. 현재 NAT 규칙은 대상 주소에 따라 소스 NAT 주소 선택을 지원합니다.
NAT 규칙이 없으면 Cloud NAT가 사용 설정된 VM은 동일한 NAT IP 주소 집합을 사용하여 모든 인터넷 주소에 연결합니다.
NAT 사용 사례에서 Cloud NAT가 특정 대상에 다른 소스 IP 주소를 사용하도록 요청하는 경우가 있습니다. NAT 규칙은 일치 및 해당 작업을 정의합니다. NAT 규칙을 지정하면 패킷이 각 NAT 규칙과 일치됩니다. 규칙이 일치하면 해당 일치에 해당하는 작업이 실행됩니다.
자세한 내용은 NAT 규칙에 대한 문서 섹션 을 검토하세요.
학습할 내용
- NAT 규칙에 대비하여 Cloud NAT 게이트웨이를 설정하는 방법입니다.
- Common Expression Language (CEL)를 사용하여 NAT 규칙을 설계하는 방법
- NAT 규칙을 만들어 NAT 게이트웨이에 연결하는 방법
- 인스턴스에서 NAT 규칙을 테스트하는 방법
- NAT 게이트웨이의 규칙을 업데이트하는 방법
- NAT 규칙을 삭제하고 기본 Cloud NAT 동작으로 되돌리는 방법
필요한 항목
- Google Compute Engine의 기본 지식
- 기본 네트워킹 및 TCP/IP 지식
- 기본 Unix/Linux 명령줄 지식
- Google Cloud의 네트워킹 실습과 같이 GCP의 네트워킹을 완료하면 도움이 됩니다.
- Cloud NAT 기본 사항에 대한 이해
2. Google Cloud 콘솔 및 Cloud Shell 사용
이 실습에서는 Google Cloud 콘솔과 Cloud Shell을 모두 사용하여 GCP와 상호작용하겠습니다.
Google Cloud Console
https://console.cloud.google.com에서 Cloud 콘솔에 액세스할 수 있습니다.
자습형 환경 설정
- Cloud 콘솔에 로그인하고 새 프로젝트를 만들거나 기존 프로젝트를 다시 사용합니다. 아직 Gmail이나 Google Workspace 계정이 없는 경우 계정을 만들어야 합니다.
- 프로젝트 이름은 이 프로젝트의 개인 식별자입니다. 이름 지정 규칙을 따르기만 하면 원하는 것을 사용할 수 있고 언제든지 업데이트할 수 있습니다.
- 프로젝트 ID는 모든 Google Cloud 프로젝트에서 고유해야 하며 변경할 수 없습니다 (한 번 설정되면 변경할 수 없음). Cloud 콘솔이 고유한 문자열을 자동으로 생성합니다. 보통은 그게 뭔지 상관하지 않습니다. 대부분의 Codelab에서는 프로젝트 ID (일반적으로
PROJECT_ID
로 식별됨)를 참조해야 하므로 마음에 들지 않는 경우 무작위로 다른 ID를 생성하거나 직접 시도해 보고 사용 가능한지 확인할 수 있습니다. 그런 다음 '고정'됩니다. 프로젝트 이름을 지정합니다
- 그런 후 Google Cloud 리소스를 사용할 수 있도록 Cloud Console에서 결제를 사용 설정해야 합니다.
이 Codelab 실행에는 많은 비용이 들지 않습니다. 이 가이드를 마친 후 비용이 결제되지 않도록 리소스 종료 방법을 알려주는 '삭제' 섹션의 안내를 따르세요. Google Cloud 신규 사용자에게는 미화$300 상당의 무료 체험판 프로그램에 참여할 수 있는 자격이 부여됩니다.
Cloud Shell 시작
Google Cloud를 노트북에서 원격으로 실행할 수 있지만, 이 Codelab에서는 Cloud에서 실행되는 명령줄 환경인 Google Cloud Shell을 사용합니다.
GCP 콘솔에서 오른쪽 상단 툴바의 Cloud Shell 아이콘을 클릭합니다.
환경을 프로비저닝하고 연결하는 데 몇 분 정도 소요됩니다. 완료되면 다음과 같이 표시됩니다.
가상 머신에는 필요한 개발 도구가 모두 들어있습니다. 영구적인 5GB 홈 디렉토리를 제공하고 Google Cloud에서 실행되므로 네트워크 성능과 인증이 크게 개선됩니다. 이 실습의 모든 작업은 브라우저만으로 수행할 수 있습니다.
3. 실습 설정
이 실습에서는 프로젝트 하나를 사용하여 각각 서브넷이 있는 두 개의 VPC를 만듭니다. 외부 IP 주소를 예약한 다음 Cloud Router를 사용한 Cloud NAT 게이트웨이, 제작자 인스턴스 2개, 소비자 인스턴스를 만들고 구성합니다. 기본 Cloud NAT 동작을 검증한 후 Cloud NAT 커스텀 규칙을 만들고 동작을 검증합니다.
네트워킹 아키텍처 개요:
4. 외부 IP 주소 예약
이 실습에서 사용할 외부 IP 주소를 모두 예약해 보겠습니다. 이렇게 하면 소비자 및 제작자 VPC 모두에 모든 관련 NAT 및 방화벽 규칙을 작성하는 데 도움이 됩니다.
Cloud Shell에서
gcloud compute addresses create nat-address-1 nat-address-2 nat-address-3 producer-address-1 producer-address-2 --region us-east4
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-1]. Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-2]. Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-3]. Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-1]. Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-2].
환경 변수로 예약된 IP 주소를 채웁니다.
export natip1=`gcloud compute addresses list --filter name:nat-address-1 --format="get(address)"` export natip2=`gcloud compute addresses list --filter name:nat-address-2 --format="get(address)"` export natip3=`gcloud compute addresses list --filter name:nat-address-3 --format="get(address)"` export producerip1=`gcloud compute addresses list --filter name:producer-address-1 --format="get(address)"` export producerip2=`gcloud compute addresses list --filter name:producer-address-2 --format="get(address)"`
출력된 내용은 없지만 주소가 제대로 채워졌는지 확인하기 위한 것입니다. 모든 환경 변수의 값을 출력해 보겠습니다.
$ env | egrep '^(nat|producer)ip[1-3]'
출력:
producerip1=<Actual Producer IP 1> producerip2=<Actual Producer IP 2> natip1=<NAT IP 1> natip2=<NAT IP 2> natip3=<NAT IP 3>
5. 프로듀서 VPC 및 인스턴스 설정
이제 프로듀서 리소스용 리소스를 만들어 보겠습니다. 제작자 VPC에서 실행 중인 인스턴스는 2개의 공개 IP인 'Producer-address-1'을 사용하여 인터넷 연결 서비스를 제공합니다. 'Producer-address-2' 에서 자세한 내용을 확인하실 수 있습니다.
먼저 VPC를 만들어 보겠습니다 Cloud Shell에서
gcloud compute networks create producer-vpc --subnet-mode custom
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/networks/producer-vpc]. NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 producer-vpc CUSTOM REGIONAL Instances on this network will not be reachable until firewall rules are created. As an example, you can allow all internal traffic between instances as well as SSH, RDP, and ICMP by running: $ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp,udp,icmp --source-ranges <IP_RANGE> $ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp:22,tcp:3389,icmp
다음으로 us-east4에 서브넷을 만들어 보겠습니다. Cloud Shell에서
gcloud compute networks subnets create producer-e4 \ --network producer-vpc --range 10.0.0.0/24 --region us-east4
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/regions/us-east4/subnetworks/producer-e4]. NAME REGION NETWORK RANGE producer-e4 us-east4 producer-vpc 10.0.0.0/24
다음으로 NAT IP 주소가 포트 8080의 제작자 인스턴스에 도달할 수 있도록 허용하는 VPC 방화벽 규칙을 만들어 보겠습니다.
첫 번째 규칙의 경우 Cloud Shell에서 다음을 실행합니다.
gcloud compute firewall-rules create producer-allow-8080 \ --network producer-vpc --allow tcp:8080 \ --source-ranges $natip1,$natip2,$natip3
출력:
Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/firewalls/producer-allow-8080]. Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED producer-allow-8080 producer-vpc INGRESS 1000 tcp:8080 False
다음 단계는 두 개의 프로듀서 인스턴스를 만드는 것입니다.
제작자 인스턴스는 Docker Hub에서 사용할 수 있는 Docker 컨테이너에서 IP 에코 서비스를 실행합니다 (소스 코드는 서비스 작성자의 GitHub 저장소에서 확인할 수 있음).
인스턴스에 필요한 모든 소프트웨어를 신속하게 프로비저닝하기 위해 Compute Engine에서 컨테이너 배포 기능을 사용합니다.
NAT 규칙을 작성할 수 있도록 각 인스턴스에 다른 예약된 IP 주소를 프로비저닝합니다.
첫 번째 인스턴스를 만듭니다. Cloud Shell에서
gcloud compute instances create-with-container producer-instance-1 \ --zone=us-east4-a --machine-type=e2-medium \ --network-interface=address=producer-address-1,network-tier=PREMIUM,subnet=producer-e4 \ --container-image=mpolden/echoip --container-restart-policy=always
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/zones/us-east4-a/instances/producer-instance-1]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS producer-instance-1 us-east4-a e2-medium 10.0.0.2 <producer IP 1> RUNNING
그런 다음 두 번째 인스턴스를 만듭니다. Cloud Shell에서
gcloud compute instances create-with-container producer-instance-2 \ --zone=us-east4-a --machine-type=e2-medium \ --network-interface=address=producer-address-2,network-tier=PREMIUM,subnet=producer-e4 \ --container-image=mpolden/echoip --container-restart-policy=always
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/zones/us-east4-a/instances/producer-instance-2]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS producer-instance-2 us-east4-a e2-medium 10.0.0.3 <producer IP 2> RUNNING
6. 소비자 VPC, Cloud NAT, 인스턴스 설정
프로듀서 서비스를 만들었으므로 이제 소비자 VPC 및 Cloud NAT 게이트웨이를 만들 차례입니다.
VPC와 서브넷을 만든 후에는 TCP 소스 IP 범위에 대해 IAP를 허용하는 간단한 인그레스 방화벽 규칙을 추가합니다. 이렇게 하면 gcloud를 사용하여 소비자 인스턴스에 직접 SSH로 연결할 수 있습니다.
그런 다음 수동 할당 모드에서 간단한 Cloud NAT 게이트웨이를 만들고 예약된 주소인 'nat-address-1'을 만듭니다. 관련이 있습니다. Codelab의 이후 부분에서는 커스텀 규칙을 추가하도록 게이트웨이의 구성을 업데이트합니다. .
먼저 VPC를 만들어 보겠습니다 Cloud Shell에서
gcloud compute networks create consumer-vpc --subnet-mode custom
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/networks/consumer-vpc]. NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 consumer-vpc CUSTOM REGIONAL Instances on this network will not be reachable until firewall rules are created. As an example, you can allow all internal traffic between instances as well as SSH, RDP, and ICMP by running: $ gcloud compute firewall-rules create <FIREWALL_NAME> --network consumer-vpc --allow tcp,udp,icmp --source-ranges <IP_RANGE> $ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp:22,tcp:3389,icmp
다음으로 us-east4에 서브넷을 만들어 보겠습니다. Cloud Shell에서
gcloud compute networks subnets create consumer-e4 \ --network consumer-vpc --range 10.0.0.0/24 --region us-east4
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/regions/us-east4/subnetworks/consumer-e4]. NAME REGION NETWORK RANGE consumer-e4 us-east4 consumer-vpc 10.0.0.0/24
다음으로 IAP 범위 주소가 포트 22의 소비자 인스턴스에 도달할 수 있도록 허용하는 VPC 방화벽 규칙을 만들어 보겠습니다.
첫 번째 방화벽 규칙의 경우 Cloud Shell에서 다음을 실행합니다.
gcloud compute firewall-rules create consumer-allow-iap \ --network consumer-vpc --allow tcp:22 \ --source-ranges 35.235.240.0/20
출력:
Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/firewalls/consumer-allow-iap]. Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED consumer-allow-iap consumer-vpc INGRESS 1000 tcp:22 False
NAT 게이트웨이를 만들기 전에 먼저 Cloud Router 인스턴스를 만들어야 합니다 (비공개 ASN 번호를 사용하지만 이 실습의 활동과는 관련이 없음). Cloud Shell에서
gcloud compute routers create consumer-cr \ --region=us-east4 --network=consumer-vpc \ --asn=65501
출력:
Creating router [consumer-cr]...done. NAME REGION NETWORK consumer-cr us-east4 consumer-vpc
그런 다음 NAT 게이트웨이 인스턴스를 만듭니다. Cloud Shell에서
gcloud compute routers nats create consumer-nat-gw \ --router=consumer-cr \ --router-region=us-east4 \ --nat-all-subnet-ip-ranges \ --nat-external-ip-pool=nat-address-1
출력:
Creating NAT [consumer-nat-gw] in router [consumer-cr]...done.
소비자 테스트 인스턴스를 만듭니다. 나중에 인스턴스 내에서 참조할 수 있도록 예약된 제작자 IP를 여기에 채웁니다. Cloud Shell에서
gcloud compute instances create consumer-instance --zone=us-east4-a \ --machine-type=e2-medium --network-interface=subnet=consumer-e4,no-address \ --metadata=producer-service-ip1=$producerip1,producer-service-ip2=$producerip2
출력:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/zones/us-east4-a/instances/consumer-instance]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS consumer-instance us-east4-a e2-medium 10.0.0.2 RUNNING
7. 기본 Cloud NAT 동작 확인
이 시점에서 소비자 인스턴스는 동일한 예약된 IP 'nat-address-1'을 사용하는 기본 Cloud NAT 동작을 사용합니다. 통신할 수 있습니다
Cloud NAT에서 새로운 NAT 규칙 기능을 사용하기 전에 먼저 이 동작을 검증해 보겠습니다.
SSH를 통해 소비자 인스턴스에 연결합니다. Cloud Shell에서
gcloud compute ssh consumer-instance --zone=us-east4-a
이제 인스턴스 셸로 이동하게 됩니다.
샘플 출력 (간결성을 위해 전체 출력은 잘림)
No zone specified. Using zone [us-east4-a] for instance: [consumer-instance]. External IP address was not found; defaulting to using IAP tunneling. ... ... <username>@consumer-instance:~$
먼저 소비자 인스턴스 내에서 두 제작자 IP를 모두 가져와 환경 변수로 채웁니다.
export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"` export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`
그런 다음 프로듀서 인스턴스 모두에 대해 curl을 수행하고 반환된 소스 IP 주소를 관찰합니다.
<username>@consumer-instance:~$ curl http://$producerip1:8080 34.136.8.83 <username>@consumer-instance:~$ curl http://$producerip2:8080 34.136.8.83
두 엔드포인트 모두에 동일한 IP 주소가 반환되어야 하며, 이는 외부 예약된 IP 'nat-address-1'의 값과 같습니다.
마찬가지로 외부 IP 리플렉터 서비스에 대한 curl은 동일한 IP를 표시해야 합니다. 예를 들면 다음과 같습니다.
<username>@consumer-instance:~$ curl http://ifconfig.co 34.136.8.83 <username>@consumer-instance:~$ curl http://ifconfig.me 34.136.8.83 <username>@consumer-instance:~$ curl http://ip.fyr.io 34.136.8.83
인스턴스의 SSH 세션을 종료하고 NAT 규칙을 구성한 후 다시 SSH로 연결합니다.
8. Cloud NAT 규칙 만들기
NAT 규칙은 Common Expression Language 구문을 사용하여 작성됩니다. 규칙 표현식 언어에 대한 자세한 내용은 규칙 표현식 언어를 참조하세요.
gcloud 명령어를 사용하여 기존 NAT 게이트웨이에 NAT 규칙을 추가할 수도 있습니다. Cloud NAT 규칙을 만들기 위한 두 가지 옵션을 모두 살펴보겠습니다.
먼저 NAT 규칙 YAML 파일을 만들어 보겠습니다.
Cloud Shell에서
export projectid=`gcloud config get-value project` cat <<EOF >natrulesfile.txt rules: - ruleNumber: 100 match: destination.ip == '$producerip2' action: sourceNatActiveIps: - /projects/$projectid/regions/us-east4/addresses/nat-address-2 EOF
그런 다음 이 규칙 파일을 사용하여 기존 NAT 게이트웨이를 업데이트하겠습니다. Cloud Shell에서
gcloud alpha compute routers nats update consumer-nat-gw \ --router=consumer-cr \ --rules=natrulesfile.txt \ --router-region=us-east4
다음과 같은 출력이 표시됩니다.
Updating nat [consumer-nat-gw] in router [consumer-cr]...done.
규칙이 성공적으로 구성되었는지 확인합니다. Cloud Shell에서
gcloud alpha compute routers nats rules list \ --nat=consumer-nat-gw --router=consumer-cr \ --router-region=us-east4
다음과 같은 출력이 표시됩니다.
RULE_NUMBER MATCH 100 destination.ip == '35.192.142.134'
gcloud 명령어만 사용하여 동일한 규칙을 다시 만들어 보겠습니다. 먼저 기존 규칙을 삭제합니다. Cloud Shell에서
gcloud alpha compute routers nats rules delete 100 \ --nat=consumer-nat-gw --router=consumer-cr \ --router-region=us-east4 --quiet
다음과 같은 출력이 표시됩니다.
Updated [https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/routers/consumer-cr]
그런 다음 이 gcloud 명령어를 사용하여 규칙을 다시 만듭니다. Cloud Shell에서
gcloud alpha compute routers nats rules create 100 \ --match='destination.ip == "'$producerip2'"' \ --source-nat-active-ips=nat-address-2 --nat=consumer-nat-gw \ --router=consumer-cr --router-region=us-east4
다음과 같은 출력이 표시됩니다.
Creating Rule [100] in NAT [consumer-nat-gw]...done.
규칙이 성공적으로 생성되었는지 확인하기 위해 이전 명령어를 반복합니다. 이번에는 YAML 형식 지정 스위치를 추가하여 규칙의 전체 세부정보를 확인하겠습니다.
Cloud Shell에서
gcloud alpha compute routers nats rules list\ --nat=consumer-nat-gw --router=consumer-cr \ --router-region=us-east4 --format=yaml
다음과 같은 출력이 표시됩니다.
--- action: sourceNatActiveIps: - https://www.googleapis.com/compute/alpha/projects/<Project-ID>/regions/us-east4/addresses/nat-address-2 match: destination.ip == <actual IP for producer-IP 2> ruleNumber: 100
마지막으로, 'nat-address1'이 'nat-address-2' 외부 주소는 'IN_USE'로 표시됩니다. 이를 확인하려면 Cloud Shell에서 다음 명령어를 실행하세요.
$ gcloud compute addresses list
다음과 같은 출력이 표시됩니다 (실제 IP 주소는 예약한 주소와 일치해야 함).
NAME ADDRESS/RANGE TYPE PURPOSE NETWORK REGION SUBNET STATUS nat-address-1 34.136.8.83 EXTERNAL us-east4 IN_USE nat-address-2 34.70.137.35 EXTERNAL us-east4 IN_USE nat-address-3 34.135.103.88 EXTERNAL us-east4 RESERVED producer-address-1 34.66.0.105 EXTERNAL us-east4 IN_USE producer-address-2 35.192.142.134 EXTERNAL us-east4 IN_USE
9. Cloud NAT 규칙 동작 확인
이제 소비자 인스턴스는 생성된 Cloud NAT 규칙을 사용해 nat-address-2를 사용하여 Producer-address-2와 통신해야 합니다.
이 동작을 확인해 보겠습니다. SSH를 통해 소비자 인스턴스에 연결합니다. Cloud Shell에서
gcloud compute ssh consumer-instance --zone=us-east4-a
이제 인스턴스 셸로 이동하게 됩니다.
샘플 출력 (간결성을 위해 전체 출력은 잘림)
No zone specified. Using zone [us-east4-a] for instance: [consumer-instance]. External IP address was not found; defaulting to using IAP tunneling. ... ... <username>@consumer-instance:~$
먼저 소비자 인스턴스 내에서 두 제작자 IP를 모두 가져와 환경 변수로 채웁니다.
export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"` export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`
그런 다음 프로듀서 인스턴스 모두에 대해 curl을 수행하고 반환된 소스 IP 주소를 관찰합니다.
<username>@consumer-instance:~$ curl http://$producerip1:8080 34.136.8.83 <username>@consumer-instance:~$ curl http://$producerip2:8080 34.70.137.35
이제 두 엔드포인트에 서로 다른 IP 주소가 반환되는 것을 확인할 수 있습니다. 첫 번째 IP 주소는 기본 동작과 동일해야 합니다. 두 번째 IP 주소는 'nat-address-2'와 같아야 합니다. 새 NAT 규칙이 추가된 후 말입니다.
외부 IP 리플렉터 서비스에 대한 curl에는 여전히 기본 동작과 동일한 IP가 표시됩니다. 예를 들면 다음과 같습니다.
<username>@consumer-instance:~$ curl http://ifconfig.co 34.136.8.83 <username>@consumer-instance:~$ curl http://ifconfig.me 34.136.8.83 <username>@consumer-instance:~$ curl http://ip.fyr.io 34.136.8.83
인스턴스의 SSH 세션을 종료한 다음 SSH를 통해 테스트 주소 드레이닝을 다시 시작합니다.
10. 업데이트(&G) Cloud NAT 규칙 삭제
기존 Cloud NAT 규칙을 업데이트할 수 있습니다. 예를 들어 새 IP 주소를 연결하고 기존 규칙과 연결된 기존 IP 주소를 드레이닝할 수 있습니다.
NAT Rules 파일을 다음과 같이 업데이트해 보겠습니다.
Cloud Shell에서
export projectid=`gcloud config get-value project` cat <<EOF >natrulesfile.txt rules: - ruleNumber: 100 match: destination.ip == '$producerip2' action: sourceNatDrainIps: - /projects/$projectid/regions/us-east4/addresses/nat-address-2 sourceNatActiveIps: - /projects/$projectid/regions/us-east4/addresses/nat-address-3 EOF
이 새 파일의 역할은 이제 'nat-address-2'에 배치됩니다. 방전된 상태로 남아 있을 수 있습니다 그런 다음 'nat-address-3'을 추가합니다. 활성 상태가 됩니다 이렇게 하면 nat-address-2를 사용하는 기존 연결은 정상적으로 종료되고 nat-address-3만 사용하여 새 연결을 생성할 수 있습니다.
그런 다음 이 규칙 파일을 사용하여 기존 NAT 게이트웨이를 업데이트하겠습니다. Cloud Shell에서
gcloud alpha compute routers nats update consumer-nat-gw \ --router=consumer-cr \ --rules=natrulesfile.txt \ --router-region=us-east4
다음과 같은 출력이 표시됩니다.
Updating nat [consumer-nat-gw] in router [consumer-cr]...done.
규칙이 성공적으로 구성되었는지 확인합니다. Cloud Shell에서
gcloud alpha compute routers nats rules list \ --nat=consumer-nat-gw --router=consumer-cr \ --router-region=us-east4 --format=yaml
다음과 같은 출력이 표시됩니다.
--- action: sourceNatActiveIps: - https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-3 sourceNatDrainIps: - https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-2 match: destination.ip == '35.192.142.134' ruleNumber: 100
'nat-address-2'가 이제 드레이닝 상태가 됩니다 이제 소비자 VPC의 새 연결이 올바른 NAT IP를 사용하는지 검증하는 것은 연습입니다.
마지막으로 Cloud NAT 게이트웨이에서 NAT 규칙을 삭제하고 기본 동작으로 되돌립니다. 다음 gcloud 명령어를 사용할 수 있습니다. Cloud Shell에서
gcloud alpha compute routers nats rules delete 100 \ --nat=consumer-nat-gw --router=consumer-cr \ --router-region=us-east4 --quiet
다음과 같은 출력이 표시됩니다.
Updated [https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/routers/consumer-cr]
더 이상 NAT 규칙이 없는지 확인하기 위해 NAT Gateway describe 명령어를 사용해 보겠습니다.
gcloud alpha compute routers nats describe consumer-nat-gw \ --router=consumer-cr --router-region=us-east4
다음과 같은 출력이 표시됩니다.
enableEndpointIndependentMapping: false name: consumer-nat-gw natIpAllocateOption: MANUAL_ONLY natIps: - https://www.googleapis.com/compute/alpha/projects/ghaleb-s2/regions/us-east4/addresses/nat-address-1 sourceSubnetworkIpRangesToNat: ALL_SUBNETWORKS_ALL_IP_RANGES
'rules:'는 섹션을 참조하세요 구성된 NAT 규칙이 없음을 나타냅니다.
11. 정리 단계
반복 청구를 방지하려면 이 Codelab과 연결된 모든 리소스를 삭제해야 합니다.
먼저 모든 인스턴스를 삭제합니다.
Cloud Shell에서
gcloud compute instances delete consumer-instance \ producer-instance-1 producer-instance-2 \ --zone us-east4-a --quiet
예상 출력 :
Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/consumer-instance]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/producer-instance-1]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/producer-instance-2].
다음으로 Cloud Router를 삭제합니다. Cloud Shell에서
gcloud compute routers delete consumer-cr \ --region us-east4 --quiet
다음과 같은 출력이 표시됩니다.
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/routers/consumer-cr].
모든 외부 IP 주소를 해제합니다. Cloud Shell에서
gcloud compute addresses delete nat-address-1 \ nat-address-2 nat-address-3 producer-address-1 \ producer-address-2 --region us-east4 --quiet
다음과 같은 출력이 표시됩니다.
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-1]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-2]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-3]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-1]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-2].
VPC 방화벽 규칙을 삭제합니다. Cloud Shell에서
gcloud compute firewall-rules delete consumer-allow-iap \ producer-allow-8080 --quiet
다음과 같은 출력이 표시됩니다.
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/consumer-allow-iap]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/producer-allow-8080].
서브넷을 삭제합니다. Cloud Shell에서
gcloud compute networks subnets delete consumer-e4 \ producer-e4 --region=us-east4 --quiet
다음과 같은 출력이 표시됩니다.
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/consumer-e4]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/producer-e4].
마지막으로 VPC를 삭제하겠습니다. Cloud Shell에서
gcloud compute networks delete consumer-vpc \ producer-vpc --quiet
다음과 같은 출력이 표시됩니다.
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/consumer-vpc]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/producer-vpc].
12. 축하합니다.
Cloud NAT 규칙 실습을 완료했습니다.
학습한 내용
- NAT 규칙에 대비하여 Cloud NAT 게이트웨이를 설정하는 방법입니다.
- Common Expression Language (CEL)를 사용하여 NAT 규칙을 설계하는 방법
- NAT 규칙을 만들어 NAT 게이트웨이에 연결하는 방법
- 인스턴스에서 NAT 규칙을 테스트하는 방법
- NAT 게이트웨이의 규칙을 업데이트하는 방법
- NAT 규칙을 삭제하고 기본 Cloud NAT 동작으로 되돌리는 방법
다음 단계
- 이 예와 같이 더 복잡한 NAT 규칙을 만들어 실험합니다.
- NAT IP 주소 드레이닝을 살펴보고 연결 영향을 관찰합니다.
- Google Cloud Platform의 네트워킹 자세히 알아보기
©Google, Inc. or its affiliates. All rights reserved. 배포 금지.