DayZ 서버를 DDoS 공격으로부터 방어하기
DayZ 서버에 실제로 필요한 포트는 무엇인지, Steam 쿼리 포트와 BattlEye RCon, 로그인 대기열, 재시작 직후의 시작 단계는 어떻게 보호하는지, 그리고 어느 공격 규모부터 서버 앞단 네트워크의 필터링만이 통하는지 정리했습니다.
저녁 한복판에 플레이어 전원을 튕겨 내고 그 뒤로 몇 분씩 서버 브라우저에서 사라지는 DayZ 서버는 하드웨어 문제인 경우가 드뭅니다. 대개는 공격이 진행 중이고, 그것도 플레이어가 가장 많이 접속해 있거나 예정된 재시작이 다가오는 바로 그 시점에 벌어집니다. DayZ 서버를 DDoS 공격으로부터 방어하려면 두 가지가 모두 필요합니다. 서버에서의 깔끔한 포트 개방과 그 앞단 네트워크에서의 필터링입니다. 이 글은 먼저 추가 비용 없이 직접 조치할 수 있는 것을 보여 주고, 그다음 그 조치가 기술적으로 어디에서 한계에 이르는지, 마지막으로 그때 서버 앞단에서 무엇이 이뤄져야 하는지 설명합니다.
모든 내용은 serverDZ.cfg를 쓰는 자체 DayZ 전용 서버를 기준으로 하며, Windows Server에서 돌아가든 Debian과 Ubuntu에서 호환성 계층을 거쳐 돌아가든 같습니다. Bohemia Interactive는 stable 브랜치용으로 실서비스에 쓸 수 있는 네이티브 Linux 서버 프로그램을 내놓지 않고, 실험용 Linux 빌드는 실험용 클라이언트만 받습니다. Linux 명령은 root 기준으로 적었으니, 일반 사용자라면 앞에 sudo를 붙이세요.
공격이 지금 진행 중이라면, serverDZ.cfg를 지금 건드리지 마시고 서버를 재시작하지 마세요. DayZ 재시작은 모드와 중앙 경제를 다시 불러오며 몇 분을 잡아먹고, 그 동안 서버는 확실하게 오프라인입니다. 먼저 측정값을 확보하세요(“로그 기록” 절 참고). 공격이 끝나면 그 값은 사라집니다.
DayZ 서버가 DDoS 공격의 표적이 되는 일이 많은 이유
DayZ에는 서버를 손쉬운 표적으로 만드는 특성이 여러 가지 겹쳐 있습니다. 첫째, 커뮤니티 서버는 자기 주소를 스스로 공개합니다. 게임의 서버 브라우저와 DZSA 런처에 올라가려면 Steam 쿼리에 응답해야 하고, 그 응답에는 IP 주소와 포트가 평문으로 담깁니다. 그러니 공격자는 무엇을 알아낼 필요가 없고, 목록 하나만 읽으면 됩니다.
둘째, DayZ 서버의 하루 일정이 공개되어 있습니다. 사실상 모든 프로젝트가 세 시간에서 네 시간마다 자동으로 재시작하고, 이를 채팅 메시지로 알리며, 일정을 Discord에 적어 둡니다. 정확히 이 시간대에 들어오는 공격은 두 배로 작용합니다. 서버는 어차피 그 순간 접근할 수 없고, 대기 화면에 걸려 있는 플레이어는 다른 곳으로 떠납니다.
셋째, 플레이어가 걸고 있는 것이 큽니다. DayZ에서 하필 그 순간의 장애는 짜증에서 끝나지 않고, 잃어버린 장비와 중단된 레이드, 그리고 세상에 무방비로 남겨진 기지를 뜻합니다. 그래서 차단된 플레이어, 적대 관계의 그룹, 경쟁 프로젝트가 가장 흔한 의뢰인입니다. 흔한 booter 서비스를 통한 공격은 시작하는 쪽에 실력도 이렇다 할 비용도 요구하지 않습니다.
넷째, DayZ의 모든 트래픽은 UDP로 흐릅니다. UDP에는 요구할 수 있는 연결 수립 절차가 없고, 출발지 주소는 위조할 수 있습니다. 그래서 공격자는 부하를 만들기 위해 서버에 들어올 필요도, 규격에 맞게 말을 걸 필요도 없습니다. 제작사조차 여기서 예외가 아니라는 사실은 2025년 2월이 보여 주었습니다. DayZ와 Arma Reforger를 담당하는 Bohemia Interactive의 온라인 서비스가 한 주 넘게 DDoS 공격을 받았고, 2025년 2월 3일에 확인되었으며 2025년 2월 6일에도 아직 끝나지 않았고, 커뮤니티 서버도 함께 영향을 받았습니다. DDoS 공격이 구체적으로 무엇인지는 DDoS 공격이란 무엇인가? 글에서 설명합니다.
DayZ 서버의 포트: 사실 정리 표
DayZ 서버는 UDP만 사용합니다. TCP 게임 포트는 없습니다. DayZ에서 정말로 고정된 값은 게임 포트인 2302/UDP 하나뿐이고, 나머지는 모두 설정할 수 있으며 호스팅 업체마다 다릅니다. 그러니 기본값에 의존하지 말고 본인의 시작 명령줄과 본인의 serverDZ.cfg를 직접 확인하세요.
| 포트 | 프로토콜 | 용도 | 설정 위치 | 공개 네트워크에 열어야 하나요 |
|---|---|---|---|---|
| 2302 | UDP | 게임 포트, 음성 통신을 포함한 모든 게임 트래픽 | 시작 명령줄의 -port=2302 |
예 |
| 2303부터 2305까지 | UDP | 엔진이 게임 포트 위쪽으로 함께 차지하는 구간 | -port 값에서 자동으로 정해짐 |
보통 예 |
| 2305 또는 27016 | UDP | Steam 쿼리 포트: 서버 브라우저와 DZSA 런처의 항목 | serverDZ.cfg의 steamQueryPort |
예, 그러지 않으면 서버가 보이지 않음 |
| 자유롭게 지정, 보통 2305 또는 2310 | UDP | BEC이나 DaRT 같은 관리 도구용 BattlEye RCon | BEServer_x64.cfg의 RConPort |
아니요 |
| 22 | TCP | 운영체제의 SSH 접속 | sshd_config |
본인 주소만 |
| 3389 | TCP | Windows 서버의 원격 데스크톱 | 시스템 설정 | 아니요 |
| 8080과 2022 | TCP | 게임 패널의 웹 인터페이스와 SFTP, 여기서는 Pterodactyl을 예로 들었습니다 | 패널 설정 | 아니요 |
두 값이 자주 혼란을 일으키니 여기서 정리해 두겠습니다. Steam 쿼리 포트: Bohemia가 함께 제공하는 예시 설정은 steamQueryPort = 2305;로 두지만, 호스팅 업체의 상당수는 27016/UDP를 씁니다. 두 값 모두 유효하며, 결정적인 것은 오직 본인 파일에 들어 있는 값입니다. BattlEye RCon 포트: 여기에는 구속력 있는 표준이 아예 없습니다. 널리 쓰이는 경험 법칙은 게임 포트에 3을 더한 2305이고, 다른 업체는 2310을 씁니다. DayZ 1.13부터 BattlEye는 BEServer_x64.cfg의 RConPort 파라미터를 확실하게 반영하지만, 그 전에는 포트를 예측하기 어려웠습니다.
여기서 많은 운영자가 빠지는 함정이 하나 나옵니다. steamQueryPort와 RConPort를 절대 같은 값으로 두지 마세요. 설정이 Steam 쿼리에 2305를 쓰고 있다면 RCon은 다른 포트, 예를 들어 2310으로 옮겨야 합니다.
Steam 쿼리 포트가 가장 취약한 포트인 이유
Steam 쿼리 포트는 A2S_INFO, A2S_PLAYERS, A2S_RULES 세 가지 조회에 응답합니다. A2S_INFO는 서버 이름과 맵, 플레이어 수, 버전을, A2S_PLAYERS는 접속해 있는 플레이어의 이름을, A2S_RULES는 설정된 서버 변수를 돌려줍니다. 이 응답은 하나하나가 그것을 불러낸 조회보다 훨씬 크고, 바로 그 점이 이 포트를 이중으로 위험하게 만듭니다.
표적이 되는 여러분에게 이것은 이런 뜻입니다. 공격자는 조회 하나에 몇 바이트만 들여 여러분의 쿼리 포트를 붙잡아 둘 수 있고, 그 사이 서버는 매번 완전한 응답을 만들어 내보냅니다. 제3자에게는 이런 뜻입니다. 공격자는 출발지 주소를 위조해 여러분의 서버를 조회하고, 그 응답을 자기가 실제로 노리는 대상으로 돌릴 수 있습니다. 그러면 여러분의 서버는 피해자일 뿐 아니라 증폭기가 됩니다. Valve가 2020년 12월에 A2S_INFO에 챌린지 조회를 더한 이유가 여기에 있습니다. 서버가 먼저 난수로 답하고, 조회한 쪽이 그 값을 되돌려 보내야 합니다. 이는 증폭을 누그러뜨리지만 끝내지는 못합니다. 모든 조회가 이 경로를 거치는 것은 결코 아니기 때문입니다.
DayZ에는 다른 게임에 없는 특이점이 하나 있습니다. 서로 다른 서버 목록 두 곳이 여러분에게 조회를 보냅니다. 게임에 내장된 커뮤니티 서버 브라우저와 널리 쓰이는 DZSA 런처입니다. 그래서 쿼리 포트를 그냥 닫는 것은 선택지가 아닙니다. 닫으면 직접 접속은 계속 되는데도 프로젝트가 두 목록에서 모두 사라지기 때문입니다. 닫지 말고 제한하는 것이 올바른 답입니다.
돈을 쓰기 전에 직접 할 수 있는 일
이 절이 가장 길고, 의도한 바입니다. 설정이 깔끔한 DayZ 서버는 어디에 놓여 있든 작거나 중간 규모의 공격을 자체 힘으로 견뎌 냅니다.
1. 현황 파악: DayZ 서버가 실제로 열고 있는 포트
방화벽 규칙을 한 줄이라도 쓰기 전에 서버가 외부에 무엇을 내주고 있는지 확인하세요. 추측하지 말고 직접 확인합니다. Linux에서는 다음과 같습니다.
ss -lnup
ss -lntup
Windows Server에서는 명령 프롬프트가 같은 그림을 보여 줍니다.
netstat -ano -p UDP | findstr "2302 2303 2304 2305 27016"
여기서 중요한 것은 로컬 주소 열입니다. 0.0.0.0:2302는 “인터넷 전체에서 접근할 수 있음”을 뜻하고, 127.0.0.1:2310은 “로컬에서만 접근할 수 있음”을 뜻하므로 방화벽 개방이 필요하지 않습니다. 그다음에는 안내 문서에 의존하지 말고 실제 값을 설정 파일에서 직접 읽으세요.
grep -iE "steamQueryPort|maxPlayers|password|enableWhitelist|verifySignatures" serverDZ.cfg
grep -iE "RConPort|RestrictRCon" battleye/BEServer_x64.cfg
공격자의 시선은 다른 머신에서 외부로 실행하는 UDP 포트 스캔이 보여 줍니다.
nmap -Pn -sU -p 2302-2310,27015-27020 YOUR.SERVER.IP.ADDRESS
2. 시작 명령줄과 serverDZ.cfg가 정말로 필요한 것만 열기
DayZ에는 외부로 두 가지 개방이면 충분합니다. 게임 포트 구간과 쿼리 포트입니다. 나머지는 모두 본인 주소로 제한하거나 애초에 공개하지 않습니다. UFW에서는 다음과 같이 하며, 스스로 접속이 막히지 않도록 반드시 이 순서를 지키세요.
ufw allow 22/tcp comment 'SSH'
ufw allow 2302:2305/udp comment 'DayZ 게임 포트'
ufw allow 27016/udp comment 'DayZ Steam 쿼리'
ufw allow from 203.0.113.10 to any port 2310 proto udp comment 'BattlEye RCon'
ufw default deny incoming
ufw default allow outgoing
ufw --force enable
ufw status verbose
203.0.113.10은 본인 주소로, 27016은 본인의 steamQueryPort 줄에 실제로 들어 있는 값으로 바꾸세요. 복구 방법까지 포함한 전체 안내는 스스로 접속이 막히지 않게 UFW 방화벽 설정하기에 있습니다. Windows 서버에서도 원칙은 같습니다. 포트 그룹마다 인바운드 규칙 하나, 원격 데스크톱은 본인 주소로 제한, 나머지는 모두 차단입니다.
3. Steam 쿼리 포트는 닫지 말고 제한하기
출발지 주소별 상한은 정상적인 서버 목록과 쿼리 플러드를 갈라 냅니다. 서버 브라우저는 초 단위로 조회하고, 공격자는 밀리초 단위로 조회합니다.
iptables -I INPUT -p udp --dport 27016 -m hashlimit --hashlimit-name dayz_query --hashlimit-mode srcip --hashlimit-above 10/sec --hashlimit-burst 20 -j DROP
iptables -I INPUT -p udp --dport 2302 -m hashlimit --hashlimit-name dayz_game --hashlimit-mode srcip --hashlimit-above 600/sec --hashlimit-burst 900 -j DROP
첫 번째 규칙은 같은 출발지에서 초당 열 번을 지속적으로 넘는 Steam 쿼리를, 두 번째 규칙은 초당 600개를 넘는 게임 패킷을 폐기합니다. 두 숫자는 모두 출발점일 뿐이고 정답이 아닙니다. 플레이어 60명이 꽉 찬 서버는 빈 서버보다 훨씬 많은 패킷을 만들고, 너무 좁게 잡으면 자기 플레이어를 내쫓거나 서버 목록에서 떨어져 나갑니다. 먼저 평상시 운영에서 한 주는 측정하세요.
iptables 규칙만 쓰면 재시작 후에 사라집니다. Debian과 Ubuntu에서는 다음과 같이 저장합니다.
apt-get install -y iptables-persistent
netfilter-persistent save
UFW를 쓴다면 이런 규칙은 /etc/ufw/before.rules에 들어가야 합니다. 그러지 않으면 다음 ufw reload에서 사라집니다. 여기에 더해 Steam 서버 라이브러리에는 연결 없는 패킷을 위한 자체 제동 장치가 있습니다. 환경 변수 STEAM_GAMESERVER_RATE_LIMIT_200MS는 200밀리초 창 안에 설정값보다 많은 패킷이 들어오는 즉시 해당 주소의 A2S 패킷을 모두 폐기합니다.
세 번째 항목은 비용이 전혀 들지 않습니다. Discord 봇이나 프로젝트 페이지가 플레이어 수를 보여 준다면, 방문자 쪽에서 서버를 조회하게 하지 말고 결과를 일정한 간격으로 저장해 두세요. 그러면 방문자가 많은 상태 페이지도 방문자마다 조회 하나가 아니라 간격마다 조회 하나만 만듭니다.
4. BattlEye RCon을 공개 네트워크에서 빼기
BattlEye는 DayZ의 안티치트 구성 요소이고 serverDZ.cfg에서 BattlEye = 1;로 켭니다. 반면 원격 관리 기능은 별도 파일에 있습니다. BEServer_x64.dll 옆의 BattlEye 디렉터리에 놓인 BEServer_x64.cfg이며, 이 디렉터리는 시작 명령줄에서 -BEpath=로 지정합니다.
RConPassword ALongRandomPassword
RConPort 2310
RestrictRCon 0
여기에 규칙이 세 가지 있습니다. 첫째, RCon 포트는 TCP가 아니라 UDP입니다. 실수로 proto tcp라고 적은 방화벽 규칙은 아무것도 걸러 내지 못하면서 동시에 관리 도구를 헛돌게 만듭니다. 둘째, 이 포트는 관리자 주소로만 제한하세요. 고정 주소가 없는 분은 포트를 외부에 완전히 닫아 두고, 관리 도구를 서버에서 직접 실행하세요. SSH나 원격 데스크톱으로 접근할 수 있습니다. 셋째, RestrictRCon 1은 RCon으로 실행할 수 있는 명령을 제한하며, 접근 권한을 가진 사람이 한 명을 넘는 순간부터 올바른 설정입니다.
열려 있는 RCon 포트는 두 가지를 동시에 뜻합니다. 비밀번호를 하나씩 대입해 보라는 초대장이고, 플러딩할 수 있는 또 하나의 UDP 포트입니다. 개방을 주소 몇 개로만 한정하는 순간 둘 다 사라집니다.
5. 로그인 대기열, 허용 목록, 슬롯 고갈
DayZ는 연결을 한꺼번에 처리하지 않고 대기열을 거쳐 처리합니다. serverDZ.cfg의 다섯 값이 이를 제어합니다.
maxPlayers = 60;
loginQueueConcurrentPlayers = 5;
loginQueueMaxPlayers = 100;
guaranteedSlots = 10;
maxPing = 200;
loginQueueConcurrentPlayers는 동시에 들여보내는 플레이어 수를 정하고(기본값 5), loginQueueMaxPlayers는 대기열 자체의 크기를 제한합니다(보통 100에서 500 사이). 슬롯 고갈이 노리는 지점이 정확히 여기입니다. 공격자에게는 대역폭이 필요하지 않고, 대기열을 채울 만큼 충분한 계정이나 연결 시도만 있으면 됩니다. 그러면 서버가 기술적으로는 흠 없이 돌아가는데도 실제 플레이어가 들어오지 못합니다. guaranteedSlots는 팀을 위한 자리를 예약해 두어, 바로 이런 상황에서도 여러분이 서버에 들어갈 수 있게 해 줍니다.
여기에는 내장 허용 목록이 도움이 됩니다. enableWhitelist = 1;로 켜면 그다음부터 profiles/whitelist.txt 파일을 한 줄에 Steam64 ID 하나씩 읽습니다. 목록에 없는 ID는 연결 단계에서 거부됩니다. 이 파일은 서버 시작 시점에 읽히므로 변경 사항은 재시작이 필요합니다. serverDZ.cfg에 password를 더하는 것도 비슷하게 작동하지만 더 약합니다. 비밀번호는 남에게 전달되고 Steam64 ID는 그렇지 않기 때문입니다.
여기서 한 가지는 분명히 해 두어야 합니다. 허용 목록은 플레이어 자리를 지켜 주고 회선은 지켜 주지 않습니다. 서버를 플러딩하는 공격자는 애초에 접속할 생각이 없습니다. 그 패킷은 거부되지만 이미 도착해 있고, 핵심은 바로 그것입니다.
6. 모드, 서명 검증, 재시작 직후의 시간대
DayZ에서 모드는 편의의 문제로만 그치지 않고 공격 표면의 일부입니다. serverDZ.cfg의 네 가지 설정은 어떤 경우에도 넣어야 합니다.
verifySignatures = 2;
forceSameBuild = 1;
allowFilePatching = 0;
BattlEye = 1;
verifySignatures = 2는 모든 PBO 파일을 그에 딸린 .bisign 서명과 맞춰 검증하며, 이를 위해 keys 폴더에 맞는 .bikey 파일이 있어야 합니다. forceSameBuild = 1은 서버와 정확히 같은 게임 버전을 요구합니다. allowFilePatching = 0은 변경된 게임 파일로 실행된 클라이언트의 접속을 거부합니다. 이 설정 가운데 볼류메트릭 공격을 멈추는 것은 하나도 없지만, 세 가지 모두 조작된 클라이언트가 서버의 흐름을 흐트러뜨리는 경로를 막아 줍니다.
두 번째 항목이 더 중요하고 거의 항상 간과됩니다. 시작 단계입니다. DayZ 서버는 시작할 때 먼저 시작 명령줄의 모드 목록을 불러오고, 그다음 모든 루트 테이블을 담은 중앙 경제를 불러옵니다. 모드를 많이 넣은 서버라면 이것이 쉽게 몇 분에 이르고, 그 동안 서버는 Steam 쿼리에 단 하나도 응답하지 않습니다.
./DayZServer -config=serverDZ.cfg -port=2302 -profiles=./profiles -BEpath=./battleye -mod=@CF;@YourMod;@AnotherMod -cpuCount=4 -dologs -adminlog -netlog -freezecheck
사실상 모든 프로젝트가 세 시간에서 네 시간마다 재시작하고 그 일정까지 알려 주기 때문에, 공격자가 이 시간대를 맞추는 것은 아주 쉽습니다. 효과가 있고 비용이 들지 않는 대응이 세 가지 있습니다. 모드 목록을 가능한 한 짧게 유지하세요. 모드를 하나 더할 때마다 바로 이 시간대가 길어집니다. 재시작 시각을 정시가 아니라 어긋난 값으로 잡으세요. 그리고 시작이 실제로 얼마나 걸리는지 추측하지 말고 한 번 측정하세요. timeStampFormat = "Full";과 logFile 설정이 있으면 그 시간이 로그에 남습니다.
7. 연결 추적, 수신 버퍼, 커널 파라미터
자주 간과되는 병목이 커널의 연결 추적입니다. UDP에는 연결이라는 개념이 없지만, 커널은 그래도 출발지 주소와 목적지 주소의 조합마다 항목을 만듭니다. 테이블이 가득 차면 서버는 정상 패킷까지 폐기하고, 로그에는 “nf_conntrack: table full”이 남습니다. 현재 값과 상한은 다음 명령으로 확인합니다.
sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max
순수한 게임 서버라면 깔끔한 해법은 게임 트래픽을 애초에 추적하지 않게 하고, 여기에 더해 수신 버퍼와 네트워크 카드의 대기열을 키우는 것입니다.
iptables -t raw -A PREROUTING -p udp --dport 2302 -j NOTRACK
iptables -t raw -A OUTPUT -p udp --sport 2302 -j NOTRACK
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.rmem_default=1048576
sysctl -w net.core.netdev_max_backlog=5000
sysctl -w net.netfilter.nf_conntrack_max=524288
주의하실 점이 있습니다. NOTRACK과 상태 기반 규칙은 함께 쓸 수 없습니다. 게임 포트를 추적에서 빼면 그 포트에는 -m conntrack --ctstate를 쓰는 규칙을 더 이상 쓸 수 없고, 그러지 않으면 개방이 동작하지 않습니다. sysctl 값을 계속 유지하려면 /etc/sysctl.d/에 넣어야 합니다. 그러지 않으면 다음 재시작 후에 사라집니다.
8. 여러분의 IP 주소는 서버 브라우저에 올라가 있습니다
여기서는 희망 섞인 기대보다 솔직함이 낫습니다. 공개 DayZ 서버의 IP 주소는 비밀로 유지할 수 없습니다. 한 번이라도 접속한 플레이어는 모두 그 주소를 알고, 서버 브라우저가 공개하며, DZSA 런처가 그 값을 담아 둡니다. 주소 변경은 몇 시간을 벌어 주고, 며칠을 벌어 주는 일은 드뭅니다.
더 효과적인 것은 두 가지 습관입니다. 원본 IP 주소를 어디에도 따로 공개하지 마세요. 고정해 둔 Discord 게시물에도, 프로젝트 페이지에도 적지 않습니다. 그리고 DNS 항목을 정리하세요. 이전 주소를 가리키는 A 레코드를 잊고 방치하면 어떤 변경도 무의미해지고, 대부분의 주소 변경이 바로 여기서 실패합니다. 예전 서버에 상태 서비스를 계속 돌려 두면 새 주소까지 함께 알려 주는 셈입니다.
9. 공격 중에 추측하지 않도록 로그 기록하기
가장 중요하면서 거의 아무도 미리 하지 않는 단계가 있습니다. 모든 것이 정상으로 돌아가는 동안에 기준값을 만들어 두는 것입니다. 평상시 값이 없으면 사건이 끝난 뒤에 초당 40,000 패킷이 많았던 것인지 그냥 토요일 저녁이었던 것인지 말할 수 없습니다. 서버 쪽에서는 이를 위해 내장 로그를 켭니다.
timeStampFormat = "Short";
logAverageFps = 300;
logPlayers = 300;
logFile = "server_console.log";
여기서 logAverageFps가 DayZ가 내주는 가장 솔직한 값입니다. 플레이어 수가 그대로인데 서버 프레임 레이트가 떨어진다면 모드나 경제의 문제입니다. 플레이어가 튕겨 나가는데 프레임 레이트가 안정적이라면 네트워크의 문제입니다. 시스템 쪽에서는 apt-get install -y vnstat sysstat로 측정이 상시 돌아가고, 사건이 진행되는 동안에는 네 개의 명령으로 충분합니다.
sar -n DEV 1 10
ip -s link show eth0
dmesg -T | tail -50
tcpdump -ni eth0 udp port 2302 -c 200 -q
tcpdump에는 한 가지 원칙이 있습니다. 항상 -c로 개수를 제한하세요. 과부하 상태에서의 캡처는 이미 과부하인 서버에 부담을 더 얹습니다. 측정값을 해석하는 방법은 서버에서 DDoS 공격 알아내기에 있습니다.
자체 방어가 한계에 이르는 지점: 대역폭과 패킷 전송률
이제 어떤 설정 파일로도 해결할 수 없는 부분입니다. 지금까지의 모든 조치는 여러분의 서버, 즉 회선의 끝에서 동작합니다. 방화벽 규칙은 이미 케이블을 지나온 패킷을 두고 판단합니다. 그 패킷을 폐기할 수는 있지만, 보내지 않은 것으로 만들 수는 없습니다.
| 항목 | 값 | DayZ 서버에 어떤 뜻인가 |
|---|---|---|
| 일반적인 게임 서버의 회선 | 1 Gbit/s | 초당 125 메가바이트, 그 위로는 회선이 꽉 찬다 |
| 64 바이트 패킷일 때의 패킷 전송률 | 1 Gbit/s 안에 초당 약 149만 개 | 일반적인 서버 커널은 그중 수십만 개만 처리한다 |
| 게임 서버 프로젝트를 겨냥한 일반적인 공격 규모 | 5에서 50 Gbit/s | 여러분 회선의 5배에서 50배 |
| KernelHost 서버에서 걸러 낸 최대치 | 초당 4,150만 패킷을 넘는 상황에서 473.4 Gbit/s 이상 | 이 규모에서는 어떤 로컬 설정도 더 이상 통하지 않는다 |
| KernelHost에서 걸러 낸 게임 서버 대상 UDP 플러드 | 112.2 Gbit/s 이상 | 서버 앞단 네트워크에서 끝나야 한다 |
| serverDZ.cfg의 maxPlayers 기본값 | 60 | 초당 패킷의 평상시 값은 직접 측정해야 하며 프로젝트마다 다르다 |
DayZ에서는 패킷 전송률이 대역폭보다 먼저 터지는 일이 많고, 이유는 단순합니다. 게임 트래픽은 큰 패킷 몇 개가 아니라 작은 UDP 패킷 여러 개로 이뤄집니다. 그래서 회선을 3분의 1도 채우지 못하는 공격이 서버를 멈춰 세울 수 있습니다. 폐기하는 데 연산 시간이 다 들어가기 때문입니다. 운영자는 이것을 “사용률은 전혀 높지 않았는데 그래도 전부 랙 스파이크가 생기고 차례로 튕겨 나갔다”로 경험합니다.
볼류메트릭 공격은 서버 앞단 네트워크에서 끝나야 합니다. 이는 제품에 관한 주장이 아니라 물리 법칙입니다.
DayZ DDoS 방어: KernelHost가 이에 맞서 제공하는 것
모든 서버에서 동작하는 상시 방어
KernelHost의 DDoS 방어는 두 단계로 구성되어 있고 상시 동작합니다. 여러분이 무엇을 켜거나 주문하거나 설정할 필요가 없습니다.
- 1단계: 글로벌 스크러빙 네트워크의 17 Tbps 방어 용량. 볼류메트릭 공격은 발생지에 가까운 곳에서 정화되어 데이터센터에 닿기 전에 걸러집니다.
- 2단계: 프랑크푸르트암마인의 3.2 Tbps Arbor 실시간 필터링. 서버 바로 앞에서 프로토콜별 패턴을 찾아내 패킷 하나하나를 폐기합니다.
두 가지 특성이 결정적입니다. 이 방어는 상시 동작하므로 공격에 반응해서 비로소 시작될 필요가 없습니다. 그래서 초반에 서버가 사라지는 몇 분이 존재하지 않습니다. 그리고 null-routing을 쓰지 않습니다. 여러분의 IP 주소는 네트워크에 그대로 남고, 폐기되는 것은 악성 패킷뿐입니다. IP 주소를 네트워크에서 빼 버리는 쪽은 여러분에게 공격자와 똑같은 결과를 만들어 냅니다. 어떤 게임과 프로토콜이 포함되는지는 실시간 게임 서버 DDoS 방어에 정리되어 있습니다.
계속 공격받는 프로젝트를 위한 Advanced DDoS Protection
어떤 프로젝트는 어쩌다 한두 번이 아니라, 표적이 되어 몇 주에 걸쳐 공격받습니다. 이런 경우를 위해 Advanced DDoS Protection이 월 50.00 EUR부터, PrePaid 방식으로, 최소 이용 기간 없이 제공됩니다. 차이는 용량이 더 커지는 데 있지 않고 통제권에 있습니다.
- 전용 방어 IP: 프랑크푸르트 코어에서 발급되며, 서버는 자체 네트워크에서 이 IP로 전환됩니다. 여러분 쪽에서 손볼 것은 없습니다.
- 포트와 프로토콜별로 직접 관리하는 방어 규칙: 고객 포털에서 2302/UDP에 무엇을 허용할지, 쿼리 포트에 무엇을 허용할지, RCon 포트에 무엇을 허용할지를 따로 설정합니다. DayZ에서는 바로 이 분리가 지렛대입니다. 게임 트래픽과 쿼리 트래픽의 모습이 완전히 다르기 때문입니다.
- 변경은 실시간으로 반영: 티켓을 기다리지 않고 공격이 진행되는 중에도 값을 조정할 수 있습니다.
- 게임에 맞춘 방어 프로필: 모드를 많이 넣은 서버와 임의의 TCP 또는 UDP 포트에서 돌아가는 자체 애플리케이션도 함께 다룹니다.
두 단계 비교
| 항목 | 포함된 DDoS 상시 방어 | Advanced DDoS Protection |
|---|---|---|
| 요금 | 모든 서버 상품에 추가 요금 없이 포함 | 월 50.00 EUR부터, PrePaid |
| 필터링 용량 | 17 Tbps 글로벌 스크러빙과 프랑크푸르트암마인의 3.2 Tbps Arbor 실시간 필터링 | 동일한 2단계 필터링 |
| IP 주소 | 서버의 IP 주소 | 추가로 받는 전용 방어 IP |
| 규칙 세트 | 자동 프로필, 설정 불필요 | 고객 포털에서 포트와 프로토콜별 자체 규칙 |
| 변경 | 자동으로 함께 적용 | 실시간 반영, 공격 중에도 가능 |
| 게임 프로필 | DayZ를 포함한 주요 게임에 최적화된 프로필 | 게임에 맞춘 프로필, 모드를 많이 넣은 서버도 가능 |
| null-routing | 없음 | 없음 |
| 이용 기간 | 서버 상품에 연동 | PrePaid, 최소 이용 기간 없음, 해지 통보 기간 없음, 설치비 없음 |
대부분의 DayZ 프로젝트에는 깔끔한 서버 설정과 포함된 상시 방어면 충분합니다. Advanced DDoS Protection은 누군가 이 일을 개인적으로 받아들였을 때의 답입니다. 지금 DayZ 서버를 다른 곳에서 운영하고 있다면 이 방어를 나중에 덧붙일 수는 없습니다. 이 방어는 네트워크의 일부이고 KernelHost에 놓인 서버에 적용됩니다. 그 길은 서버 이전이며 추가 상품이 아닙니다.
자주 나오는 실수와 해결 방법
“서버가 DZSA 런처와 서버 브라우저에서 사라졌는데 직접 접속으로는 들어갑니다”: 대부분의 경우 공격이 아니라 쿼리 포트의 문제입니다. steamQueryPort에 방화벽과 다른 값이 들어 있거나, 너무 좁은 속도 제한이 서버 목록의 조회를 폐기하고 있습니다. 공격을 의심하기 전에 두 값을 서로 맞춰 확인하세요.
“포트를 필터링한 뒤로 RCon이 연결되지 않습니다”: BattlEye RCon은 UDP로 동작합니다. 같은 포트에 proto tcp로 개방해도 아무 효과가 없습니다. 그리고 RConPort와 steamQueryPort가 실수로 같은 값에 놓여 있는지도 확인하세요.
“IP 주소를 바꿨는데 두 시간 뒤에 다시 오프라인이 되었습니다”: 공격자는 새 주소를 예전 주소와 같은 출처에서 얻었습니다. 대개 서버 브라우저, Discord 상태 봇, 또는 오래된 DNS 항목입니다. 주소 변경은 시간을 벌어 주는 것이고 해결책이 아닙니다.
“공격이 매일 정확히 재시작 시점에 들어옵니다”: 우연이 아닙니다. 재시작 일정은 Discord에 적혀 있고 게임 안에서 공지되며, 모드와 경제가 불러와지는 동안 서버는 어차피 응답하지 않습니다. 더 짧은 모드 목록, 어긋난 재시작 시각, 그리고 공격에 반응해서 비로소 시작되는 것이 아니라 상시 동작하는 필터링이 이 패턴을 무력하게 만듭니다.
“모든 플레이어에게 랙 스파이크가 생기는데 네트워크는 조용합니다”: 그렇다면 DDoS 공격이 아니었습니다. 먼저 logAverageFps에서 서버 프레임 레이트가 떨어졌는지 확인하고, 그다음 중앙 경제와 모드 목록을 보세요. sar -n DEV 1 10이 계속 평범하다면 네트워크의 문제가 아닙니다.
“iptables 규칙이 적용되지 않습니다”: 흔한 원인이 세 가지입니다. 규칙이 UFW 체인 뒤에 있어 전혀 도달하지 못하거나, 마지막 재시작 이후 사라졌거나(이때는 netfilter-persistent save 또는 /etc/ufw/before.rules 항목이 도움이 됩니다), 공격이 볼류메트릭이어서 규칙은 이미 꽉 찬 회선에서 제대로 동작하고 있는 경우입니다. iptables -L INPUT -n -v로 매칭 카운터가 올라가는지 확인하세요. 0에 머물러 있으면 규칙에 도달하지 못하는 것입니다.
“기존 업체가 제 IP 주소를 차단했습니다”: 그것이 null-routing입니다. 업체는 그렇게 자기 네트워크를 지키지만, 여러분에게 남는 결과는 공격이 성공한 것과 똑같고, 보통 그 뒤로 몇 시간 더 이어집니다. 확실하지 않으면 필터링을 하는지 null-routing을 하는지 물어보세요. 그 답이 어떤 하드웨어 사양보다 여러분의 가용성을 더 크게 좌우합니다.
“tcpdump에 이상한 것이 보이지 않습니다”: 트래픽이 이미 앞단 네트워크에서 걸러지고 있으면 서버에는 아무것도 도착하지 않는 것이 당연합니다. 필터링이 작동하고 있을 때의 정상적인 모습입니다. 반대로 회선이 포화되면 측정에 쓰려던 SSH 세션조차 닿지 않을 수 있습니다. 그럴 때는 게스트 시스템의 네트워크와 무관하게 동작하는 고객 포털의 VNC 콘솔을 이용하세요.
핵심 요약
- DayZ 서버는 외부로 정확히 두 가지가 필요합니다. 2302/UDP에서 시작하는 게임 포트 구간과 본인의
steamQueryPort줄에 들어 있는 Steam 쿼리 포트입니다. 나머지는 모두 제한하거나 닫아야 합니다. - BattlEye RCon 포트에는 구속력 있는 표준이 없고, UDP로 동작하며,
BEServer_x64.cfg에서RConPort로 설정합니다. 이 포트는 절대 공개 네트워크에 두어서는 안 되고, 쿼리 포트와 같은 값으로 두어서도 안 됩니다. - 쿼리 포트는 닫지 말고 제한하세요. 닫으면 직접 접속은 계속 되는데도 서버 브라우저와 DZSA 런처에서 사라집니다.
- 허용 목록과
guaranteedSlots, 로그인 대기열은 슬롯 고갈에 맞서 플레이어 자리를 지켜 주지만, 대역폭에 맞서 회선을 지켜 주지는 않습니다. - DayZ 서버에서 가장 위험한 시간대는 세 시간에서 네 시간마다 예정된 재시작입니다. 모드와 중앙 경제가 몇 분씩 불러와지고, 그 시각이 공개되어 있기 때문입니다.
- 공격량이 1 Gbit/s를 넘거나 초당 수십만 패킷에 이르면 여러분의 방화벽이 아니라 서버 앞단 네트워크만이 결과를 결정합니다.
- KernelHost에서는 2단계 상시 방어가 모든 서버 상품에 추가 요금 없이 포함되어 있고 null-routing을 쓰지 않습니다. 포트별 규칙을 직접 조정하려 할 때 월 50.00 EUR부터의 Advanced DDoS Protection이 더해집니다.
프로젝트가 이미 KernelHost에 있다면 필터링은 여러분이 아무것도 하지 않아도 동작하고 있습니다. 그래도 이상한 점이 보이면 지원 티켓을 열어 주세요. 해당 IP 주소의 필터 규칙을 다시 맞춰 드립니다. 공격이 진행 중일 때는 WhatsApp 긴급 채팅 +43 650 8209883으로도 연락하실 수 있습니다.
자주 묻는 질문
DayZ 서버가 지금 오프라인입니다. DDoS 공격인지 어떻게 알 수 있나요?
DayZ 서버에 실제로 필요한 포트는 무엇인가요?
DayZ의 Steam 쿼리 포트는 2305인가요, 27016인가요?
BattlEye RCon 포트는 어디에서 설정하고, 공개 네트워크에 열어도 되나요?
DayZ의 허용 목록이 DDoS 공격에 도움이 되나요?
DayZ 서버를 향한 공격이 하필 재시작 시점에 몰리는 이유는 무엇인가요?
iptables나 UFW로 DDoS 공격에 맞설 수 있나요?
어느 규모부터 DayZ 서버가 혼자 버티지 못하나요?
KernelHost의 DayZ 서버는 공격 중에 오프라인이 되나요?
KernelHost의 DDoS 방어는 추가 요금이 드나요? Advanced DDoS Protection은 언제 필요한가요?
2026 KernelHost GmbH. 모든 권리를 보유합니다. 본 가이드는 저작권법의 보호를 받습니다. 전체든 일부든, 또는 수정된 형태이든 저희의 서면 동의 없이 다른 웹사이트에 게시할 수 없습니다. 출처를 밝히고 링크를 덧붙인 인용은 언제든지 환영합니다.

