반응형
Google Cloud Compute Engine 내에서 외부 IP를 알려면 어떻게 해야 할까?
다음과 같이 한다고 알 수 있는 것은 VM 내부 IP 뿐이다.
[jerryj@jerrydev tmp]$ ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 0.0.0.0
        inet6 fe80::42:17ff:febe:3c2f  prefixlen 64  scopeid 0x20<link>
        ether 02:42:17:be:3c:2f  txqueuelen 0  (Ethernet)
        RX packets 2051  bytes 113494 (110.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2033  bytes 15436457 (14.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1460
        inet 10.183.0.2  netmask 255.255.255.255  broadcast 10.183.0.2
        inet6 fe80::4001:aff:feb7:2  prefixlen 64  scopeid 0x20<link>
        ether 42:01:0a:b7:00:02  txqueuelen 1000  (Ethernet)
        RX packets 7848752  bytes 46045286889 (42.8 GiB)
        RX errors 0  dropped 0  overruns 0  frame 69
        TX packets 8503481  bytes 2354506702 (2.1 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
다음의 문서를 참고해서 VM의 Metadata를 조회하면 된다. 조회 가능한 항목들 역시 아래 문서에 나와 있다
 
 
VM 인스턴스 이름을 구하는 Metadata 조회 방법 (아래 헤더가 반드시 포함되어야 함)
[jerryjg@jerrydefault-4cpu-template-1 ~]$ curl -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/name
 
jerrydefault-4cpu-template-1
 
External IP를 구하는 Metadata 항목 확인 (recursive=true 옵션 사용)
[jerryj@jerrydev tmp]$ curl -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/network-interfaces/?recursive=true  | python -m json.tool
 
[
    {
        "accessConfigs": [
            {
                "externalIp": "104.199.xxx.xxx",
                "type": "ONE_TO_ONE_NAT"
            }
        ],
        "dnsServers": [
            "169.254.169.254"
        ],
        "forwardedIps": [],
        "gateway": "10.183.0.1",
        "ip": "10.183.0.2",
        "ipAliases": [],
        "mac": "42:01:0a:b7:00:02",
        "mtu": 1460,
        "network": "projects/249965614499/networks/jerry-default",
        "subnetmask": "255.255.240.0",
        "targetInstanceIps": []
    },
    {
        "accessConfigs": [
            {
                "externalIp": "",
                "type": "ONE_TO_ONE_NAT"
            }
        ],
        "dnsServers": [
            "169.254.169.254"
        ],
        "forwardedIps": [],
        "gateway": "10.10.10.1",
        "ip": "10.10.10.2",
        "ipAliases": [],
        "mac": "42:01:0a:0a:0a:02",
        "mtu": 1460,
        "network": "projects/249965614499/networks/nat-test-jerryjg",
        "subnetmask": "255.255.255.0",
        "targetInstanceIps": []
    }
]
 
[jerryj@jerrydev tmp]$ curl -H "Metadata-Flavor: Google" http://metadata/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip
104.199.xxx.xxx
 
Posted by Hey Jerry
,
반응형
 
에서 Squid HTTP Proxy를 이용하여 Google Cloud API를 방화벽을 우회해 호출 방법에 대해 알아보았습니다.
 
지금부터 소개하는 방법은 HTTP Proxy를 사용할 수 없고 Reverse Proxy 밖에 없는 환경에서 사용할 수 있는 방법입니다.
 
Private Google Access를 이용한 방법
 
사실 이 문제의 근본적인 해결은 VPN이나 Interconnect를 사용하여 On-Premise 환경을 Google Cloud와 직접 연결하고 다음의 Private Google Access를 사용하는 것입니다.
 
 
이 방법은 On-Prem 환경의 DNS 설정에 다음을 CNAME(alias)로 추가하고 
즉, *.googleapis.com에 대한 DNS 조회 요청을 모두 restricted.googleapis.com으로 리턴하고
 
*.googleapis.com    CNAME    restricted.googleapis.com
 
다음의 restricted.googleapis.com에 해당하는 IP 대역을 VPN 또는 Interconnect를 통해 Google Cloud로 전달하도록 라우팅 테이블을 조정합니다.
 
199.36.153.4/30
 
그러면 Google Cloud API에 대한 모든 액세스가 199.36.153.4/30 대역으로 Google Cloud에 전달되고, Public IP가 아닌 내부 IP를 통해 처리됩니다.
 
dnsmasq를 이용한 방법
 
위의 방법은 먼저 VPN이나 Interconnect를 연결되어 있어야 하고, 두 번째는 199.36.153.4/30 IP 대역에 대한 라우팅 규칙을 On-Premise에 추가할 수 있어야 합니다.
만약 어느 하나라도 불가능한 경우에는 지금 소개하는 방법을 사용할 수 있습니다.
 
그림으로 보면 다음과 같은 구조를 가지게 됩니다.
 
필요한 소프트웨어 설치와 구성은 다음과 같습니다.
 
dnsmasq
  • 위치: On-Premise 상의 특정 서버 또는 gsutil(또는 Google Cloud API 클라이언트)을 실행할 서버
  • 설정: 아래와 같이 *.googleapis.com에 대한 A 레코드로 Google Cloud 상의 haproxy가 설치된 VM IP(여기서는 1.1.1.1)을 지정
    ping storage.googleapis.com 을 해 보면 1.1.1.1이 lookup이 되면 정상
address=/googleapis.com/1.1.1.1
 
haproxy
  • 위치: Google Cloud 상의 VM (파이어월에서 이 VM으로 Outbound 통신이 가능해야 함)
  • 설정: 아래와 같이 443 포트로의 요청을 restricted.googleapis.com:443 으로 포워딩(Reverse Proxy) 하도록 함
frontend  mainj *:443
    mode tcp
    default_backend             javalove93
 
backend javalove93
    balance     roundrobin
    mode tcp
    server      static restricted.googleapis.com:443
 
Google Cloud API 클라이언트
  • 위치: On-Premise 상의 서버
  • 설정: dnsmasq가 DNS 서버로 /etc/resolv.conf에 등록이 되어 있으면 됨 (아래는 동일한 서버에 설치된 경우를 가정)
nameserver 127.0.0.1
 
그러면 실행되는 순서는 다음과 같습니다.
 
  1. Google Cloud API 클라이언트(예: gsutil)에서 API를 호출하기 위해 DNS lookup 수행 (예: storage.googleapis.com)
  2. dnsmasq에서 storage.googleapis.com의 IP로 haproxy가 설치된 VM의 IP(예: 1.1.1.1)를 반환
  3. API 클라이언트에서 haproxy VM으로 HTTPS 요청 호출
  4. haproxy 서비스에서 HTTPS 요청을 restricted.googleapis.com으로 포워딩 (Private Google Access에서 제공)
  5. 실제 Google Cloud API 실행
 
그러면 On-Premise 환경에서는 Google Cloud 상의 VM의 IP인 1.1.1.1만 Outbound로 개방하면 됩니다.
 
 
 
Posted by Hey Jerry
,