Post

프로젝트 좀보이드(Project Zomboid, PZ, 프좀) 서버 만들기① - 서버 구성과 포트포워딩

프로젝트 좀보이드(Project Zomboid, PZ, 프좀) 서버 만들기① - 서버 구성과 포트포워딩

게임서버 만들기

몇년 전부터 지인들과 Project Zomboid라는 좀비 서바이벌 게임을 즐기고 있는데,

최근 당직이 서버를 인수인계 받아야 해서 이참에 서버를 구성하기로 했다.

zom1-img1

마침 제작년에 컴퓨터 부품을 교체하면서 남는 CPU와 RAM, SSD가 있었고, 운 좋게 서버장 분이 호환되는 메인보드&파워서플라이(PSU)&케이스를 판다고 하셔 단돈 6만원에 서버용 컴퓨터를 조립할 수 있었다.

  • 사양
    • CPU: AMD Ryzen 3600x
    • M/B: ASUS A320m Gaming
    • RAM: DDR4 32GB
    • HDD: SSD 512GB
    • (GPU는 필요 없지만, CPU에 내장그래픽이 없어 운 좋게 중고 그래픽을 공짜로 얻을 수 있게 됐습니다. 어차피 모니터 표시기 용도라)

VM 구축

게임서버를 구축할 VM은 Windows 11로 결정하였다.

원래는 커리어를 위해 Linux로 구축할 생각이었으나, 서버를 구동할 때 쓰는 프로그램이 .NET Framework로 제작되어서 부득이하게 윈도우를 쓸 수밖에 없었다.

그래도 저 프로그램을 .NET Core로 포팅해서 리눅스로 구동할 장기 계획을 세우긴 했다.

참고-.NET Framework랑 .NET Core의 차이는?

둘 다 마이크로소프트에서 제공하는 .NET의 기능(API)를 사용하도록 하는 프레임워크(기반 툴)인이다. 다만 .NET Framework(닷넷 프레임위크)는 윈도우 전용인데 비해, .NET Core는 모든 운영체제에 호환되는(윈도우, 유닉스(맥OS), 리눅스 등…) 결정적인 차이점이 있다. 당연히 .NET Core가 최신 기술(닷넷 프레임워크는 개발 중단되었고 유지보수만 지원 중이다!)

당직이 작년에 근무했던 회사 솔루션도 .NET Framework를 사용했다. 솔루션이 10여년 전에 나와 그 당시에는 크로스 플랫폼이라는 개념도 없던 시절이기에…

인프라 환경

zom1-img2

결과적으로 말하자면, 위와 같이 구성했다.

호스트에는 Docker Desktop을 통해 Grafana 컨테이너를 구성했고,

게임이 구동되는 VM 내에 게임 서버Prometheus, Exporter를 설치해 서버 메트릭 정보를 호스트로 보내, Grafana가 이를 시각화하는 메카니즘 이다.

그리고 게임 서버와 Grafana는 포트포워딩을 통해, 공인 IP로 해당 서버에 들어올 수 있도록 하는 것이다!

zom1-img3

참고로 VM은 6코어, RAM 16GB, DISK 100GB로 마련하였다.

Prometheus와 Grafana, 대쉬보드 셋팅

프로메테우스로 PC 메트릭을 Grafana로 보내려면, 예전에 말했듯이 PrometheusExporter가 필요하다.

윈도우의 Prometheus는 여기서(~windows-amd64.zip을 골라야 한다!), Exporter는 여기서 받을 수 있다.

윈도우다 보니까, 그냥 설치(exe)만 하면 된다! Prometheus는 무설치 파일이라 아무곳에 넣어놓고 .exe를 실행하면 바로 된다.

윈도우 포트포워딩

당직의 공유기가 KT 공유기(기가와이파이 홈허브)라, 다음과 같이 진행하면 된다.

우선 KT 공유기 기준

http://homehub.kt.com:8899/login.asp

으로 접속한다. 보통 아이디랑, 비밀번호를 설정 안했을 때

ID는 ktuser,

비밀번호는 homehub

로 되어 있을 것이다.

zom1-img4

KT 공유기 기준으로, 장치 설정트래픽 관리포트 포워딩 설정으로 들어가

외부 포트를 1626116262, 내부 IP 주소를 호스트 PC의 내부 IP, 내부 포트는 동일하게, 프로토콜은 UDP(ALL-TCP/UDP 둘다 도 가능)로 설정해놓고 저장하면 된다.
(공인 IP는 네이버에 내 IP를 검색해서 나오는 값, 호스트 PC의 내부 IP는 cmd창에 ipconfig를 쳐서 나오는 값입니다)

참고로 UDP인 이유는 TCP/UDP의 차이점인데,
UDP는 TCP와 달리 상대 컴퓨터의 응답을 기다릴 필요 없이 일방적으로 전송하는 개념이라 비디오 게임이나 온라인 스트리밍 등에 적합한 프로토콜이기 떄문이다.

이러면 해당 PC의 공인 IP의 16261 포트로 접속할 떄 그 PC의 내부 IP 16261 포트로 자동 변환되는 것이다.

근데 여기서 끝나는 것이 아니다! 호스트 PC에서 서버가 실행 중인 VM으로 포트포워딩하는 설정을 또 해줘야 한다.

VM 포트포워딩

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 스크립트 제한 제거
Set-ExecutionPolicy Unrestricted
# 신규 Hyper-V 내부 스위치 생성
New-VMSwitch -SwitchName "(만들 스위치 이름)" -Switchtype Internal
# 신규 내부 스위치 호스트 IP IP 지정
New-NetIPAddress -IPAddress 10.0.2.1 -PrefixLength 24 -InterfaceAlias "vEthernet ((만들 스위치 이름))"
# 신규 내부 스위치 IP 대역 지정
New-NetNat -Name (만들 NAT 이름) -InternalIPInterfaceAddressPrefix 10.0.2.0/24
# 포트포워딩
Add-NetNatStaticMapping -ExternalIPAddress "0.0.0.0/0" -ExternalPort 16261 -Protocol TCP -InternalIPAddress "10.0.2.101" -InternalPort 16261 -NatName (만들 NAT 이름)
Add-NetNatStaticMapping -ExternalIPAddress "0.0.0.0/0" -ExternalPort 16262 -Protocol TCP -InternalIPAddress "10.0.2.101" -InternalPort 16262 -NatName (만들 NAT 이름)
Add-NetNatStaticMapping -ExternalIPAddress "0.0.0.0/0" -ExternalPort 16261 -Protocol UDP -InternalIPAddress "10.0.2.101" -InternalPort 16261 -NatName (만들 NAT 이름)
Add-NetNatStaticMapping -ExternalIPAddress "0.0.0.0/0" -ExternalPort 16262 -Protocol UDP -InternalIPAddress "10.0.2.101" -InternalPort 16262 -NatName (만들 NAT 이름)
Add-NetNatStaticMapping -ExternalIPAddress "0.0.0.0/0" -ExternalPort 8766 -Protocol UDP -InternalIPAddress "10.0.2.101" -InternalPort 8766 -NatName (만들 NAT 이름)
Add-NetNatStaticMapping -ExternalIPAddress "0.0.0.0/0" -ExternalPort 8767 -Protocol UDP -InternalIPAddress "10.0.2.101" -InternalPort 8767 -NatName (만들 NAT 이름)
# 원복
Set-ExecutionPolicy Restricted

zom1-img5

VM에서 윈도우 파워쉘(Powershell)을 관리자 권한으로 켜주고, 해당 명령어를 실행하면 된다.

요점은 Hyper-V 내부 스위치를 만들고, 내부 스위치의 IP 대역폭을 10.0.2.0~255로 지정한 다음, 호스트에서 오는 트래픽(정확히는 0.0.0.0/0, 즉 모든 IP)의 16261, 16262 포트의 TCP/UDP 통신을 10.0.2.101로 지정해 준다는 것이다. 추가로 8766~8767 포트의 UDP도 비슷하게 정해 주고.(선택 옵숀)

그 다음에 VM의 네트워크 인터페이스를 위 사진처럼

zom1-img6

그 다음, VM에 들어가 IP를 10.1.2.101, 써브넷 마스크를 255.255.255.0, 기본 게이트웨이를 10.1.2.1로 지정해 주면 된다.

물론 당직이 IP 대역폭을 10.1.2.0~255로 정해 놓은 거니까,

1
2
3
4
5
6
# 신규 내부 스위치 호스트 IP IP 지정
New-NetIPAddress -IPAddress 10.0.2.1 -PrefixLength 24 -InterfaceAlias "vEthernet ((만들 스위치 이름))"
# 신규 내부 스위치 IP 대역 지정
New-NetNat -Name (만들 NAT 이름) -InternalIPInterfaceAddressPrefix 10.0.2.0/24
# 포트포워딩
Add-NetNatStaticMapping -ExternalIPAddress "0.0.0.0/0" -ExternalPort 16261 -Protocol TCP -InternalIPAddress "10.0.2.101" -InternalPort 16261 -NatName (만들 NAT 이름)

내부 IP 대역을 바꾸고 싶은 경우 Net-NetIPAddressIPAddress 값Net-NetNatInternalIPInterfaceAddressPrefix 값, Add-NetNatStaticMappingInternalIPAddress를 원하는 대로 지정해 놓으면 된다.

예를 들면 New-NetIPAddress에 192.168.0.1로 하고, Net-NetNat에 192.168.0.0/24 로 한 다음, Add-NetNatStaticMapping에서 192.168.0.101로 한다던가…

zom1-img7

아무튼 이렇게까지 끝낸 뒤, 외부(즉 설정한 PC 밖의 네트워크)에서 공인 IP로 접속하면

(공인 IP:16261)→(호스트 내부 IP:16261)→(VM 내부 IP:16261) 이 순으로 포트포워딩이 이루어져 접속이 된다!

다음 시간에는 Grafana 설정, 서버 효율화를 위한 자동 켜짐-꺼짐 설정을 다뤄보겠다.

This post is licensed under CC BY 4.0 by the author.