Arma 3 서버를 DDoS 공격으로부터 방어하기
Arma 3 서버에 2302부터 2306까지 다섯 개의 UDP 포트 가운데 실제로 필요한 것은 무엇인지, Steam 쿼리와 BattlEye RCon, Headless Client는 어떻게 보호하는지, 그리고 어느 패킷 전송률부터 서버 앞단 네트워크의 필터링만이 통하는지 정리했습니다.
Arma 3 서버를 DDoS 공격으로부터 방어하려면 UDP 포트 다섯 개, 곧 2302부터 2306까지를 다뤄야 합니다. 저녁 작전 도중에 모든 플레이어가 동시에 튕기는 전용 서버는 하드웨어 문제인 경우가 드뭅니다. 대개는 바로 이 포트 구간을 노린 공격이 진행 중이고, 그것도 서버 목록에 플레이어 수가 가장 많이 표시되는 시간대에 벌어집니다. 이 글은 먼저 추가 비용 없이 직접 조치할 수 있는 것을 보여 주고, 그다음 그 조치가 기술적으로 어디에서 한계에 이르는지, 마지막으로 서버 앞단 네트워크에서 무엇이 이뤄져야 하는지 설명합니다.
모든 내용은 Debian 12, Debian 13, Ubuntu 22.04 LTS 또는 Ubuntu 24.04 LTS에서 운영하는 전용 Arma 3 서버(SteamCMD 애플리케이션 233780)를 기준으로 합니다. 명령은 root 기준으로 적었으니, 일반 사용자라면 앞에 sudo를 붙이세요. 공격이 지금 진행 중이라면, 설정을 바꾸거나 서버를 재시작하지 마시고 먼저 “로그 기록” 절의 측정값부터 확보하세요. 공격이 끝나면 그 값은 사라집니다.
Arma 3 서버가 공격받는 이유와 DDoS 방어가 필요해지는 시점
Arma 3에는 서버를 손쉬운 표적으로 만드는 특성이 여러 가지 겹쳐 있습니다. 첫째, 서버가 자기 주소를 스스로 공개합니다. UDP 포트 2304로 Steam 마스터 서버에 등록하고, UDP 포트 2303에서 이름, 맵, 플레이어 수, 모드 목록을 담아 조회에 응답합니다. 이 두 포트가 없으면 아무도 서버를 찾지 못하지만, 열어 두면 모든 서버 브라우저와 그 서버 브라우저를 조회하는 모든 상태 페이지에 여러분의 IP 주소가 올라갑니다.
둘째, 플레이어층이 정해진 시간대에 묶여 있습니다. Altis와 Tanoa의 라이프 롤플레이 프로젝트, Exile, Antistasi, King of the Hill은 저녁과 주말에 사람이 찹니다. 그래서 저녁 8시의 장애가 가장 크게 눈에 띕니다. 셋째, 프로젝트 사이의 경쟁, 차단된 플레이어, 내부 갈등이 있고, 공격을 시작하는 쪽은 실력도 이렇다 할 비용도 들이지 않습니다.
여기에 기술적으로 결정적인 점이 더해집니다. Arma 3는 전부 UDP로 동작하고, 게임 운영에 TCP가 필요하지 않습니다. UDP에는 요구할 수 있는 연결 수립 절차가 없고, 출발지 주소는 위조할 수 있습니다. 그래서 공격자는 부하를 만들기 위해 서버에 들어올 필요도, 규격에 맞게 말을 걸 필요도 없습니다. 게다가 Arma 3 서버의 시뮬레이션 루프는 본질적으로 연산 코어 하나에서 돌아갑니다. 패킷을 충분히 많이 보내면 이 코어 하나의 CPU 시간을 소모하게 되고, 이는 머신에 코어가 몇 개 더 있는지와 무관합니다. DDoS 공격이 구체적으로 무엇인지는 DDoS 공격이란 무엇인가? 글에서 설명합니다.
실제로 문제가 되는 포트
Arma 3 서버는 기본값으로 UDP 2302부터 2306까지의 구간을 차지합니다. 시작 파라미터 -port=2302는 첫 번째 포트만 정하고, 나머지 네 개는 거기서 고정으로 정해집니다. 곧 게임 포트에 1부터 4를 더한 값입니다. 한 머신에서 여러 인스턴스를 운영한다면 포트 간격을 최소 100씩(2302, 2402, 2502) 두세요. 그러지 않으면 인스턴스끼리 뒤쪽 포트를 서로 빼앗습니다.
| 포트 | 프로토콜 | 용도 | 공개 네트워크에 열어야 하나요 |
|---|---|---|---|
| 2302(게임 포트) | UDP | 게임 트래픽과 내장 음성 통신 VON | 예 |
| 2303(게임 포트 +1) | UDP | Steam 쿼리: 이름, 맵, 플레이어 수, 모드 및 서명 목록으로 A2S 쿼리에 응답 | 예, 닫으면 서버 브라우저에 항목이 나타나지 않음 |
| 2304(게임 포트 +2) | UDP | Steam 마스터: 서버를 Steam 마스터 서버에 등록 | 예 |
| 2305(게임 포트 +3) | UDP | VON, Bohemia 기준 예약되어 있으며 현재는 사용하지 않음 | 아니요 |
| 2306(게임 포트 +4) | UDP | BattlEye 트래픽, 그중 RCon 인터페이스(beserver_x64.cfg의 RConPort) |
아니요, 관리자 주소만 |
| 2344와 2345(아웃바운드) | TCP와 UDP | 서버가 arma31.battleye.com으로 맺는 BattlEye 연결 | 아웃바운드는 허용, 인바운드는 아무것도 열지 않음 |
| 3306 | TCP | 모든 라이프 프레임워크의 데이터베이스 연결을 담당하는 extDB3용 MySQL | 아니요, 127.0.0.1에 바인딩 |
| 22 | TCP | SSH 접속 | 아니요, 본인 주소만 |
이 여덟 줄 가운데 공개 인터넷에 열려야 하는 것은 정확히 세 개, UDP 2302, 2303, 2304입니다. 나머지는 모두 관리용이며, 관리 포트를 열어 두는 것은 Arma 3 서버에서 가장 흔하게 나오는, 그리고 피할 수 있는 실수입니다.
돈을 쓰기 전에 직접 할 수 있는 일
이 절이 가장 길고, 의도한 바입니다. 설정이 깔끔한 Arma 3 서버는 어디에 놓여 있든 작거나 중간 규모의 공격을 자체 힘으로 견뎌 냅니다.
1. 현황 파악: 서버에서 무엇이 대기하고 있나요?
규칙을 한 줄이라도 쓰기 전에 서버가 외부에 무엇을 내주고 있는지 확인하세요. 추측하지 말고 직접 확인합니다.
ss -lntup
여기서 중요한 것은 로컬 주소 열입니다. 0.0.0.0:2302는 “인터넷 전체에서 접근할 수 있음”을 뜻하고, 127.0.0.1:3306은 “로컬에서만 접근할 수 있음”을 뜻하므로 방화벽 규칙이 필요하지 않습니다. 라이프 서버에서는 게임 외에도 MariaDB, 세력 홈페이지용 웹 서버, TeamSpeak이나 음성 서비스, 잊고 방치한 패널이 함께 나타나는 일이 잦습니다. 공격자의 시선은 외부에서 실행하는 포트 스캔이 보여 줍니다.
nmap -Pn -sU -p 2300-2320 YOUR.SERVER.IP.ADDRESS
nmap -Pn -p- --min-rate 1000 YOUR.SERVER.IP.ADDRESS
첫 번째 명령은 게임의 UDP 구간을, 두 번째 명령은 TCP에서 열려 있는 모든 것을 보여 줍니다. Arma 3 서버는 게임 운영에 TCP 포트가 단 하나도 필요하지 않습니다.
2. Arma 3가 실제로 필요한 포트만 열어 두기
외부로는 UDP 포트 세 개면 충분하고, 나머지는 제한합니다. UFW에서는 다음과 같이 하며, 스스로 접속이 막히지 않도록 반드시 이 순서를 지키세요.
ufw allow from 203.0.113.10 to any port 22 proto tcp comment 'SSH'
ufw allow 2302:2304/udp comment 'Arma 3 게임, Steam 쿼리, Steam 마스터'
ufw allow from 203.0.113.10 to any port 2306 proto udp comment 'BattlEye RCon'
ufw default deny incoming
ufw default allow outgoing
ufw --force enable
ufw status verbose
203.0.113.10은 본인 주소로 바꾸세요. 포트 2305는 Bohemia가 예약되어 있고 현재 사용하지 않는다고 밝혔으므로 닫아 둡니다. ufw default allow outgoing 줄이 중요합니다. BattlEye는 서버에서 arma31.battleye.com으로 연결을 맺고, 이를 위해 아웃바운드로 TCP와 UDP의 2344, 그리고 TCP의 2345가 필요합니다. 아웃바운드를 일괄 차단하면 자기 안티치트를 스스로 막는 셈입니다. 설정을 바꾼 뒤에는 실제로 접속해서 BattlEye가 플레이어를 계속 통과시키는지 확인하세요. 복구 방법까지 포함한 전체 안내는 스스로 접속이 막히지 않게 UFW 방화벽 설정하기에 있습니다.
데이터베이스는 어떤 경우에도 공개 네트워크에 두어서는 안 됩니다. Altis Life와 다른 라이프 프레임워크는 extDB3 확장을 통해 MySQL 데이터베이스와 통신하며, 접속 정보는 @extDB3/extdb3-conf.ini에 평문으로 들어 있습니다. /etc/mysql/mariadb.conf.d/50-server.cnf에 다음 줄이 있는지 확인하세요.
bind-address = 127.0.0.1
3. 서버 브라우저에서 사라지지 않으면서 Steam 쿼리 포트 부담 덜기
UDP 포트 2303은 공개 Arma 3 서버에서 가장 취약한 지점입니다. 이 포트는 A2S 쿼리, 즉 Steam 서버 브라우저의 표준 조회에 응답합니다. A2S_INFO는 이름, 맵, 플레이어 수를, A2S_PLAYERS는 플레이어 목록을, A2S_RULES는 모드 및 서명 목록을 돌려줍니다. 조회는 작은 UDP 패킷 하나지만 응답은 그보다 몇 배 큽니다. US-CERT는 Alert TA14-017A에서 Steam 프로토콜의 대역폭 증폭 계수를 5.5로 제시하고, Arma 3에서는 모드 목록 전체가 함께 실려 나가기 때문에 응답이 특히 커집니다.
여기서 두 가지가 따라옵니다. 첫째, 공격자가 출발지 주소를 위조한 조회를 보내면 여러분의 서버가 제3자를 향한 증폭기로 악용될 수 있습니다. 둘째, 그리고 여러분에게 더 중요한 점은 조회 하나하나가 시뮬레이션을 떠받치는 그 하나의 코어에서 CPU 시간을 소모한다는 것입니다. Bohemia는 2015년부터 이에 관한 티켓(T83469)을 두고 있습니다. 게임 포트나 Steam 쿼리 포트로 들어온 위조 UDP 패킷이 CPU를 100퍼센트까지 밀어 올려 서버를 멈춰 세웠고, 쿼리 포트를 통한 공격이 성공하는 데는 4 Mbit/s만으로도 충분했습니다. 그래서 Arma 3에서는 대역폭보다 패킷 전송률이 더 위험합니다.
첫 번째 조절 지점은 응답 크기입니다. server.cfg의 steamProtocolMaxDataSize 지시어는 서버가 쿼리 응답에 담을 수 있는 바이트 수를 정합니다. 모드 목록이 큰 운영자는 이 값을 2048 이상으로 올립니다. 그러지 않으면 로그에 “Query data overflow, Mods/Signatures will not be correctly received by clients” 경고가 남기 때문입니다. 하지만 값을 올릴 때마다 공격자가 증폭에 쓰는 바로 그 응답이 커집니다. 따라서 모드 목록이 겨우 들어갈 만큼 낮게 설정하고, 쓰지 않는 모드는 시작 명령에서 빼세요.
steamProtocolMaxDataSize = 2048;
두 번째 조절 지점은 쿼리 포트만 겨냥한 출발지 주소별 속도 제한입니다. UDP 2303을 일괄 차단하지는 마세요. 쿼리 응답이 없으면 서버가 서버 브라우저와 모든 상태 페이지에서 사라지고, 새 플레이어가 서버를 찾지 못합니다. 정상적인 서버 브라우저는 1분에 몇 번 조회하고, 1초에 수백 번 조회하지는 않습니다.
4. BattlEye RCon을 공개 네트워크에서 빼기
BattlEye는 Arma 3의 안티치트이고 server.cfg에서 BattlEye = 1;로 켭니다. 여기에 딸린 원격 제어 기능인 BattlEye RCon은 별도의 UDP 프로토콜이며 BattlEye/beserver_x64.cfg에서 설정합니다(_x64가 붙은 파일이 요즘 표준인 arma3server_x64에 적용됩니다).
RConPassword YOUR_ALPHANUMERIC_PASSWORD
RConPort 2306
RConIP 127.0.0.1
MaxPing 350
RestrictRCon 0
세 가지가 결정적입니다. RCon 비밀번호는 영문과 숫자만으로 이뤄져야 합니다. 특수 문자는 BattlEye의 프로토콜 파서를 조용히 어긋나게 만들고, 조용히 실패하는 RCon 접속은 정작 필요한 순간에 없는 접속입니다. RConIP는 RCon이 어느 주소에서 대기할지 정합니다. 여기에 127.0.0.1이 들어 있으면 인터페이스는 로컬에서만 접근할 수 있고, RCon 도구는 SSH 포워딩으로 접근합니다. 그리고 RConPort는 게임 구간보다 위에 있어야 하며, 보통 게임 포트에 4를 더한 2306을 씁니다. RCon을 외부로 열어야 한다면 관리 팀의 고정 주소에만 포트를 허용하세요.
한 가지는 분명히 해 두어야 합니다. BattlEye는 안티치트이고 DDoS 방어가 아닙니다. 접속해 있는 플레이어를 검사할 뿐입니다. 서버를 플러딩하는 공격자는 애초에 접속할 생각이 없습니다.
5. Headless Client를 고정 주소에 묶기
Headless Client는 그래픽 없이 돌아가는 두 번째 Arma 3 인스턴스로, 플레이어처럼 서버에 접속해 AI 연산을 대신 맡습니다. 대규모 미션에서는 이것이 가장 큰 성능 이득입니다. 그러지 않으면 AI가 시뮬레이션과 같은 코어에 얹히기 때문입니다. server.cfg에서 다음과 같이 허용합니다.
headlessClients[] = {"127.0.0.1"};
localClient[] = {"127.0.0.1"};
좋은 소식은 이 항목이 없으면 서버가 Headless Client 연결을 아예 받지 않는다는 점입니다. 나쁜 소식은 localClient[]가 등록된 주소에 무제한 대역폭과 사실상 없는 지연 검사를 허용한다는 점입니다. 여기에는 127.0.0.1 또는 본인이 운영하는 Headless Client 서버의 고정 주소만 넣고, 주소 대역 전체는 절대 넣지 마세요. 클라이언트는 -client -connect=127.0.0.1 -port=2302 -password=...로 실행하며, maxPlayers의 슬롯 하나를 차지합니다. 그러니 이 몫을 미리 계산해 두세요. 그러지 않으면 플레이어가 꽉 찬 서버를 마주하게 됩니다.
6. 접속, 서명, 투표 설정 강화하기
이 설정들은 회선을 지켜 주지는 않지만, 정상 접속 경로로 들어오는 것은 모두 막아 줍니다. 조작된 클라이언트, 게임 내 스크립트 실행, 투표 악용이 여기에 해당합니다. 다음 줄은 공개 서버라면 어느 server.cfg에나 들어가야 합니다.
verifySignatures = 2;
BattlEye = 1;
kickDuplicate = 1;
allowedFilePatching = 0;
maxPlayers = 64;
disconnectTimeout = 30;
maxPing = 200;
maxDesync = 150;
maxPacketLoss = 50;
kickClientsOnSlowNetwork[] = {1, 1, 1, 1};
voteThreshold = 1.5;
voteMissionPlayers = 100;
onUnsignedData = "kick (_this select 0)";
onHackedData = "kick (_this select 0)";
verifySignatures = 2는 모든 애드온에 서명 검증 버전 2를 강제하며, 모드를 쓰는 공개 서버의 최소 요구 사항입니다. allowedFilePatching = 0은 -filePatching으로 실행된 클라이언트의 접속을 거부합니다(값 1은 Headless Client에만 허용, 값 2는 모두 허용). kickDuplicate = 1은 같은 식별자로 들어오는 두 번째 연결을 내보냅니다. kickClientsOnSlowNetwork[]는 maxPing, maxPacketLoss, maxDesync, disconnectTimeout의 네 임계값을 항목별로 기록만 할지(0) 실제로 적용할지(1) 정합니다. disconnectTimeout은 5초부터 90초까지의 값을 받습니다. voteThreshold를 1보다 크게 두면 투표가 성립할 수 없게 되고, 공격 패킷 하나 없이 서버를 방해하는 가장 인기 있는 수단, 곧 투표로 미션을 바꾸는 방법이 막힙니다.
7. 출발지 주소별로 패킷과 연결 속도 제한하기
작은 공격과 엉성한 봇에는 출발지 주소별 상한이 도움이 됩니다. Arma 3는 순수 UDP로 동작하므로 hashlimit을 쓰고, 쿼리 포트에는 게임 포트보다 훨씬 좁은 한도를 줍니다.
iptables -I INPUT -p udp --dport 2303 -m hashlimit --hashlimit-name a3_query --hashlimit-mode srcip --hashlimit-above 10/sec --hashlimit-burst 20 -j DROP
iptables -I INPUT -p udp --dport 2302 -m hashlimit --hashlimit-name a3_game --hashlimit-mode srcip --hashlimit-above 900/sec --hashlimit-burst 1200 -j DROP
iptables -I INPUT -p udp --dport 2302:2306 -m length --length 0:27 -j DROP
첫 번째 규칙은 같은 출발지에서 초당 10회를 지속적으로 넘는 쿼리 조회를, 두 번째 규칙은 초당 900개를 지속적으로 넘는 게임 패킷을, 세 번째 규칙은 쓸 만한 페이로드가 없는 UDP 패킷을 폐기합니다. 세 숫자는 모두 출발점일 뿐이고 정답이 아닙니다. 80명이 들어찬 라이프 서버는 여섯 명이 하는 Antistasi 한 판보다 훨씬 많은 패킷을 만들고, 너무 좁게 잡으면 자기 플레이어를 내쫓습니다. 먼저 평상시 운영에서 한 주는 측정하세요.
두 가지를 덧붙입니다. iptables 규칙만 쓰면 재시작 후에 사라지므로 Debian과 Ubuntu에서는 다음과 같이 저장합니다.
apt-get install -y iptables-persistent
netfilter-persistent save
UFW를 쓴다면 이런 규칙은 /etc/ufw/before.rules에 들어가야 합니다. 그러지 않으면 다음 ufw reload에서 사라집니다. 자주 간과되는 병목이 하나 더 있는데, 커널의 연결 추적입니다. UDP도 여기에 항목을 만들고, 위조 주소가 많은 쿼리 플러드는 몇 초 만에 테이블을 채웁니다. 테이블이 가득 차면 서버는 정상 패킷까지 폐기하고, 로그에는 “nf_conntrack: table full”이 남습니다. 현재 값과 상한은 다음 명령으로 확인합니다.
sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max
8. basic.cfg: 대역폭, 패킷 크기, 추가 파일
Arma 3 서버의 두 번째 설정 파일은 basic.cfg이고 -cfg=로 불러옵니다. -config=는 server.cfg를 불러옵니다. 이 파일은 네트워크 동작을 조정하며, 보안에 직접 영향을 주는 값이 정확히 하나 들어 있습니다.
MaxMsgSend = 1024;
MaxSizeGuaranteed = 512;
MaxSizeNonguaranteed = 256;
MinBandwidth = 15000000;
MaxBandwidth = 100000000;
MinErrorToSend = 0.001;
MinErrorToSendNear = 0.01;
MaxCustomFileSize = 0;
class sockets { maxPacketSize = 1400; };
MaxCustomFileSize는 플레이어가 가져오고 서버가 다른 모든 사람에게 배포하는 얼굴과 사운드 파일의 최대 크기(바이트)입니다. 값 0은 이 배포를 끕니다. 그러면 한 명의 클라이언트가 어떤 공격 인프라도 없이 서버의 대역폭을 점유하는 경로가 하나 사라집니다. MinBandwidth는 서버가 확보되었다고 가정하는 대역폭이며, 기준값은 플레이어 수 곱하기 256 kbit/s, 즉 64 슬롯이면 약 16 Mbit/s입니다. 너무 낙관적인 값은 부하와 동기화 오류를 키웁니다. 서버가 만들어 놓고 다시 버리는 메시지가 늘어나기 때문입니다. MaxMsgSend는 시뮬레이션 단계마다 보내는 패킷 수를 제한하며 동기화 오류에 맞서는 첫 번째 조절 지점입니다. 기본값 128은 요즘 서버에는 너무 낮게 잡혀 있습니다.
9. 공격 중에 추측하지 않도록 로그 기록하기
가장 중요하면서 거의 아무도 미리 하지 않는 단계가 있습니다. 모든 것이 정상으로 돌아가는 동안에 기준값을 만들어 두는 것입니다. 평상시 값이 없으면 사건이 끝난 뒤에 초당 40,000 패킷이 많았던 것인지 그냥 토요일 저녁이었던 것인지 말할 수 없습니다. apt-get install -y vnstat sysstat로 측정이 상시 돌아가고, server.cfg의 logFile = "arma3server.log";가 서버 쪽 관점을 더해 줍니다. 사건이 진행되는 동안에는 네 개의 명령으로 충분합니다.
sar -n DEV 1 10
ip -s link show eth0
dmesg -T | tail -50
tcpdump -ni eth0 udp portrange 2302-2306 -c 200 -q
포트별 비교가 많은 것을 알려 줍니다. 부하가 거의 전부 2303에 몰려 있으면 쿼리 플러드이고, CPU 시간을 때립니다. 출발지 주소가 계속 새로 바뀌면서 2302부터 2306까지 고르게 퍼져 있으면 위조된 UDP 플러드이고, 회선을 때립니다. tcpdump에는 한 가지 원칙이 있습니다. 항상 -c로 개수를 제한하세요. 과부하 상태에서의 캡처는 이미 과부하인 서버에 부담을 더 얹습니다. 측정값을 해석하는 방법은 DDoS 공격 알아내기에 있습니다. 서버를 애초에 깔끔하게 설치하고 업데이트하는 방법은 SteamCMD로 게임 서버 설치하기에서 다룹니다.
이 조치들이 한계에 이르는 지점
이제 어떤 설정 파일로도 해결할 수 없는 부분입니다. 지금까지의 모든 조치는 여러분의 서버, 즉 회선의 끝에서 동작합니다. 방화벽 규칙은 이미 케이블을 지나온 패킷을 두고 판단합니다. 그 패킷을 폐기할 수는 있지만, 보내지 않은 것으로 만들 수는 없습니다.
한번 계산해 보겠습니다. 일반적인 게임 서버는 1 Gbit/s 회선에 물려 있고, 이는 초당 125 메가바이트이며, 누군가 그보다 많이 보내는 순간 회선은 꽉 찹니다. 두 번째 수치는 패킷 전송률이고, Arma 3에서는 거의 항상 이쪽이 먼저 터집니다. 64 바이트짜리 작은 패킷이라면 1 Gbit/s 회선에 초당 약 149만 개가 들어갑니다. 일반적인 서버 커널은 CPU와 네트워크 카드에 따라 그중 수십만 개를 처리한 뒤 폐기를 시작하고, Arma 3의 시뮬레이션은 게다가 코어 하나에 매달려 있습니다.
| 항목 | 값 |
|---|---|
| 기본 포트 구간 | UDP 2302부터 2306까지, 게임 운영에 TCP 없음 |
| 쿼리 포트 | 게임 포트 +1, 기본값 UDP 2303 |
| RCon 포트(BattlEye) | RConPort로 자유롭게 지정, 보통 게임 포트 +4, 곧 UDP 2306 |
| 여러 인스턴스 운영 시 포트 간격 | 최소 100(2302, 2402, 2502) |
| 평상시 대역폭 기준값 | 플레이어 수 곱하기 256 kbit/s, 64 슬롯이면 약 16 Mbit/s |
| Steam 프로토콜의 증폭 계수 | US-CERT Alert TA14-017A 기준 5.5 |
| 문서로 확인된 유효 공격의 하한 | 쿼리 포트로 4 Mbit/s만으로도 Arma 3 서버를 멈춰 세울 수 있었음(Bohemia 티켓 T83469) |
| 1 Gbit/s를 패킷으로 환산 | 패킷 크기 64 바이트일 때 초당 약 149만 개 |
| KernelHost에서 걸러 낸 최대치 | 초당 4,150만 패킷과 함께 473.4 Gbit/s, 별건으로 112.2 Gbit/s UDP 플러드 |
가장 불편한 줄은 4 Mbit/s입니다. Arma 3에서 공격은 효과를 내기 위해 클 필요가 없습니다. 맞는 포트로 충분히 많은 패킷만 보내면 됩니다. 운영자는 이것을 “사용률은 전혀 높지 않았는데 그래도 전부 죽었다”로 경험합니다. 반대로 볼류메트릭 공격에는 단순한 물리 법칙이 적용됩니다. 473.4 Gbit/s에서는 어떤 로컬 설정도 의미가 없습니다. 플레이어의 패킷이 그 앞에서 이미 통과하지 못하기 때문입니다. 볼류메트릭 공격은 서버 앞단 네트워크에서 끝나야 합니다.
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로 전환됩니다. 여러분 쪽에서 손볼 것은 없습니다.
- 포트와 프로토콜별로 직접 관리하는 방어 규칙: 고객 포털에서 UDP 2302에 무엇을 허용할지와 UDP 2303에 무엇을 허용할지를 따로 설정하고, 쿼리 포트를 게임 포트보다 훨씬 좁게 운용할 수 있습니다.
- 변경은 실시간으로 반영: 유지보수 시간을 기다리지 않고 공격이 진행되는 중에도 값을 조정할 수 있습니다.
- 게임에 맞춘 방어 프로필: 개조된 애플리케이션과 자체 애플리케이션도 임의의 TCP 또는 UDP 포트에서 같은 방식으로 다룹니다.
두 단계 비교
| 항목 | 포함된 DDoS 상시 방어 | Advanced DDoS Protection |
|---|---|---|
| 요금 | 모든 서버 상품에 추가 요금 없이 포함 | 월 50.00 EUR부터, PrePaid |
| 필터링 용량 | 17 Tbps 글로벌 스크러빙과 프랑크푸르트암마인의 3.2 Tbps Arbor 실시간 필터링 | 동일한 2단계 필터링 |
| IP 주소 | 서버의 IP 주소 | 추가로 받는 전용 방어 IP |
| 규칙 세트 | 자동 프로필, 설정 불필요 | 고객 포털에서 포트와 프로토콜별 자체 규칙, 예를 들어 2302와 2303을 분리 |
| 변경 | 자동으로 함께 적용 | 실시간 반영, 공격 중에도 가능 |
| 게임 프로필 | 주요 게임에 최적화된 프로필 | 게임에 맞춘 프로필, 개조된 애플리케이션도 가능 |
| null-routing | 없음 | 없음 |
| 이용 기간 | 서버 상품에 연동 | PrePaid, 최소 이용 기간 없음, 해지 통보 기간 없음, 설치비 없음 |
대부분의 Arma 3 프로젝트에는 깔끔한 서버 설정과 포함된 상시 방어면 충분합니다. Advanced DDoS Protection은 누군가 이 일을 개인적으로 받아들였을 때의 답입니다.
자주 나오는 실수와 해결 방법
“포트를 2302에서 2402로 옮겼는데 공격이 계속되었습니다”: 그럴 수밖에 없습니다. 서버가 새 포트를 스스로 Steam 마스터 서버에 등록하고, 서버 목록이 곧바로 다시 공개합니다. 포트 변경은 오래된 스크린샷의 옛 정보를 쓰는 사람에게만 통합니다.
“2303을 완전히 차단했더니 아무도 우리 서버를 찾지 못합니다”: 정확히 그런 일이 일어납니다. Steam 쿼리 포트에서 응답이 없으면 서버 브라우저에 항목이 나타나지 않고, 모든 상태 페이지와 Discord 봇이 서버를 오프라인으로 표시합니다. 올바른 방법은 차단이 아니라 출발지 주소별 속도 제한입니다.
“로그에 NetServer::SendMsg: cannot find channel이 찍힙니다”: 이 메시지는 서버가 더 이상 존재하지 않는 연결에 쓰기를 시도할 때 나옵니다. 보통은 플레이어 연결이 끊기는 상황이나 성능 저하를 동반하며(Bohemia는 이를 T83936으로 관리합니다), 반드시 공격을 뜻하지는 않습니다. 먼저 인터페이스의 패킷 전송률이 실제로 이상한지 확인하세요.
“iptables 규칙이 적용되지 않습니다”: 흔한 원인이 세 가지입니다. 규칙이 UFW 체인 뒤에 있어 전혀 도달하지 못하거나, 마지막 재시작 이후 사라졌거나(이때는 netfilter-persistent save 또는 /etc/ufw/before.rules 항목이 도움이 됩니다), 공격이 볼류메트릭이어서 규칙은 이미 꽉 찬 회선에서 제대로 동작하고 있는 경우입니다. iptables -L INPUT -n -v로 매칭 카운터, 즉 규칙에 걸린 패킷 수가 올라가는지 확인하세요. 0에 머물러 있으면 규칙에 도달하지 못하는 것입니다.
“새 방화벽을 넣은 뒤로 BattlEye가 모든 플레이어를 강제 퇴장시킵니다”: 서버가 arma31.battleye.com에 더 이상 접속하지 못하는 상태입니다. 아웃바운드로 TCP와 UDP의 2344, 그리고 TCP의 2345가 열려 있어야 하며, 그러지 않으면 서버의 안티치트 연결이 끊어집니다.
“기존 업체가 제 IP 주소를 차단했습니다”: 그것이 null-routing입니다. 업체는 그렇게 자기 네트워크를 지키지만, 여러분에게 남는 결과는 공격이 성공한 것과 똑같고, 보통 그 뒤로 몇 시간 더 이어집니다. 확실하지 않으면 필터링을 하는지 null-routing을 하는지 물어보세요. 그 답이 어떤 하드웨어 사양보다 여러분의 가용성을 더 크게 좌우합니다.
“tcpdump에 이상한 것이 보이지 않습니다”: 트래픽이 이미 앞단 네트워크에서 걸러지고 있으면 서버에는 아무것도 도착하지 않는 것이 당연합니다. 필터링이 작동하고 있을 때의 정상적인 모습입니다. 반대로 회선이 포화되면 측정에 쓰려던 SSH 세션조차 닿지 않을 수 있습니다. 그럴 때는 게스트 시스템의 네트워크와 무관하게 동작하는 고객 포털의 VNC 콘솔을 이용하세요.
핵심 요약
- Arma 3 서버는 외부로 정확히 UDP 포트 세 개가 필요합니다. 게임과 음성용 2302, Steam 쿼리용 2303, Steam 마스터 서버 등록용 2304입니다. 게임 자체에는 TCP가 필요하지 않습니다.
- UDP 포트 2306은 BattlEye와 RCon 인터페이스를 나르므로
beserver_x64.cfg의RConPort와RConIP로 설정해 본인의 관리자 주소에만 열어야 합니다. - Steam 쿼리 포트 2303이 가장 취약한 지점입니다. Steam 프로토콜은 US-CERT TA14-017A 기준으로 증폭 계수가 5.5이고, 조회 하나하나가 시뮬레이션을 떠받치는 코어에서 CPU 시간을 소모합니다. 차단하지 말고 제한하세요.
steamProtocolMaxDataSize는 모드 목록이 허용하는 만큼 낮게 유지하고,basic.cfg에는MaxCustomFileSize = 0;을 설정하세요. 둘 다 서버가 요청 없이 내보내는 데이터양을 줄여 줍니다.- Arma 3에서는 대역폭이 아니라 패킷 전송률이 승부를 가릅니다. Bohemia는 2015년부터 T83469에서 쿼리 포트로 들어온 4 Mbit/s만으로도 서버가 멈춰 섰다고 기록하고 있습니다.
- 로컬 조치는 회선에서 끝납니다. 공격량이 1 Gbit/s를 넘거나 초당 수십만 패킷에 이르면 서버 앞단 네트워크의 필터링만이 결과를 결정합니다.
- KernelHost에서는 2단계 상시 방어가 모든 서버 상품에 추가 요금 없이 포함되어 서버 제공 시점부터 동작하며, null-routing을 쓰지 않습니다. Advanced DDoS Protection은 월 50.00 EUR부터 전용 방어 IP와 포트별로 직접 관리하는 규칙을 더해 줍니다.
프로젝트가 이미 KernelHost에 있다면 필터링은 여러분이 아무것도 하지 않아도 동작하고 있습니다. 그래도 이상한 점이 보이면 지원 티켓을 열어 주세요. 해당 IP 주소의 필터 규칙을 다시 맞춰 드립니다. 공격이 진행 중일 때는 WhatsApp 긴급 채팅 +43 650 8209883으로도 연락하실 수 있습니다.
자주 묻는 질문
Arma 3 서버가 지금 오프라인입니다. DDoS 공격인지 어떻게 알 수 있나요?
Arma 3 서버에 실제로 필요한 포트는 무엇인가요?
Steam 쿼리 포트 2303을 그냥 차단해도 되나요?
Steam 쿼리 반사 공격이란 무엇이고 왜 Arma 3 서버가 표적이 되나요?
BattlEye가 Arma 3 서버를 DDoS 공격에서 방어해 주나요?
지금 IP 주소나 포트를 빨리 바꾸면 도움이 되나요?
iptables나 UFW로 DDoS 공격에 맞설 수 있나요?
어느 규모부터 Arma 3 서버가 혼자 버티지 못하나요?
Headless Client는 어떻게 제대로 보호하나요?
KernelHost의 서버는 공격 중에 오프라인이 되나요?
KernelHost의 DDoS 방어는 추가 요금이 드나요? Advanced DDoS Protection은 언제 필요한가요?
2026 KernelHost GmbH. 모든 권리를 보유합니다. 본 가이드는 저작권법의 보호를 받습니다. 전체든 일부든, 또는 수정된 형태이든 저희의 서면 동의 없이 다른 웹사이트에 게시할 수 없습니다. 출처를 밝히고 링크를 덧붙인 인용은 언제든지 환영합니다.

