Azure IPv6 지원과 애플 “IPv6 Only Network”

지난 9월에 있었던 마이크로소프트 Ignite 2016 행사에서는 Azure의 네트워킹 관련 업데이트가 대거 발표되었다. 주요 내용은 DNS, IPv6, WAF, Peering, Accelerated Networking인데 상세 내용은 동영상 또는 블로그 글을 참조 바란다. 그 중에 IPv6지원에 대한 내용이 포함되어 있었는데 그 내용을 살펴보자.

위키백과에 따르면 IPv6는 1994년에 국제인터넷표준화기구에서 채택되었다고 한다. 그리고 내 개인 기억으로는 10년도 전에 IPv4가 고갈될 것이라는 공포심을 자극하면서 잠시 회자가 되나 싶더니 이내 잘 들리지 않는 IT용어 였다. 최근에는 IoT 와 더불어 다시 얘기가 나오고 있지만 아직 낮설다. 그러나 최근 IPv6에 대한 이슈를 끌고 나온 것은 의외로 애플이다.

애플은 WWDC 2015 행사에서 앱 심사 항목에 “IPv6 Only Network 지원”을 2016년 6월 1일 부터 넣겠다고 발표를 했다.  그리고 올해  6월이 지나면서 실제 앱스토어의 앱 심사에서 “IPv6 Only Network 미지원”으로 반려(Reject)된 사유가 나오면서 앱 개발자들 사이에서 이슈가 되고 있다.

애플의 “IPv6 Only Network 지원” 요건은 서버측이 IPv6를 지원하는 것과는 상관없다.

먼저 오해를 하지 말아야 할 것이 있다. “IPv6 Only Network” 지원은 iOS 기기가 IPv6만 지원하는 네트워크 환경에서도 앱이 정상적으로 작동하는지를 본다는 것이다. 서버측이 IPv6를 지원하고 말고는 상관이 없다. 애플 포럼의 FAQ를 정리해놓은 글을 보면 이런 내용이 있다.

#3 — Will I need to update my server?

 

That depends on where your server is running:

  • If you have a server running on the wider Internet, the answer is no.  Your server will be accessible to IPv6-only devices via DNS64/NAT64.You should update your server to support IPv6 as a matter of course, but that’s something you can do in your own time.

서버를 변경해야 하나요?

 

그건 서버환경에 따라 다른데 서버가 인터넷 공간에 연결되어 있다면 대답은 “NO”. 당신의 서버는 DNS64/NAT64를 통해 IPv6 only device와 통신이 가능할 것이다.

 

당연히 서버가 IPv6를 지원하면 좋다. 하지만 시간 날 때 해라.

애플이 제시한 테스트 환경을 보면 이해가 된다. iOS 기기들은 IPv6 주소를 받아서 IPv6 네트워크에 속하지만 DNS64/NAT64를 거치면서  IPv4로 변환된 주소로 서버와 연결된다. 즉, 서버측은 IPv4라도 상관이 없다. 구구절절 설명하는 이유는 앱이 반려 되었을 때 문제의 원인은 클라이언트(앱의 코드)에 있기 때문에 앱의 코드를 살펴봐야 한다는 것이다.

Azure의 IPv6 지원

현재 제약사항

Azure의 IPv6 지원은 아직 일부라고 말할 수 있다. 뭔가 해보기 전에 현재(2016년 12월 14일)의 제약사항을 먼저 살펴보는게 좋겠다.

  1. Azure의 Iaas 리소스 중에 부하분산집합(LB, Load Balancer)와 그 밑에 붙어 있는 가상머신(VM, Virtual Machine) 에서만 IPv6가 지원된다.
    • 인터넷에 직접 연결된 VM에서는 적용할 수 없다. 정확히 말하면 Public IPv6는 LB에만 만들 수 있다.
    • VMSS(Virtual Machine Scale Set)에 적용할 수 없다.
    • LB의 Probe는 IPv4 주소만 가능하다.
  2. 신규로 생성하는 인프라에만 적용할 수 있다.
    • 기존에 생성되어 있는 LB나 VM에는 적용할 수 없다.
    • 방법이 없는 건 아니다. 서비스 점검 시간을 가지고 기존 VM에서 Disk 를 Detach하고  VM과 LB 그리고 그 주변기기(Network Interface Card, Network Security Group, IP Address)를 삭제하고 다시 만들면서 새로운 VM에 기존 Disk 를 Attach 시키는 방법이 있다. 결국 거의 모두 다시 만드는 상황.
  3. Portal에서 만들 수 없고 ARM(Azure Resource Manager Template)이나 PowerShell, Azure CLI를 통해서 생성할 수 있다.

Azure Load Balancer에 IPv6 적용

공식 문서가 제공 된다.

기본 아이디어는 단순하다. LB에 IPv6용 IP Address를 만들어서 붙이고 VM에 붙어 있는 NIC(Network Interface Card)에도 IPv6용 IP Address를 붙여준다. 그리고 LB에서 Front End Address와 Back End Pool 설정을 해주고 Load Balancer Rule를 만들어 적용해준다.

ARM Template을 이용하여 IPv6 환경 만들기

가장 빨리 테스트 할 수 있는 방법은 이미 만들어져 있는 ARM Template을 활용하는 것이다. Sean Wheeler라는 분이 만들어 놓은 Create a Load-balancer with a Public IPv6 Address 페이지에서 “Azure에 배포” 버튼을 누르면 Azure Portal로 이동하면서 4가지 속성만 정의해 주면 즉시 만들 수 있다. 템플릿의 소스코드는 GitHub에 있다. Windows 서버 2대가 가용성 집합으로 묶여서 부하분산집합 아래에 놓이고 IPv4와 IPv6가 모두 설정된 인프라가 만들어진다.

  • Load Balancer의 Frontend IP Address가 IPv4 / IPv6 두개가 설정된다. (LoadBalancerFrontEndIPv4, LoadBalancerFrontEndIPv6) 
  • Load Balancer의 Backend Pools 도 두가지가 설정된다. (BackendPoolIPv4, BackendPoolIPv6)
  • Load Balancer의 Load Balancer Rule 도 두개로 설정된다. 이 중에서 IPv6에 대한 설정은 80 포트를 8080 포트로 보내는 설정이다. 따라서 VM에서 8080 접속에 대한 설정이 필요하다. 그리고 방화벽도 열어줘야 한다. 여기서는 IIS에 8080포트 바인딩 설정을 추가했다. 
  • VM에 붙어 있는 Network Interface Card는 2개의 내부 IPv4, IPv6 IP가 적용되어 있다. 
  • 실제 머신에서도 네트워크 카드에 두개의 IP가 설정되어 있는 것이 확인된다. 
    Ethernet adapter Ethernet 2:
    
       IPv6 Address. . . . . . . . . . . : 2603:1090:d05:f9::644a:a83d
       Link-local IPv6 Address . . . . . : fe80::88cf:2aff:84b6:2cc8%13
       IPv4 Address. . . . . . . . . . . : 10.0.0.5
       Subnet Mask . . . . . . . . . . . : 255.255.255.0
       Default Gateway . . . . . . . . . : fe80::662:73ff:fef4:56f%13
                                           10.0.0.1
    

IPv6로 접속 테스트

Load Balancer에 연결된 IPv6 주소로 웹브라우저를 이용해서 테스트를 진행 해봤다. 테스트를 위해서는 나의 네트워크 환경이 IPv6를 지원하는지 확인해 봐야 하는데 IPv6 연결테스트 페이지에서 확인 할 수 있다.

먼저 nslookup로 IPv6 주소 확인

$ nslookup -query=AAAA gameserver123.japanwest.cloudapp.azure.com
Server:		168.126.63.1
Address:	168.126.63.1#53

Non-authoritative answer:
gameserver123.japanwest.cloudapp.azure.com	has AAAA address 2603:1040:601::154

$ nslookup gameserver123.japanwest.cloudapp.azure.com

Server: 168.126.63.1
Address: 168.126.63.1#53

Non-authoritative answer:
Name: gameserver123.japanwest.cloudapp.azure.com
Address: 104.214.148.32

웹브라우저에서 http://[2603:1040:601::154] 로 접속테스트

Windows 방화벽을 열지 않아서 문제가 있었지만 잘 접속이 된다.

정리

다시한번 정리를 해야겠습니다.

  • Azure Load Balancer 와 그 아래 붙어있는 VM에서 IPv6 를 지원한다.
  • Load Balancer에 Auzre의 Public IP를 두개 붙이는데 IPv4와 IPv6를 생성한다.
  • VM에도 Azure IP Address를 IPv6로 만들어서 붙인다.
  • Load Balancer에서 Load Balancing Rule 이 두개가 필요하다. 웹 서비스의 경우 IPv4를 위해서는 80–>80, IPv6에 대해서는 80 –> 8080
  • VM의 OS 상에서도 방화벽 설정(80, 8080)이나 Application 설정(IIS 설정 같은), Linux의 경우 IPv6를 설정