맥 원격 제어 보고 충격 받은 이유
IP 주소도 모르는데 원격 제어가 된다고?
들어가며
최근에 맥에도 화면 공유(VNC)라는 원격 제어 기능이 있다는 것을 알았다.
원래 원격 제어를 하려면 IP도 알아야 하고 공유기라면 외부에서 접속할 수 있게 포트 포워딩을 열어 주거나 VPN을 사용해야 한다. 하지만 맥의 화면 공유 창은 뭔가 이상했다.
IP 또는 Apple 계정을 입력하십시오
Apple 계정을 입력하면 접속이 된다고? IP를 몰라도 포트 포워딩이나 VPN 없이도 접속이 가능하다고?
원리가 뭘까?
컴퓨터에서 기존 지식을 무시하고 Apple 계정만으로 접속이 되는 그런 마법 같은 일은 일어나지 않는다. 분명히 거기에는 이를 가능하게 하는 추가적인 기술이 필요하다.
가장 간단한 건 통신에 필요한 패킷 전체를 Apple의 중계 서버를 통해 접속하는 방식이다. 다른 방식으로는 포트 포워딩이나 VPN을 사용하지 않고도 기기끼리 직접 연결시키는 방식이 있다.
무엇이 됐든 IP를 입력했을 때와 Apple 계정을 입력했을 때의 통신 방식이 다르게 동작한다는 것은 확실했다. 만약 둘이 동일한 통신 방식으로 연결된다면 이건 정말 혁신일 것이다.
그래서 이에 대한 정보를 찾아 보았지만 아쉽게도 어떤 방식으로 연결되는지 찾지 못했다.
그렇다면 직접 해 보자
맥북에서 직접 Apple 계정을 입력하여 원격 제어를 해 보고 이때 통신하는 IP가 무엇인지 확인해 보면 된다. 전혀 모르는 IP가 나온다면 중계 서버를 통해 접속하는 거고 원격 기기의 IP가 나온다면 추가 기술을 통해 기기끼리 직접 연결시키는 방식일 것이다.
회사 동료의 도움을 받아 내 맥에서 동료의 맥으로 원격 접속을 해 보았다. (동료 맥은 인터넷 회선에, 내 맥은 모바일 핫스팟에 연결하여 외부 접속 환경을 구성했다)
결과는!!!
기기의 공인 IP를 통해서 연결되는 것을 확인할 수 있었다. 맥의 원격 제어는 UDP 홀 펀칭을 통해 이루어졌다.
UDP 홀 펀칭
정의: 공유기(NAT) 뒤에 있어 외부 접속이 안 되는 환경에서 서로 통신할 수 있게 NAT를 뚫어주는 기법
동작 원리: 일반적인 공유기 환경에서 UDP 통신은 특정 포트로 통신이 이루어지면 공유기는 일정 시간동안 해당 포트로 오는 패킷들은 해당 기기에게 넘겨준다 (단 통신한 적이 있어야 한다)
예를 들어 내 맥에서 내 포트 (출발지 포트) 를 1000번으로 설정하고 상대한테 UDP 패킷을 보냈다고 가정했을 경우
만약 상대가 공유기 1000번 포트 (도착지 포트) 로 UDP 패킷을 보내면 공유기는 그 패킷을 내 맥으로 보내 준다
동작 과정
- 기기 A와 B가 각각 홀 펀칭 중계 서버에 UDP 패킷을 보낸다
- 홀 펀칭 중계 서버에서는 각 기기의 공인 IP와 포트 정보를 확인하고 이를 상대 기기에게 알려 준다.
- 기기 A와 B는 서로의 IP와 포트에 UDP 패킷을 보내 연결을 시도한다
- 각 공유기는 해당 연결을 기억하고 포트를 매핑한다
- 이제 두 기기는 직접 UDP 패킷을 주고 받을 수 있다.
번외
글에서 IP와 Apple 계정의 통신 방식이 다를 것이라고 했는데 이에 대한 실험도 해 보았다. 현재 환경에서는 포트포워딩을 통해 VNC 포트를 외부에 열어 두었는데 IP로 접속하니 해당 포트로 직접 TCP 통신이 이루어 지는 것을 확인하였다.
하지만 환경에 따라 UDP 홀 펀칭이 불가능한 경우도 있는데 만약 이 경우 그냥 접속 실패로 끝나는지 중계 서버를 통해 직접 패킷을 전달해 주는지는 확인하지 못했다.
마치며
홀 펀칭은 정식 기술이라는 느낌보다는 인터넷 프로토콜의 원리를 이용한 꼼수에 가까운 기술이라고 생각합니다. 원래 설계자가 홀 펀칭을 염두해 두고 인터넷 프로토콜을 설계한 게 아닐텐데 누군가 그 원리를 완벽하게 파악하여 설계 의도와는 상관없이 프로토콜을 이용하고 있다고 생각하면 뭔가,, 굉장히 재밌습니다.
아무쪼록 긴 글 읽어 주셔서 감사합니다.