글클메는 글로벌 메이플스토리 클래식 월드의 줄임말이다.
옛날 메이플을 그때 그 느낌 그대로 되살린 서버인데, 한국 IP로는 접속이 안 된다.
그래서 한국에서 하려면 VPN이 필요하다.
(그렇다고 VPN을 대놓고 금지하는 것도 아니다. 다만 VPN으로 약관을 어기면 영구 정지될 수 있고, 가능하면 쓰지 말라고는 한다. 출처: 넥슨 고객센터)
ExitLag 같은 게임 가속기(흔히 게임 VPN이라고 부르는)는 구독료가 한 달에 1만원이 넘는다.
뭐.. 나는 충분히 낼 생각이 있었지만, 그 전에 원래 쓰던 VPN이 속도가 잘 나오는지부터 확인해 보고 구독하려고 했다.
그러던 중에 메이플 좋아하는 친구랑 얘기하다가, 친구도 글클메를 하고 싶어 한다는 걸 알게 됐다.
근데 VPN이라는 게 생소하기도 하고, 뭔가 알아봐야 한다는 것 자체를 주저하는 것 같았다.
그럼 그냥 내가 만들자 싶었다.
셋이서 한다#
나랑 아내는 같은 집, 같은 공유기에서 맥으로 한다.
친구는 울산에서 윈도우로 한다.
친구 때문에 시작한 일이었기 때문에, 친구가 제일 중요했다.
VPN을 설치하고 켜는 과정이 최대한 단순해야 했다.
VPN이 뭔지부터#
내가 필요한 건 그냥 다른 나라 IP를 거쳐서 게임 서버에 닿는 것뿐이었다.
그걸 해 주는 게 VPN이었다.
내 컴퓨터에서 나가는 게임 트래픽을 중계 서버까지 보내고, 거기서 게임 서버로 보내 주기만 하면 됐다.
근데 VPN을 만들려면 뭐가 필요한지 몰라서, VPN이 뭔지부터 찾아봤다.
VPN의 기본 개념은 공개 인터넷 위에 사설망을 만드는 것이다.
VPN 앞에 Virtual이 붙은 건 물리적으로 연결하는 게 아니라 논리적으로 연결하기 때문이다.
그럼 그 사설망을 만들려면 뭘 해야 하나.
내 PC에서 출발하는 패킷을 감싸서(캡슐화) 다른 지점까지 옮기려면 터널링이 필요하고,
그 패킷이 중간에 변조되지 않았는지 무결성도 검증해야 하고.. 다른 사람이 못 보게 암호화도 해야 한다.
안전하게 연결하려면 키 교환이나 상대가 맞는지 확인하는 인증도 필요하다.
이걸 전부 직접 만드는 건, 그러니까 VPN 프로토콜 자체를 만드는 건 엄청난 노고가 필요한 일이다.
다행히 그럴 필요는 없었다.
WireGuard 같은 견고한 오픈소스 VPN 프로토콜이 이미 다 해 주고 있었다.
내가 만들어야 할 건 그걸 가져다 셋이 쓸 VPN 서비스였다.
그럼 내가 할 일은#
내가 할 일은 이런 VPN 오픈소스로 서버를 올리고, 기기마다 키를 발급하고, 게임 서버까지 지연을 줄이는 일련의 작업이었다.
먼저 서버는 클라우드에 올릴 건데, 어디에 올릴지가 또 고민이었다.
보통은 별생각 없이 AWS를 고르곤 하는데, 무의식적으로 AWS를 고르는 이유는 대외적으로 가장 잘 알려진 CSP이고, 그만큼 AWS 안에 편리한 서비스도 많고 서비스끼리 통합도 잘 되기 때문이라고 생각한다.
다만 이번에는 그런 것보다 비용을 제일 먼저 생각해야 했다.
셋이서 쓰는데 몇십 불씩 나오면 안 되니까..
그래서 처음엔 GCP가 무료 크레딧을 주니까 GCP로 진행했다.
그런데 문득 이런 생각이 들었다.
아마 CSP 중에 전 세계에 리전이 제일 많은 곳은 AWS일 거고..
그럼 게임 서버에 패킷을 제일 빨리 보내려면 확률적으로 AWS가 낫지 않을까?
그래서 GCP랑 AWS 속도를 비교해 보기로 했다.
메이플은 어디로 붙나#
일단 속도를 비교하려면 메이플이 어디로 붙는지부터 확인해야 했다.
게임만 터널로 보내려면 어차피 게임이 어디로 붙는지도 알아야 했다.
다만 게임이 어디에 붙는지 알려면 게임을 직접 실행해 봐야 하는데,
게임을 실행할 수가 없어서 원래 쓸 수 있던 Proton VPN을 켜고 게임에 접속했다.
얼른 Claude Code한테 맡겨서, 실제 게임 서버가 AWS 미국 리전 한 곳에 있다는 걸 확인했다.
GCP와 AWS 각각 거기서 제일 가까운 리전에 서버를 올려 두고, VPN 인프라가 다 되면 테스트해 보기로 했다.
AWS 쪽은 Lightsail 인스턴스를 제일 작은 플랜으로 올렸다.
혹시 몰라서 한 달에 15달러를 넘으면 알림이 오게 예산도 걸어 뒀다.
게임만 골라 보내기#
근데 서버만 올린다고 끝이 아니었다.
전체 터널로 켜면 모든 트래픽이 미국을 거쳐 나간다.
유튜브까지 미국에 갔다 오는 걸 원하는 건 아니었다.
근데 사실 더 큰 이유는 돈이었다.
Lightsail 제일 작은 플랜은 한 달 전송량이 1TB까지만 포함이고, 넘으면 나가는 트래픽만큼 GB당 돈을 더 내야 한다.
셋이 인터넷을 통째로 이 서버로 보내면 그걸 넘길 수도 있었다.
그래서 게임 트래픽만 터널로 보내고(스플릿 터널링), 나머지는 원래대로 집 회선으로 나가게 하고 싶었다.
문제는 게임이 거기 한 곳만 가는 게 아니었다는 거다.
그래서 전체 터널을 켜 두고 게임을 처음부터 끝까지 한 바퀴 돌았다.
런처 켜고, 로그인하고, 게임 들어가서 채널 옮기고, 사냥하고, 캐시샵 열어 보고, 업데이트까지.
기능 하나 쓸 때마다 어디로 붙는지 다 모았다.
나온 건 이랬다.
미국 한 지역에 있는 IP 대역이 대부분이었고, 그 밖에도 여러 IP 대역이 섞여 있었다.
이 IP 대역들만 WireGuard의 AllowedIPs에 넣었다.
반대로 일부러 터널 밖에 둔 것도 있다.
게임 패치 다운로드는 한 CDN 업체에서 받는데, 그 CDN의 IP 대역은 다른 사이트들도 같이 써서, 넣으면 그 사이트들까지 미국을 돌게 돼서 뺐다.
런처 안에 있는 reCAPTCHA, 구글 애널리틱스, 페이스북도 뺐다.
마지막으로 게임하는 동안 터널 밖으로 새는 게임 연결이 있으면 알려 주는 스크립트를 만들어서 돌려 봤다.
게임이랑 런처는 전부 터널로, 유튜브는 집 회선으로 나갔다.
(런처가 구글에 붙는 게 두 건 터널 밖으로 나갔는데, 글꼴이나 분석 같아서 그냥 두기로 했다)
GCP vs AWS#
집에서 미국 중계 서버로 바로 붙어 보니, 게임 월드 서버까지 왕복 지연(RTT)이 172ms쯤 나왔다.
GCP 쪽은 155~160ms.
어..? AWS가 더 느렸다.
확률적으로 AWS가 빠를 거라던 내 생각은 바로 깨졌다.
우리 집 회선에서 일반 인터넷으로 미국 AWS까지 가는 길이 돌아가고 있었던 모양이다..
그래서 AWS 서울 리전에 입구 서버를 하나 더 뒀다.
받은 WireGuard 패킷을 복호화하지 않고 포트 포워딩(DNAT)으로 미국 중계 서버에 그대로 넘기기만 하는 서버다.
한국에서 바로 AWS 백본 네트워크에 올라타는 셈이다.
그랬더니 130ms.
원래 쓰던 Proton VPN(140ms)보다도 빨라졌다.
결국 AWS가 이기긴 했는데, 생각해 보니 리전이 많아서라기보다 게임 서버가 AWS에 있어서인 것 같다.
서울에서 AWS 백본 네트워크에 올라타면 게임 서버까지 AWS 안에서만 움직인다.
물론 우리 집 회선에서 그날 잰 값이라, 다른 집에서는 다를 수 있다.
그리고 한국에서 거기까지는 물리적으로 100~110ms 밑으로는 힘들다고 한다.
아이템 줍기처럼 서버를 한 번 갔다 와야 하는 지연은 이 이상 줄이기 어렵다.
친구한테 보내기#
이제 제일 중요한 친구 차례.
친구는 VPN을 알아보는 것부터 주저하던 사람이라, 친구가 할 일은 최대한 줄여야 했다.
처음 PoC 때는 앱에서 빈 터널을 추가하고, 설정을 텍스트로 직접 붙여 넣는 식으로 했다.
이걸 친구한테 시킬 수는 없었다.
다행히 WireGuard 앱에는 설정 파일을 통째로 가져오는(import) 방식이 있었다.
그래서 설정 파일까지 만들어 주는 스크립트를 만들었다.
이름만 넣으면 키 쌍을 만들고, 공개키를 서버에 peer로 등록하고, 설정 파일이랑 다운로드 링크, 안내문까지 한 번에 뽑아 준다.
친구는 공식 WireGuard 앱 깔고, 그 파일 가져와서, Activate만 누르면 되도록 했다.
맥이랑 윈도우는 같은 파일을 쓰고 안내문만 다르다.
근데 윈도우 테스트가 생각보다 애먹였다.
클라우드에 Windows Server VM을 띄우고 WireGuard를 깔았더니 VM 네트워크가 끊겨 버렸다..
일반 Windows 11에서는 그런 일이 없었다.
결국 맥에 UTM으로 Windows 11을 띄우고, 내가 친구라고 생각하고 안내문만 보면서 그대로 따라 해 봤다.
설치, 파일 가져오기, Activate까지 다 됐고, 게임이랑 로그인 연결도 전부 터널로 갔다.
그 와중에 걸린 것들도 있었다.
- 런처 안에서 회원가입을 하면 오류가 나서, 안내문에는 넥슨 웹사이트에서 가입하라고 적었다
- IPv6도 터널로 보내게 했는데, AllowedIPs에 IPv6 전체(
::/0)를 넣으니 윈도우 앱에서 게임 말고 다 막혔다. 같은 범위를::/1과8000::/1두 개로 쪼개 넣으니 해결됐는데, 윈도우 앱의 킬 스위치와 관련 있다는 것 정도만 알고 정확한 원리는 나도 잘 모른다. 나중에 찾아봐야겠다
대시보드는 꼭 만든다#
하는 일이 모니터링을 만드는 일이다 보니, 모니터링이 얼마나 중요한지 안다.
그래서 뭘 만들든 모니터링 대시보드는 꼭 만드는 것 같다.
이번에도 미국 중계 서버 안에 상태 대시보드를 붙였다.
누가 접속해 있는지, 지연은 어떤지, 이번 달 전송량은 얼마나 되는지 볼 수 있다.
oauth2-proxy로 구글 OAuth 로그인을 붙이고, 내 구글 계정만 접속할 수 있게 했다.
보니까 게임 트래픽만 보내니 몇 분에 1MB 남짓이라, 월 1TB를 걱정할 일은 없었다.
해 보니#
만드는 건 Claude Code랑 같이 했다.
밤 12시쯤 미국 중계 서버를 올리고 서울 입구까지 붙여 놓고 잤다.
아침 8시쯤 다시 시작해서, 친구 안내문이랑 대시보드까지 끝낸 게 낮 1시쯤이다.
WireGuard가 다 해 줘서, 터널을 연결하는 것 자체는 생각보다 단순했다.
다만 한 번에 뚝딱 만들 수 있는 건 아니었다.
게임을 직접 켜서 어디로 붙는지 보고, 윈도우에서 친구처럼 따라 해 보는 건 AI가 대신 해 줄 수 없었다.
직접 해 봐야 알 수 있는 부분이 꽤 있었다.
구독료 좀 아껴 보려고 시작했는데.. 하다 보니 게임은 핑계였던 것 같다.
게임보다 친구 쓰라고 VPN을 만들어 주는 게 더 재밌었다.