개발하는 설기

마인크래프트 서버 열기 - 이 글로 완전 정복 (일반서버, 모드서버) 본문

마인크래프트

마인크래프트 서버 열기 - 이 글로 완전 정복 (일반서버, 모드서버)

mastersulgi 2024. 8. 13. 05:45

최근에 SSH 를 이용하여 서버를 제어하고, 관리하는 글을 적었습니다. 모드를 정해서 클라이언트를 배포할 수 있는 패치기를 만드는 글도 작성했고요. 이러한 글들을 작성한 건 서버에 대한 지식이 어느정도 있고 이미 서버를 운용하고 있는 분들에게 도움이 될 것 같았기 때문입니다.

그런데 막상 서버를 설정하고 여는 법에 대해서는 심도있게 다루질 않았습니다. 사실 마인크래프트 서버를 여는게 예전에는 정보가 부족해서 꽤 고난이도의 영역이었는데, 요새는 인터넷에 검색만 하면 필요한 파일부터 포트포워딩 하는 방법까지 꽤 자세하게 찾아볼 수 있기 때문입니다.

그럼에도 불구하고 이 글을 쓰고자 하는 건, 보고 따라하기만 하면 되는 글들은 정말 많지만, 서버가 어떤식으로 돌아가고 그렇게 하기 위해서 어떠한 설정이 필요한지, 왜 그런 설정이 필요한지 등 원론적인 부분에 대한 설명을 자세히 해놓은 글을 거의 찾아보기가 어려웠기 때문입니다.

또한 마인크래프트 서버를 여는 건 네트워크 중에서도 포트포워딩에 대한 부분을 굉장히 세심하게 다뤄야하는데, 이런 부분에 대한 이해가 없다면 서버에 대해 잊어버리고 있다가 다시 서버를 열고자 마음 먹었을 때 또 다시 관련된 내용들을 찾아봐야 할 만큼 포트포워딩은 복잡한 영역입니다. 이로 인해 인터넷에 돌아다니는 온갖 정보와 글들을 하나씩 다 따라해보다가 보안에 심각한 하자나 문제가 발생하는 일들이 비일비재합니다.

따라서 이 글의 목적은, 딱 한 번만 봐도 마인크래프트 서버를 여는 방법에 대해 이해할 수 있고 더 나아가서 실제로 서버를 한 번에 열 수 있을 정도로 읽는 분들을 만족시키는데에 있습니다.

# 마인크래프트 서버 운영의 모식도

마인크래프트 서버 뿐만이 아니라 서버와 통신하는 클라이언트 간의 관계도가 거의 비슷합니다만, 보통은 이런 루트를 따릅니다.

서버 컴퓨터 <-> 방화벽 <-> 공유기 <----> 클라이언트

예전에도 한 번 언급한 예시입니다만, 한국에는 수 많은 강이 있고 이러한 강들은 비가 많이 오면 불어납니다. 이 때 이 물이 불어나서 홍수와 같은 대형 참사가 발생하는 것을 예방하기 위해서 댐과 수문을 지어놓죠. 댐과 수문은 혹여 가뭄이 찾아왔을 때를 대비하여 물을 저장하는 한편, 비가 많이 왔을 때는 홍수가 발생하지 않도록 물을 흘려보내주는 아주 중요한 역할을 합니다.

서버 컴퓨터에서 마인크래프트 서버를 실행하는게 비가 오고 있는 상황이라고 생각해보겠습니다. 서버를 실행하면 수 없이 많은 정보량 (비)  이 축적되려고 하겠죠. 그럼 홍수가 나지 않게 수문을 열어야 할텐데, 방화벽이 그 역할을 수행해줍니다. 방화벽에서 수 없이 많은 정보량을 흘려보내고 나면, 공유기라고 하는 저수지에 도착합니다. 비가 아직 많이 오고 있으니 이 물들도 흘려보내지 않으면 안되겠죠?

'포트포워딩' 은 서버 컴퓨터 및 방화벽에서 정보가 흘러나올 수 있는 포트를 공유기와 일치시켜주는 작업인데, 저수지에 있는 수문을 여는 행위가 우리가 흔히 '포트포워딩' 이라고 부르는 과정이라고 볼 수 있습니다. 포트포워딩이 된 공유기를 통해 정보는 클라이언트에게 도착하게 되는데, 열린 수문을 통해 유입된 빗물과 강물들은 별 탈 없이 바다에 도착하는 것과 같습니다.

따라서 마인크래프트 서버는 비, 방화벽과 공유기는 수문, 클라이언트는 바다라고 생각하시면 이해가 쉬울 것 같습니다. '되도않는 예시 아닌가?' 라고 생각하실 분들도 있겠으나, 실제로 비가 와서 빗물이 바다로 유입되는 과정과 마인크래프트 서버를 구동하는 방식은 굉장히 닮아있습니다.

# 마인크래프트 서버를 구동하기 위한 기본적인 파일

https://blog.studysulgi.xyz/7

 

마인크래프트 서버의 역사 - LAN 서버에서 지금까지

마인크래프트는 원래 싱글 플레이를 기준으로 설계된 게임이라고 합니다. 실제로 전세계의 수 많은 사람들이 모드를 깔아서 싱글플레이를 하기도 하고요. 그런데 제 생각은 약간 다릅니다. 마

blog.studysulgi.xyz

이전 글에서 마인크래프트 서버의 역사를 간략하게 짚어드렸습니다만, 글의 뒷 부분에서 꽤 많이 언급되는 내용이 있습니다. 'Bukkit API' 라고 부르는 녀석인데, 이 친구는 우리가 현재에 들어서 마인크래프트 서버를 여는데에 있어서의 기초를 담당해줍니다.

일련의 사건으로 인해 Bukkit API 는 이제 사용할 수 없게 되었지만, 10년이 지난 지금은 Bukkit API 에서 파생된 수 많은 서버 구동기들이 시중에 풀려있기 때문에 플레이어에게 있어서 굉장히 다양한 선택지가 열렸다고 평가할 수도 있을 것 같습니다.

마인크래프트 서버를 구동하기 위해서는 크게 4가지 영역의 파일이 필요합니다.

첫째, 서버 파일입니다. 이 파일은 서버의 구동축을 담당하는 한편 다른 사람들과 플레이할 수 있는 제3자 멀티플레이 서버를 만들기 위해 Java 언어로 개발된 파일입니다. 서버를 한 번이라도 열어보신 분이라면 대부분 craftbukkit.jar, 혹은 spigot.jar 과 같은 파일을 보신 적이 있을텐데, 이 친구들이 이 서버 파일에 해당합니다.

이 파일이 없다면 원천적으로 서버를 여는게 불가능하기에 마인크래프트 서버 그 자체로 볼 수도 있습니다. 현재에 이르러서는 Paper 과 CatServer, Spigot 과 같은 그룹에서 이러한 서버 파일을 개발하여 꾸준히 발행하고 있습니다.

둘째, 맵 파일입니다. 싱글 플레이에서 world 에 속하는 파일인데, 이 맵 속에는 유저 데이터와 함께 유저가 보유하고 있는 아이템 등을 저장한 파일, 건축물, 지형 등이 저장되어 있습니다. 서버를 여는 시점에 world 폴더가 없거나 비어있으면 마인크래프트 서버는 싱글플레이에서 맵을 생성하는 것과 같은 원리로 새로운 맵을 만들어서 실시간 적용합니다.

맵 파일을 적용하는 건 생각보다 꽤 간단한데, 자신의 서버 파일이 있는 폴더에 world 폴더를 만들어서 그 안에 집어넣으면 됩니다. 이 때 맵 파일을 제대로 옮기지 않거나 일부만 옮길 경우 건축물의 일부나 지형, 유저 데이터에 심각한 하자가 생기기도 합니다.

셋째, 플러그인입니다. 기존의 LAN 서버나 Mojang 에서 제공하는 마인크래프트 서버 파일을 이용할 때에는 플러그인을 사용할 수 없었는데, 이러한 플러그인은 플레이어가 게임을 플레이하는데에 있어서 유의미한 도움을 줍니다. EssentialsX 나 Luckperms 와 같이 플레이어가 쓸 수 있는 명령어를 간략하게 해주거나 각 플레이어의 권한을 설정할 수 있는 플러그인도 있고, VariableTriggers 와 같이 특정 행위가 발생되면 미리 지정해둔 명령이 발동되도록 구현할 수 있는 플러그인도 있습니다.

이러한 플러그인은 사실 상 없어도 서버를 열거나 게임을 플레이하는데에 있어서는 전혀 지장이 없습니다. 오히려 플러그인을 추가했다가 커맨드블럭을 이용하여 정교하게 설계된 맵이 오작동하는 경우는 있어도 말이죠. 그럼에도 이런 플러그인이 있으면 관리자와 플레이어가 게임 외적인 요소에서 시간을 낭비하는 일을 줄여주는 한편, 마인크래프트라는 게임의 한계치를 더 높게 만들어주기도 합니다.

넷째, 모드입니다. 일반적으로 배포되고 있는 마인크래프트 서버 파일들은 모드를 이용한 제3자 멀티플레이 서버를 허용하지는 않고 있습니다. 그럼에도 모드를 추가하여 서버를 열 수 있는 모드 전용으로 개발된 서버 파일들도 일부 존재합니다. 예전에는 모드를 적용하는 방식이 Forge Mod Loader 정도에 국한되었지만, 지금은 이보다 더 빠른 로드가 가능한 Fabric 과 같은 시스템이 출시되었기에 이를 지원하는 모드 서버 파일들도 꽤 많은 상황입니다.

모드는 플러그인의 한계점인 클라이언트와 서버에 추가하기 어려운 아이템에 대해서 보다 쉽게 접근할 수 있다는 장점이 있습니다. 게다가 플러그인의 경우 클라이언트에 있어서 GUI 형태의 영향을 주기가 어려운 반면, 모드는 이러한 부분에 대해서도 유연한 접근이 가능하다는 굉장한 장점이 있습니다. 모드 또한 플러그인 처럼 마인크래프트라는 게임의 한계치를 더 높게 만들어줍니다.

여기까지가 마인크래프트 서버에 대한 기본적인 설명이었고, 이제부터 본격적으로 서버를 여는 작업을 시작해보도록 하겠습니다. 순서는 다음과 같이 진행됩니다:

- 공유기 포트포워딩

- 방화벽 설정

- 마인크래프트 서버 파일 찾기

- Java 설치하기

- 서버 구동기 만들기

- 세부적인 설정

# 공유기 포트포워딩

* 이 글은 Windows 10 / Windows 11 을 기준으로 작성되어 있습니다.

마인크래프트 서버를 여는 건 크게 LAN 서버와 일반적인 서버, 모드 서버로 구분됩니다. LAN 서버는 같은 네트워크 망에 속해있는 분들에게는 별도의 설정을 하지 않고도 간단하게 멀티플레이를 즐기기엔 좋지만, 각자의 집에서 각자의 컴퓨터로 제3자 멀티플레이 게임을 하고자 하는 분들에게는 적합하지 않습니다. 따라서 이 글은 일반적인 서버와 모드 서버를 구현하기 위해서 작성되고 있습니다.

일반 서버와 모드 서버 모두 공통적으로 필요한 작업이 있는데, 수문을 여는 작업, '공유기 포트포워딩' 을 해주어야 합니다. 사실상 마인크래프트 서버를 여는데에 있어서 가장 중요하고 필수적인 작업이라고 보는게 맞을 정도로 대단히 중요도가 높습니다.

포트포워딩 작업을 시작하기에 앞서서 경고 말씀 먼저 올리겠습니다! 만약 서버를 열고자 하는 사람이 공유기와 유선으로 연결되어 있는 것이 아니라 무선, 즉 Wi-Fi 로 연결되어 있다면, 지금이라도 랜선을 구비하여 유선으로 연결하실 것을 강력하게 권고드립니다. 무선으로 연결되는 네트워크는 서버를 구동하기에는 매우 불안정한 것은 물론이고, 경우에 따라서 IP가 바뀔 수도 있기에 반드시 유선으로 연결된 상태를 만들어주시기 바랍니다.

마인크래프트 서버는 열릴 때에 25565 포트를 이용합니다. SSH 나 FTP 가 21, 22 를 쓰는데에 반해 굉장히 높은 숫자를 사용하는데, 이는 다른 프로세스나 서버용 프로그램과 충돌하거나 겹치는 일이 없게 하도록 설정된 임의의 값입니다. 우리는 이 25565 라는 포트를 통해 서버가 클라이언트와 통신할 수 있도록 공유기의 설정을 변경해줄겁니다.

이 포트는 이후의 단락인 '세부적인 설정' 에서 변경하는 방법을 알려드릴 예정이나, 만약 1개의 서버만을 구동할 예정이라면 이 포트를 변경하지 않는 것을 추천합니다. 25565 포트는 마인크래프트의 기본적인 서버 포트로 설정되어 있기 때문에 나중에 해당 서버에 연결할 때 IP주소만 적어주면 되지만, 만약 포트를 임의로 변경할 경우 IP주소 뒤에 포트 번호를 적어주어야 접속을 할 수 있기 때문에 플레이어에게도, 서버 관리자에게도 혼선을 불러일으킬 가능성이 높기 때문입니다. 이 글에서는 마인크래프트 서버를 25565 에서 연다는 것으로 가정하지만, 만약 이를 변경하고 싶으신 분이라면 반드시 글을 끝까지 읽고 신중하게 진행해주세요.

이제 공유기의 설정을 변경하려고 하는데, 확인해야 할 사항이 있습니다. 집에서 인터넷을 어떻게 사용하고 있는지를 먼저 알아야 합니다. 대부분의 가정은 거실에 공유기를 하나 두고, 유선의 경우 벽면에서 나오는 포트에 랜선을 꽂아서 사용합니다. 그런데 방마다 개인 공유기를 사용하는 집도 있을 수 있고 (제가 그렇습니다.), 아예 거실이고 방이고 공유기 자체를 사용하지 않는 집도 있을테니까요.

여기서 강조하고 싶은 내용은, "자신의 회선을 통과하는 모든 공유기를 포트포워딩 설정 해야 한다" 라는 사실입니다. 즉 집에서 거실에만 공유기가 있는 상황이라면 해당 공유기에 대해서만 포트포워딩 설정을 해주면 되지만, 자신의 방에 컴퓨터가 있고 이게 공유기와 연결되어 있으며, 거실에 공유기가 하나 더 있는 상황이라면 거실의 공유기와 방의 공유기 모두 포트포워딩 설정을 해줘야 합니다.

논외로 공유기가 아예 존재하지 않고 유선으로 인터넷을 쓰는 경우에는 이 단락에서 진행하는 '공유기 포트포워딩' 의 절차가 필요하지 않으니, 바로 다음 단락으로 넘어가셔도 무방합니다.

우선은 통신사 공유기, 즉 거실에 있는 공유기부터 설정을 진행해보겠습니다. 

저는 kt 인터넷을 사용하고 있고, 가정용 kt 인터넷을 사용하시는 분들은 공유기 관리 페이지의 주소가 172.30.1.254 로 고정되어 있습니다. 여기에 접속하면 사진과 같은 화면이 나오는데, 한 번도 초기 설정을 건드리지 않은 분이라면 아이디는 ktuser / 비밀번호는 homehub 로 설정되어 있습니다. 만약 초기 설정을 통해 관리자용 아이디와 비밀번호를 변경하신 분이라면 해당 정보를 이용하여 로그인해주시면 됩니다.

접속하고 난 뒤에는, 장치설정 - 트래픽 관리 항목을 눌러서 여기에 와주시면 됩니다. 소스 IP주소와 소스 포트는 비워두시고, 외부 포트와 내부 포트에는 25565를 입력해주시면 됩니다. 설명에는 적당히 기억하기 좋게끔 이름을 적어두시면 됩니다.

제일 중요한 내부 IP 주소에 대한 이야기를 하겠습니다. 만약 집에서 인터넷 회사 공유기만을 사용하고 있다면, Windows + R (키보드) 을 눌러 실행 창을 열고, cmd를 입력한 뒤 나오는 창에서 ipconfig/all 을 입력합니다.

이더넷 어댑터 ~: 라고 나온 뒤, IPv4 주소라고 적혀있는 항목이 있을 겁니다. 그 IPv4 주소를 내부 IP 주소 란에 채워주신 뒤, 추가 버튼을 눌러서 적용시키면 됩니다.

만약 집에서 인터넷 회사 공유기와 개별 공유기를 이용하고 있다면 조금 더 복잡해집니다. 개별 공유기의 관리 페이지에 접속한 뒤, 외부 IP 주소로 표기되어 있는 IP를 찾아서 적어넣어야 합니다. 예시 사진을 첨부하도록 하겠습니다.

저 같은 경우 iptime 공유기를 개별 공유기로 이용하고 있기에, 주소창에 192.168.0.1 을 입력하면 접속할 수 있습니다. 

만약 한 번도 공유기 설정을 한 적이 없다면 로그인 이름과 암호는 모두 admin 으로 설정되어 있지만, 만약 한 번이라도 설정한 적이 있다면 해당 이름과 암호로 로그인해주면 됩니다.

iptime 의 경우 이렇게 로그인하여 관리자용 페이지가 나오게 되면, 메뉴 아래에 동적 IP - 연결됨 - IP주소 가 나오게 됩니다. 이 IP주소를 아까 말했던 인터넷 회사 공유기의 설정 창의 내부 IP 주소 란에 작성한 뒤, 추가를 눌러주면 됩니다.

iptime 사의 공유기를 사용하고 있지 않더라도, 일반적으로 공유기 관리 페이지에 들어오게 되면 동적 IP / 유동 IP 인지 여부와 해당 IP 를 표시하고 있으므로 이를 사용하면 됩니다. 중요한 건 개별 공유기의 관리 페이지에 등재되어 있는 IP 를 적어야한다는 점입니다. 통신사 공유기와 혼동하지 마세요!

kt 와 u+ 에서 제공하는 공유기는 유선과 무선을 하나의 페이지에서 관리하는 것과 다르게, sk 의 공유기는 Wi-Fi 용 관리 페이지와 LAN 용 관리 페이지가 다릅니다. 우리는 유선으로 연결된 서버에 대해 포트포워딩을 해주어야 하기 때문에, LAN 용 관리 페이지에 들어가야 합니다. 이를 구분하는 방법은 Windows + R (키보드) 을 눌러 실행 창을 열고, cmd를 입력한 뒤 나오는 창에서 ipconfig/all 을 입력합니다.

이더넷 어댑터 ~: 라고 나온 뒤, '기본 게이트웨이' 라고 적혀있는 항목이 있을 겁니다. 해당 IP를 인터넷 창에 복사 후 붙여넣기하면 헷갈리지 않고 LAN의 관리 페이지에 접속할 수 있습니다.

만약 한 번도 공유기 설정을 한 적이 없다면 아이디는 admin, 비밀번호는 유선 MAC 주소 끝 6자리_admin 으로 설정되어 있습니다. 이 때 주의할 점은 무선 MAC 주소와 유선 MAC 주소는 다른 것이며, 대소문자가 구별되니 반드시 맞게 작성해주셔야 합니다.

하얗게 가려진 부분은 개인정보 보호를 위해 가려진 부분입니다. 아마 여러분들이 접속했을 때는 모두 채워져있는 상태로 나올겁니다. 

이렇게 공유기 관리 페이지에 들어오게 되면, NAT - 포트 포워딩 항목을 클릭해서 포트 포워딩을 설정할 수 있습니다. 포트 범위와 로컬포트는 모두 25565로 적어주시고, 설명은 내가 기억할 수 있게 적어두면 됩니다. 로컬 IP 주소는 2가지 경우로 나뉘는데, 통신사 공유기만 사용하는 경우와 방에서 별도의 공유기를 사용하는 경우입니다. 전자의 경우 Windows + R (키보드) 을 눌러 실행 창을 열고, cmd를 입력한 뒤 나오는 창에서 ipconfig/all 을 입력합니다.

이더넷 어댑터 ~: 라고 나온 뒤, IPv4 주소라고 적혀있는 항목이 있을 겁니다. 그 IPv4 주소를 내부 IP 주소 란에 채워주신 뒤, 추가 버튼을 눌러서 적용시키면 됩니다.

별도의 공유기를 사용하고 있는 경우 개별 공유기의 관리 페이지에 들어오게 되면 동적 IP / 유동 IP 인지 여부와 해당 IP 를 표시하고 있으므로 이를 사용하면 됩니다. 중요한 건 개별 공유기의 관리 페이지에 등재되어 있는 IP 를 적어야한다는 점입니다. 통신사 공유기와 혼동하지 마세요!

만약 집에서 공유기를 통신사 공유기 1대만 사용하고 있다면, 포트포워딩에 대한 설정은 여기에서 종료됩니다. 하지만 저처럼 방에 개별 공유기가 있는 경우에는 해당 개별 공유기에 대해서도 포트포워딩을 진행해줘야 합니다.

iptime 공유기의 경우 관리도구 - 고급 설정 - NAT/라우터 관리 - 포트포워드 설정을 누르면 해당 페이지에 들어갈 수 있습니다. 타사의 공유기도 완전히 똑같은 메뉴는 아니지만, '포트포워드 설정' 이라고 표기되어 있는 메뉴로 들어가면 됩니다.

그럼 규칙이름, 내부 IP 주소, 프로토콜, 외부 포트, 내부 포트의 순서로 입력하게끔 되는데, 규칙이름은 자신이 기억할 수 있는 이름으로 지정해두고, 프로토콜은 TCP, 외부 포트와 내부 포트는 똑같이 25565 를 입력하시면 됩니다.

iptime 공유기의 경우 '현재 접속된 IP 주소' 를 선택하면 자동으로 채워지지만, 경우에 따라 타사의 공유기는 그런 옵션이 없을 수 있습니다. 그런 경우에는 Windows + R (키보드) 을 눌러 실행 창을 열고, 'cmd' 를 입력한 뒤 나오는 창에서 'ipconfig/all' 을 입력합니다.

이더넷 어댑터 ~: 라고 나온 뒤, IPv4 주소라고 적혀있는 항목이 있을 겁니다. 그 IPv4 주소를 내부 IP 주소 란에 채워주신 뒤, 추가 버튼을 눌러서 적용시키면 됩니다.

이렇게 되면 공유기가 2대인 분들도 포트포워딩 설정이 완료되게 됩니다. 처음 해보시는 분들도 있을 것 같고, 예전에 해봤는데 기억이 잘 나지 않아서 이 글을 보러 오신 분들도 있을 것 같습니다만, 방금 전 우리가 했던 포트포워딩 설정의 의미를 한 줄로 요약하자면:

'나는 25565 포트를 통해서 내 컴퓨터와 다른 컴퓨터가 통신하는 것을 허용하겠다' 가 되는 겁니다. 사실 여기까지 별 문제없이 따라오신 분들은 마인크래프트 서버를 열기 위한 준비를 80% 이상 완료했다고 보셔도 무방합니다.

# 방화벽 설정

* 이 글은 Windows 10 / Windows 11 을 기준으로 작성되어 있습니다.

공유기에 있는 포트를 열어주었으니, 우리가 서버로 쓸 컴퓨터에 있는 방화벽에도 이 사실을 알려줘야 합니다. 방화벽은 기본적으로 모든 포트에 대해서 접근을 차단하고 있는데, '예외처리' 를 통해서 특정한 포트의 접근을 허가할 수 있습니다. 예전에는 이러한 사실을 제대로 이해하지 못한채로 서버를 여는 사람들이 많았기에 블로그에서도 '마인크래프트 서버를 열기 위해서는 방화벽을 해제해야 한다' 는, 아주 무시무시한 정보를 전달하기도 했었죠.

Windows 의 검색창에 '고급 보안이 포함된 Windows Defender 방화벽' 을 입력하고, 나오는 항목을 클릭해줍니다.

그럼 방화벽에 관련된 창이 하나 뜨는데, 왼쪽 상단에 있는 '인바운드 규칙' 을 눌러줍니다.

그럼 여러가지 규칙이 나올텐데, 오른쪽 상단에 있는 '새 규칙' 을 눌러줍니다. 저 같은 경우 이미 마인크래프트 서버를 운영하고 있기 때문에 Minecraft Server 가 추가되어 있는 모습을 볼 수 있습니다.

마법사 화면이 나오면, '포트' 항목을 누르고 '다음' 을 눌러줍니다.

다음 화면에서 'TCP' 를 선택하고, '특정 로컬 포트' 를 선택하여 25565 로 적어준 뒤 '다음' 을 누릅니다.

'다음' 버튼을 2번 누르고 이름과 설명에 내가 기억할 수 있는 내용을 적은 뒤 '마침' 을 눌러줍니다.

모든 과정이 완료되면 인바운드 규칙의 목록 속에 내가 추가한 규칙이 정상적으로 나오는 것을 확인할 수 있습니다. 여기까지 따라오셨다면, 90% 이상의 과정이 완료된겁니다. 이제부터는 내가 어떤 서버를 열고 싶은지 구상해보는 일만 남았거든요.

# 마인크래프트 서버 파일 찾기

이제부터는 내가 어떤 서버를 열지 구상해야 합니다. 일반 서버와 모드 서버는 필요로 하는 서버 파일이 다르기도 하고, 구동하는 방식에 약간 차이가 있기 때문에 고민이 필요합니다.

만약 내가 서버를 열어서 친구들과 (혹은 불특정 다수의 사람들과) PVP, 마인팜, 야생 등 '마인크래프트 본연의 컨텐츠를 플레이하고 싶다' 라고 생각하고 계신다면, 굳이 모드 서버를 열 필요 없이 일반 서버를 열어도 상관 없습니다.

이미 PVP, 마인팜, 야생 등 마인크래프트 본연의 컨텐츠는 즐길 만큼 즐겼으니, '이제 모드 좀 깔아서 해보지 못한 경험들을 다양한 사람들과 해보고 싶다' 라고 생각하고 계신다면, 모드 서버를 여는 게 훌륭한 선택이 됩니다.

이제 여러가지 서버 파일에 대한 나열과 비교를 한 번 해보도록 하겠습니다.

# 일반 서버용 서버 파일

CraftBukkit - 서버 파일의 시초격이라고 볼 수 있으며, 현재까지도 점유율이 가장 높고 가장 많은 플러그인을 지원합니다. 공식 개발이 종료되어 다른 서버 파일로 넘어가고 있음에도 인지도가 가장 높습니다.

Spigot - CraftBukkit 를 계승하며 같은 API 를 기반으로 개발된 서버 파일입니다. CraftBukkit 에서 지원하는 플러그인을 대부분 지원하며 CraftBukkit 을 조금 더 최적화 해두었다고 보면 편합니다.

Paper - CraftBukkit 과 Spigot 을 모두 계승하는 서버 파일입니다. CraftBukkit 과 Spigot 에서 지원하는 플러그인을 대부분 지원하며 가장 최적화가 잘되어 있다고 평가됩니다.

# 모드 서버용 서버 파일

Forge / Fabric - 모드 서버를 구현하는데에 있어서 안정적이지만 플러그인을 사용할 수 없다는 치명적인 단점이 있습니다. 플러그인을 딱히 사용하지 않을 예정이고 모드만을 이용해 서버를 열 생각인 사람에게 최적입니다.

CatServer - CraftBukkit 과 Spigot 의 플러그인을 대부분 사용할 수 있는 서버 파일이지만, 1.12.2 와 1.16.5, 1.18.2 버전만 지원한다는 단점이 있습니다. 그럼에도 불구하고 지원하는 버전들에 대해서는 안정성이 좋다고 평가받습니다.

Arclight - CraftBukkit 과 Spigot 의 플러그인을 대부분 사용할 수 있으며 1.16~1.20.4 의 버전을 지원하여 비교적 최신 버전의 모드 서버를 열 때에 좋다고 평가받습니다.

# 서버 파일의 추천

일반 서버의 경우 Paper 를 고르지 않을 이유가 없습니다만, Paper 가 1.7.10 부터 지원되기 때문에 만약 1.7.10 보다 예전 버전의 서버를 열어야하는 경우 CraftBukkit 을 추천드립니다. Spigot 의 경우 CraftBukkit 을 기반으로 하는 서버 파일이기 때문에 Paper 를 쓸 게 아니라면 오리지널 CraftBukkit 을 쓰는게 낫다는게 제 생각입니다.

모드 서버의 경우 1.12.2와 1.16.5, 1.18.2 버전을 실행하는 경우 CatServer 를, 1.16 이상의 버전을 이용할 경우 Arclight 를 추천합니다. 이외의 버전에는 어쩔 수 없이 Forge / Fabric 을 사용해야 하곘지만, 그럴 경우 어떠한 플러그인도 사용할 수 없고 이는 제게 있어서 대체 불가능한 단점이라고 생각이 들기 때문입니다.

# 서버 파일의 결정

CraftBukkit 은 https://getbukkit.org/download/craftbukkit 의 링크를 타고 들어가면 각자의 버전에 맞는 서버 파일을 다운로드 받을 수 있습니다. Spigot 의 경우 https://getbukkit.org/download/spigot 의 링크를 타고 들어가면 각자의 버전에 맞는 서버 파일을 다운로드 받을 수 있습니다. 이 사이트의 경우 어떤 방식으로 저작권을 취득하였는지는 모르겠으나 최신 서버 파일을 실시간으로 업데이트하는 것으로 보입니다.

해당 사이트에서 서버 파일을 다운로드 받을 경우 Download 버튼을 누르게 되면 You're about to download: 서버 파일 이라고 나오고, 그 밑에 + Create a Server 라고 나옵니다. 이때 아래에 있는 버튼은 광고이고, 자신이 다운로드 받으려고 하는 서버 파일의 이름을 클릭하면 다운로드가 실행되니 주의해주세요.

Paper 는 https://papermc.io/downloads/all 의 링크를 타고 들어가면 각자의 버전에 맞는 서버 파일을 다운로드 받을 수 있습니다. 이 때 주의해야 할 점은, 최신 버전의 업데이트가 이루어질 경우 그와 비교했을 떄 가장 이전 버전의 지원이 종료되며 다운로드 받을 수 없습니다.

CatServer 의 경우 각 버전 별로 다운로드 링크가 다릅니다.

- 1.12.2 버전

https://github.com/Luohuayu/CatServer/releases/download/24.02.23/CatServer-5a600445-universal.jar

- 1.16.5 버전

https://github.com/Luohuayu/CatServer/releases/download/23.05.26-1/CatServer-1.16.5-1d8d6313-server.jar

- 1.18.2 버전

https://github.com/Luohuayu/CatServer/releases/download/23.05.26/CatServer-1.18.2-6c3f5965-server.jar

Arclight 는 https://github.com/IzzelAliz/Arclight/releases 에서 지원하고 있는 모든 버전의 서버 파일을 제공하고 있으니, 원하는 버전에 맞게 다운로드를 받으면 됩니다.

# Java 설치하기

자기가 열고자 하는 서버의 서버 파일을 다운로드 받았으면, 이 서버 파일을 실행해주는 구동기를 만들기 전에 Java 를 설치해야 합니다. 지금의 마인크래프트 클라이언트가 아닌 1.5.2 및 이하 버전을 위한 Legacy 클라이언트를 실행할 때에는 Java 를 설치했어야 하는데, 지금 제공되고 있는 마인크래프트 클라이언트는 Java 를 따로 설치하지 않아도 게임을 플레이할 수 있게 해주더군요.

https://www.java.com/ko/

 

Java | Oracle

데스크톱 애플리케이션용 Java 얻기

www.java.com

해당 링크를 타고 들어가서 'Java 다운로드' 버튼을 누른 뒤, 자신이 사용하고 있는 OS에 맞는 Java 를 다운로드 받아주시면 됩니다. 이 때, 어떠한 설정도 건드릴 필요가 없으니 그냥 쭉쭉 넘기면서 설치만 해주시면 됩니다.

# 서버 구동기 만들기

흔히 우리가 블로그나 커뮤니티에 돌아다니는 소위 '버킷' 이라는 파일을 다운로드 받으면, jar 형태의 서버 파일과 bat 형태의 서버 구동기가 들어있습니다. 저도 제 이름을 박아서 서버 구동기와 함께 쉽게 다운로드만 받으면 쓸 수 있는 서버 파일을 배포하고 싶습니다만, 이는 엄연한 저작권법 위반 행위이기 때문에 그런 행위는 지양하고자 합니다.

우선, 다운로드 받은 jar 형태의 서버 파일을 하나의 폴더에 넣어줍니다. 다운로드 폴더나 바탕화면이 아니라, 새로운 폴더를 만들어서 그 안에 넣어주면 됩니다.

이 폴더에서 우클릭을 한 뒤, '새로 만들기' -> '텍스트 문서' 를 눌러줍니다.

파일의 확장자를 수정하기 위해서는 폴더 옵션을 먼저 변경해주어야 합니다. '...' 버튼을 눌러서 폴더 옵션을 연 후, 보기 탭에 들어갑니다.

여기에서 '알려진 파일 형식의 파일 확장명 숨기기' 옵션을 체크 해제해주고 '적용', '확인' 을 눌러줍니다.  만약 이미 체크 해제가 되어있다면 이건 무시하셔도 됩니다.

그럼 폴더 내에 있는 파일들의 확장자가 보이기 시작합니다. 새로 생성된 텍스트 문서의 이름을 'start.bat' 으로 변경해주면 되는데, 변경하겠느냐는 경고문에 대해 '예' 를 눌러주면 됩니다.

그럼 텍스트 문서였던 파일이 Windows 배치 파일로 바뀌게 됩니다. 이 파일을 우클릭한 후 '편집' 을 선택합니다. 만약 저와 우클릭을 했을 때 나오는 게 다르다면, 아래에 있는 '더보기 옵션' 을 눌러보시면 똑같이 나올겁니다.

그럼 메모장으로 이 파일이 열리게 됩니다. 여기에 우리는 서버를 구동하기 위한 명령어를 입력해줄 겁니다.

title 서버 콘솔 창 맨 위에 표시될 이름
@echo off
java -Xms8G -Xmx8G -jar spigot-1.14.4.jar
PAUSE

이걸 그대로 복사해서 붙여넣은 뒤, 저장해주면 됩니다. 각각의 코드에 대해서 설명해드리도록 하겠습니다.

title 서버 콘솔 창 맨 위에 표시될 이름 - 말 그대로입니다. 여기에 적은 내용이 콘솔 창 위의 프로그램 이름으로 표시됩니다.
@echo off - Windows 의 디렉토리가 표시되지 않게 설정합니다. 큰 의미는 없습니다.
java -Xms8G -Xmx8G -jar spigot-1.14.4.jar - 최소 8기가, 최대 8기가의 램을 할당하여 서버를 시작합니다.
PAUSE - 서버가 시작되지 않거나 멈췄을 때 콘솔 창이 바로 꺼지지 않고 사용자의 입력을 기다리게끔 합니다.

여기서 3번째 줄이 가장 중요한데, Xms는 최소, Xmx는 최대를 의미합니다. 가령, 최소 4기가 최대 8기가의 램을 할당하고자 한다면 위에 적혀 있는 구문을 java -Xms4G -Xmx8G 로 변경해주어야 합니다.

spigot-1.14.4.jar 라고 써있는 부분에, 내가 다운로드 받은 서버파일의 이름을 그대로 적어주면 됩니다. 가령, craftbukkit-1.5.2.jar 이라는 서버 파일을 이용하여 최소 2기가, 최대 4기가의 램을 할당하여 서버를 시작하고자 한다면:

java -Xms2G -Xmx4G -jar craftbukkit-1.5.2.jar 로 수정해주면 되는 것입니다.

# 세부적인 설정

이제 세부적인 설정들만 조금 건드려주면 다른 사람과 함께 즐겁게 마인크래프트를 플레이할 수 있게 됩니다. 99% 의 설정이 완료되었고 이제 서버를 여는 일만 남았거든요.

만들어진 서버 구동기를 더블클릭하여 실행해보도록 하겠습니다.

바로 오류가 나오면서 서버가 멈춰버립니다. 구문을 해석해보자면 'EULA 에 동의해야 서버를 열 수 있으니, 폴더 내의 eula.txt 를 열어보세요' 정도일 것 같습니다. 서버를 끄고 폴더로 돌아가보겠습니다.

방금 전까지는 없었던 eula.txt, server.properties, logs 가 생성되었습니다. logs 는 그냥 무시하셔도 좋고, 방금 전 오류 메시지에서 나왔던 eula.txt 를 열어야 합니다.

eula 에 동의해야 서버를 열 수 있다는 사실을 고지해주고, eula 의 동의 여부가 적혀있습니다. false 로 되어 있는 부분을 지우고 true 라고 바꿔주면 됩니다. eula= 부분까지 다 지우는게 아니라 'false' 만 'true' 로 바꿔주세요.

저장하고 난 뒤 다시 한 번 'start.bat' 을 눌러서 서버를 시작해보겠습니다.

Done! 이라고 나온게 보이시나요? 드디어 우리가 달려온 목적인, 마인크래프트 서버를 여는 것을 달성했습니다. 이 상태에서 stop 을 눌러서 서버를 멈춰보겠습니다.

폴더 안에 수 많은 파일들이 생긴 것을 확인할 수 있습니다. 방금전까지는 보이지 않던 plugins, world, world_nether, world_the_end 폴더가 생겼고, 다른 파일들도 잔뜩 보입니다. 각각의 설명을 적어두겠습니다.

logs - 마인크래프트 서버에서 발생한 모든 로그는 압축 파일의 형태로 이곳에 저장됩니다.

plugins - 서버를 운용하는데에 있어서 유용한 플러그인을 여기에 넣으면 됩니다.

world - 기본적인 월드입니다.

world_nether - 지옥을 나타냅니다.

world_the_end - 엔더 월드를 나타냅니다.

banned-ips.json / banned-players.json - 접속이 금지된 플레이어 및 IP 명단이 여기에 저장됩니다.

bukkit.yml - 서버 파일의 설정을 할 수 있는 파일입니다. 메모장으로 열 수 있습니다.

commands.yml - 특수한 명령어를 지정하기 위한 파일이지만 실질적으로 쓰이진 않습니다.

help.yml - 도움말이라고는 하나 큰 의미는 없어보입니다.

ops.json - 서버의 관리자 명단이 여기에 저장됩니다.

permissions.yml - 플레이어 및 그룹 별 권한을 설정할 수 있습니다만 대부분 플러그인을 통해 변경합니다.

server.properties - 서버의 설정을 할 수 있는 파일입니다. 메모장으로 열 수 있습니다.

spigot.yml - 서버 파일의 설정을 할 수 있는 파일입니다. 메모장으로 열 수 있습니다.

usercache.json - 접속했었던 플레이어의 정보를 저장하는 파일입니다. 함부로 수정하면 안됩니다.

whitelist.json - 여기에 적혀있는 닉네임을 가진 플레이어만 접속할 수 있게 하는 파일입니다. 서버에서 whitelist on 명령을 실행해야 의미가 있습니다.

수 많은 파일들 중 우리는 server.properties 파일 정도만 수정하면 됩니다. 다른 파일들도 수정이 가능하긴 하나 명확한 이해 없이 이러한 파일들을 수정하는 건 서버를 망가뜨릴 수 있기에 따로 설명하지는 않겠습니다. 이 부분에 대해서 궁금하신 내용이 있다면 언제든 댓글로 문의해주세요.

server.properties 를 메모장으로 열어보면, 다음과 같은 내용들이 나옵니다.

#Minecraft server properties
#Tue Aug 13 05:04:01 KST 2024
spawn-protection=16 - 스폰포인트 반경 블록은 관리자가 아닌 경우 파괴할 수 없게 설정합니다. 기본값이 16입니다.
max-tick-time=60000 - 서버에 접속하는데에 걸리는 최대 시간으로, 이 시간내에 접속이 이루어지지 않으면 강제퇴장됩니다.
query.port=25565 - 서버가 운영되는 포트입니다. 기본값이 25565이며 이 값을 변경하면 다른 포트에서 서버를 열 수 있습니다.
generator-settings= - 사용하지 않음
force-gamemode=false - 게임모드를 변경하지 못하게 합니다. 싱글플레이에 치트 기능과 동일합니다.
allow-nether=true - 지옥문을 여는 것을 허용하거나 금지합니다. true를 false로 변경하면 금지됩니다.
enforce-whitelist=false - 화이트리스트에 추가되어 있는 플레이어만 들어올 수 있도록 강제합니다. 기본값이 false 입니다.
gamemode=survival - 서버에 처음 접속하였을 때의 기본 게임모드를 설정합니다. 영문으로 작성해야 합니다.
broadcast-console-to-ops=true - 콘솔에서 내린 명령이 관리자들에게 보이게 설정합니다. 기본값이 true 입니다.
enable-query=false - 서버의 정보를 다른 포트를 이용하여 내보낼 수 있게 합니다. true 로 설정해야 포트를 설정할 수 있습니다.
player-idle-timeout=0 - 잠수 상태의 플레이어가 강제퇴장 될때까지의 시간입니다. 0일 경우 강제퇴장 당하지 않습니다.
difficulty=easy - 기본 난이도를 설정합니다. 
spawn-monsters=true - 플레이어를 공격하는 엔티티의 소환 여부입니다. 기본값이 true 입니다.
broadcast-rcon-to-ops=true rcon에서 내린 명령이 관리자들에게 보이게 설정합니다. 기본값이 true 입니다.
op-permission-level=4 - 관리자의 권한을 설정합니다. 기본값이 4이며 보통 변경하지 않습니다.
pvp=true - 플레이어 간의 전투 가능 여부입니다. false 로 변경하면 플레이어 상호간 데미지를 입히지 못합니다.
snooper-enabled=true - 현재는 의미가 없는 옵션입니다.
level-type=default - 기본 맵의 타입을 결정합니다. default 일 경우 일반월드 가 기본으로 설정됩니다.
hardcore=false - 사망할 경우 서버 접속을 금지할지의 여부입니다. true 로 설정하면 서버 접속이 금지됩니다.
enable-command-block=false - 커맨드 블록의 사용 가능 여부입니다. true 로 설정하면 사용 가능해집니다.
max-players=20 - 서버에 들어올 수 있는 최대 인원의 설정입니다. 이 인원 수를 넘으면 들어올 수 없습니다.
network-compression-threshold=256 - 건드리지 않는 편이 좋습니다.
resource-pack-sha1= - 여기에 리소스팩의 링크를 적으면 서버에 접속하였을 떄 리소스팩을 다운로드할 수 있게 합니다.
max-world-size=29999984 - 최대 월드 사이즈를 지정합니다. 3천만을 넘을 수 없습니다.
function-permission-level=2 - 건드리지 않습니다.
rcon.port=25575 - rcon 의 접속 포트를 설정합니다.
server-port=25565 - query-port 와 같이 변경되어야 합니다.
debug=false - 서버 디버그 기능을 활성화할지의 여부입니다. true로 변경하면 활성화됩니다.
server-ip= - 비워두어야 합니다.
spawn-npcs=true - 주민 소환 여부입니다. true가 기본값입니다.
allow-flight=false - 스페이스바를 두 번 누르면 날 수 있게 할 지의 여부입니다. false가 기본값입니다.
level-name=world - 기본 맵을 결정합니다. 건드리지 않습니다.
view-distance=10 - 건드리지 않습니다.
resource-pack= - resource-pack-sha1 과 같이 사용됩니다.
spawn-animals=true - 동물들의 소환 여부입니다. true가 기본값입니다.
white-list=false - 화이트리스트에 추가되어 있는 플레이어만 서버에 들어올 수 있는지의 여부입니다. 기본값이 false 입니다.
rcon.password= - rcon 을 사용하기 위해서 비밀번호를 적어야 하지만, rcon 기능이 꺼져있다면 비워둬야 합니다.
generate-structures=true - 마을과 같은 구조물을 생성하는지 여부입니다. true 가 기본값입니다.
max-build-height=256 - 블럭을 설치할 수 있는 최대 높이입니다. 256가 기본값입니다.
online-mode=true - 정품 유저만 들어올 수 있는 서버로 둘지 여부입니다. false 로 변경하면 복제품 유저가 들어올 수 있습니다.
level-seed= - world 폴더가 비어있는 경우 여기에 시드를 넣었을 때 해당 시드의 맵이 생성됩니다.
use-native-transport=true - 건드리지 않습니다.
prevent-proxy-connections=false - 건드리지 않습니다.
enable-rcon=false - rcon 을 활성화합니다. true로 변경하면 활성화됩니다.
motd=A Minecraft Server - 멀티플레이 서버 목록에 나오는 메시지입니다. 

특별히 server.properties 에서 건드려줘야 할 만한 내용은 없습니다만, 아까 포트포워드 문단에서 말씀드렸듯이 서버가 돌아가는 포트를 변경할 수 있습니다. server-port = 25565 의 값을 원하는 포트로 변경하면 됩니다.

그런데 여기서 포트를 변경하게 되면, 아까 포트포워딩 해주었던 설정과 방화벽 설정에서 25565 를 내가 변경한 포트로 바꾸어주어야 합니다. 사실 이는 당연한 사실인데, 서버가 돌아가는 포트를 바꾼다고 하더라도 공유기와 방화벽은 25565 가 내가 사용하고자 하는 포트라고 알고 있기 때문입니다.

거듭 말씀드리지만 이는 추천하지 않습니다. 25565 가 아닌 다른 포트를 사용할 경우 다른 플레이어들이 접속할 때 자신의 IP 주소 뒤에 :포트 를 입력하여 들어와야 하기에 번거롭고, 관리자의 입장에서도 번거로울 여지가 훨씬 많기 때문입니다.

# 덧붙이는 말

예시를 일반 서버용 서버 파일로 들어서 모드 서버에 대한 설명은 충분하지 않은데, 모드 서버용 서버 파일을 다운받은 후 지금과 같은 과정을 거쳤다면 생성된 파일들에 mods 라는 폴더가 추가로 생성되었을 겁니다.

거기에 다같이 플레이하고자 하는 모드를 서버 파일이 지원하는 버전에 맞게 넣어주시면 되는데, 여기에 주의할 점이 몇가지 있습니다.

첫째, 서버에 추가해야 하는 모드는 게임 플레이에 있어서 직접적인 영향을 주는 모드들만 넣으면 됩니다. 한글패치라던가 부드러운 글꼴, 옵티파인, jei 등 게임 플레이에 있어서 직접적인 영향을 주지 않는 모드는 넣을 필요가 없습니다.

물론 이러한 모드를 넣는다고 해도 서버를 실행하면 이 모드들에 대한 예외처리를 진행하고 정상적으로 서버가 실행되겠지만, 서버를 킬때마다 매번 콘솔 창에서 경고문을 봐야하기 때문에 거슬릴 수 있습니다.

둘째, 이미 모드가 추가되어 플레이를 진행중이던 맵에 새로운 모드를 추가하지 않아야 합니다. 새로운 모드를 추가하게 되더라도 작동하는데에 있어서는 크게 문제가 되지는 않지만, 아이템 코드가 뒤죽박죽이 되거나 모드에서 필요로 하는 자원이 맵에서 나오지 않는 등의 굉장히 많은 부작용이 있습니다.

따라서 모드 서버를 열고자 한다면 반드시 맵을 생성하기 이전에 추가하고자 할 모드를 모두 준비해두고, 한번에 로드를 시키는 것이 오류와 버그를 줄일 수 있는 가장 좋은 방법입니다.

# 마치며

생각보다 마인크래프트 서버를 열기 위한 과정은 많은 노력이 들어갑니다. 이 글에 적힌 내용을 그대로 따라한다면 크게 문제가 없겠으나, 실수로 한 가지만 잘못 설정하더라도 서버에 정상적으로 들어올 수 없기 때문입니다.

처음 이 글을 쓰겠다고 기획할 당시에는 그냥 포트포워딩에 대한 부분만 설명하고, 서버 구동기와 서버 파일을 압축해서 바로 다운로드 받을 수 있게 올려놓을까 생각도 했습니다.

그러나 이 블로그에 작성되는 모든 글들에 있어서 공통적인 목표가 있습니다. 바로 '보고 따라하게끔 하는게 아니라, 원리와 이유를 납득시키는 글을 쓰자' 는 겁니다.

서버를 여는데에 있어서 파일도 그냥 전부 다운로드 받고, 어떤 옵션이 왜 존재하는지도 모르는 상태에서 서버를 열게 된다면 서버를 운용하는데에 있어서 문제가 발생했을 때 해결할 수 있는 능력이 전무하겠죠.

이는 이 글에서 다룬 내용 뿐만이 아니라 모든 일에 대해서 적용됩니다. 원리와 이유를 알지 않고 베끼기만 해서는 조금만 응용해도 해결할 수 있는 문제들을 전혀 자력으로 해결할 수 없게 됩니다.

앞으로도 제 블로그에 와서 제 글을 읽어주시는 많은 분들께 있어서, 한 번만 제대로 읽어도 글에서 다룬 주제에 대해 완벽한 이해를 가져가실 수 있는, 꽉 차 있는 글을 쓰기 위해서 최선을 다하겠습니다.

틀린 부분이나 궁금하신 부분이 있다면 댓글을 남겨주시거나, mastersulgi@studysulgi.xyz 로 메일을 보내주세요.

확인하는대로 바로 답변을 드리도록 하겠습니다.