요즘도 계속 세션 플러그인을 개발하고 있다. 분명 로컬에서 테스트 할때는 잘되는데 이를 패키징해서 서로 다른 로컬 디바이스에서 연결을 하려고 하니 계속 실패한다:(
사실, 문제가 조금 특이한데 한 디바이스에서 세션을 공개로 만들면 다른 디바이스에서 이를 찾는 것은 가능한데 밑의 사진처럼 말도 안되는 ping이 찍히고 세션에 join하는 것이 안된다.
쉽게 해결할 수 있을 문제일 것이라 생각했는데, 생각보다 잘 풀리지 않았고 다른 사람들 또한 이 같은 문제에 봉착해서 무려 $130나 하는 유로 플러그인(링크)을 사용하기도 하였다.
Epic Games 커뮤니티 답변들을 보니 이에 대한 해결과정을 깔끔하게 정리해 놓은 사람들도 없었고, 답변 내용들을 이해하려면 네트워크 지식과 EOS에 대한 지식이 좀 많이 선행되어야 한다는 느낌을 받았다.
따라서, 네트워크 관련 복습도 할겸 이번 글에서는 NAT
와 Port Forwarding
에 대해서 서술해보고자 한다!
NAT
은 라우터 안에 존재하고 하는 역할은 간단하다. 라우터 안쪽 망에 연결된 Private IP들을 라우터의 public IP로 바꾼다. IP에는 Ipv4와 Ipv6가 있는데, Ipv4로 전세계에 있는 디바이스들마다 개별 IP를 부여하는 것이 불가능해서 라우터만 ISP에서 할당받은 public IP 배정받고 그 아래의 친구들은 private IP를 사용하므로서 이 문제를 해결했다. 따라서, IPv6가 본격적으로 쓰이게 된다면 NAT랑 private IP 사용 없이 그냥 간단하게 모든 기기마다 public IP를 부여할 가능성도 있다.
NAT
은 이번 주제의 다른 토픽이기도한 Port Forwarding
과 밀접한 관련이 있는데, 다음 두 상황을 보면서 왜 그런지 이해해보자. 참고로, 상황 1은 NAT
에 대해서, 상황 2는 NAT
과 Port Forwarding
에 대한 예시이다.
내부에서 먼저 외부로 요청을 보내는 상황
SourceIP(PrivateIP) + SourcePort => DestinationIP + DestinationPort(내부에서 외부로 요청 보내려고 준비)
SourcePublicIP(NAT
이 라우터 IP로 변환) + ChangedSourcePort(포트 번호 또한 충돌을 위해 NAT
이 변환) => DestinationIP + DestinationPort(내부의 요청이 NAT을 통과하면서 최종적으로 외부로 요청 보낼 준비 끝!)
2의 과정이 일어날때 NAT
테이블에 기록해둠
DestinationIP + DestinationPort => SourcePublicIP + ChangedSourcePort (요청받은 외부가 요청한 내부로 다시 응답)
NAT
테이블에 ChangedSourcePort가 어떤 SourcePort인지 적혀있으므로 올바른 SourcePort에 해당하는 프로세스로 연결
외부에서 먼저 내부로 요청을 보내는 상황
근데 여기서, 요청을 보내는 외부의 입장에서는 라우터 내부의 포트가 뭘지 알고 "DestinationPort"을 정하는 것일까?
사실 답은 "모른다"이다. 라우터의 NAT
도 이 요청이 들어온 DestionationPort이 라우터와 연결된 어떤 프로세스에 전달할지 모른다.
그래서 Port Forwarding
이라는 개념이 들어온 것이다. Forward라는 단어는 여기서 전달을 의미한다. Port Forwarding
이란 NAT
에 어떤 테이블을 하나 만드는 것인데 외부에서 요청이 들어온 DestionationPort가 어떤 라우터 내부의 포트(Broadcast처럼 1개의 DestionationPort당 여러개 포트가 매핑될수도 있음)에 가야하는지 사전에 미리 작성해 두는 것이다.
이제 Port Forwarding
을 적용해서 상황 2를 다시 한번 보자.
외부에서 먼저 내부로 요청을 보내는 상황
사전에 라우터에 Port Forwarding
작업을 한다.
SourceIP + SourcePort => DestinationIP(라우터 IP) + DestinationPort(외부에서 내부로 요청 보내기)
라우터는 요청을 받으면 Port-Forwarding 테이블을 보면서 외부에서 보낸 요청의 포트번호가 라우터 내부의 어떤 포트번호로 요청이 들어가는지 알 수 있다.
cmd에 ipconfig를 치면 IP와 관련한 다양한 네트워크 속성들을 확인할 수 있다. 여기서 게이트웨이에 해당하는 것이 라우터 관련 값인데 이를 복사해서 인터넷 브라우저에 넣으면 자신이 사용하고 있는 라우터 환경설정에 들어가진다. 필자는 SK 브로드밴드를 사용하는데 위 사진이 SK 브로드밴드 라우터 설정 화면이다.
저번 글로벌 게임잼에서 원격접속을 하기 위해 RDP 작업(링크)를 하려고 3389 포트로 Port Forwarding
하였다. 앞으로 EOS-Steam도 Port Forwarding
을 해야한다면 이 테이블에 추가로 필드를 넣어야 한다.
가끔 Port Forwarding
을 이야기하면서 방화벽이 같이 등장하기도 한다.
먼저 방화벽의 종류에 대해서 알아보자. 방화벽은 크게 2가지 종류가 있는데, 하나는 Network-based으로서 보통 라우터 안에 존재하고, public network와 private network 사이에 패킷들을 검사한다. Host-based 방화벽도 있는데 이들은 local machine안에 위치한다. Window Defender Firewall 같은 것들이 Host-based 방화벽이다.
Port Forwarding
에서 등장하는 방화벽은 Network-based 방화벽이다. 이 친구는 자기만의 테이블이 있어서 외부의 이상한 port에서 들어오는 패킷은 자동으로 drop 시킨다. 이때, Port Forwarding
을 하면 해당 포트는 방화벽에 의해 제거될 대상에서 벗어날 수 있는 것이다.