왜 보안에 집착하게 되었나
게임 서버를 운영하면서 가장 먼저 마주친 문제는 DDoS 공격이었습니다. CS2 서버가 알려지면서 경쟁 서버 운영자나 악의적인 플레이어의 공격을 받기 시작했습니다. 처음에는 단순히 IP를 차단하는 수준이었지만, 공격이 정교해지면서 체계적인 방어가 필요해졌습니다.
단순히 게임 서버만의 문제가 아니었습니다. 같은 네트워크에 포트폴리오 웹사이트, 교회 홈페이지, 각종 웹 애플리케이션이 함께 운영되고 있었으니까요. 하나의 서비스가 뚫리면 전체 인프라가 위험해지는 구조였습니다. 이때부터 "깊이 있는 방어(Defense in Depth)" 전략을 본격적으로 적용하기 시작했습니다.
1계층: Cloudflare — 엣지에서의 첫 번째 방어선
Cloudflare는 모든 트래픽이 서버에 도달하기 전에 거치는 첫 번째 방어선입니다. 역할은 크게 세 가지입니다:
- DDoS 방어 — Cloudflare의 글로벌 네트워크가 대규모 트래픽 공격을 엣지에서 흡수합니다. L3/L4 공격은 자동으로 차단되고, L7 공격은 WAF 규칙으로 필터링합니다.
- 원본 서버 IP 은닉 — 모든 DNS 레코드가 Cloudflare를 경유하므로 실제 서버 IP가 노출되지 않습니다. 이것만으로도 직접적인 공격 표면을 크게 줄일 수 있습니다.
- SSL/TLS 암호화 — Cloudflare-서버 간 Full Strict 모드로 통신하며, 원본 서버 인증서를 직접 관리합니다.
Cloudflare 설정에서 특히 신경 쓴 부분은 방화벽 규칙입니다. 알려진 봇 트래픽 차단, 특정 국가 제한, 요청 빈도 제한(Rate Limiting) 등을 세밀하게 설정했습니다. 예를 들어, 로그인 엔드포인트에는 10초당 5회 제한을 걸어 브루트포스 공격을 방지합니다.
2계층: OPNsense — 하드웨어 방화벽
Cloudflare가 웹 트래픽을 보호한다면, OPNsense는 네트워크 레벨에서 모든 트래픽을 관장합니다. 전용 하드웨어에 설치한 오픈소스 방화벽 OS로, 소프트웨어 방화벽(iptables, ufw 등)보다 훨씬 강력한 제어가 가능합니다.
핵심 설정들:
- IDS/IPS(Suricata) — 네트워크 트래픽을 실시간 분석하여 알려진 공격 패턴을 탐지하고 차단합니다. ET Open 룰셋을 기반으로 커스텀 규칙도 추가했습니다.
- VLAN 분리 — 게임 서버, 웹 서비스, 관리 네트워크를 VLAN으로 분리했습니다. 게임 서버가 공격당해도 웹 서비스 네트워크는 영향받지 않습니다.
- 포트 포워딩 최소화 — 필요한 포트만 정확히 열고, 나머지는 모두 차단합니다. 게임 서버 포트, HTTPS(443), SSH(커스텀 포트)만 외부에 노출됩니다.
OPNsense의 가장 큰 장점은 가시성입니다. 실시간 트래픽 그래프, 연결 상태, 차단 로그를 웹 UI에서 한눈에 볼 수 있어서, 비정상적인 트래픽을 즉시 감지하고 대응할 수 있습니다.
3계층: Docker 네트워크 격리
서버 내부에서는 Docker가 서비스 간 격리를 담당합니다. 각 서비스(웹사이트, 게임 서버, 데이터베이스, 모니터링 등)는 독립된 컨테이너에서 실행되며, Docker 네트워크로 통신을 제어합니다.
격리 전략:
- 서비스별 네트워크 — 웹 프론트엔드와 백엔드는 같은 Docker 네트워크에, 데이터베이스는 별도 네트워크에 배치. 프론트엔드 컨테이너가 침해되어도 DB에 직접 접근 불가
- 읽기 전용 파일시스템 — 정적 웹사이트 컨테이너는
read_only: true로 실행해 파일 변조 방지 - 리소스 제한 — 각 컨테이너에 CPU와 메모리 제한을 걸어 하나의 서비스가 전체 시스템 리소스를 독점하지 못하도록 방지
4계층: 모니터링과 대응
아무리 방어를 잘 해도 모니터링 없는 보안은 무의미합니다. 공격이 들어오고 있는지, 방어가 제대로 동작하고 있는지, 비정상적인 패턴은 없는지 지속적으로 확인해야 합니다.
현재 운영 중인 모니터링 체계:
- 실시간 알림 — OPNsense IDS 탐지, Cloudflare WAF 차단, 서버 리소스 임계값 초과 시 Discord로 즉시 알림
- 로그 중앙화 — 모든 서비스의 로그를 한 곳에 모아 분석. 보안 이벤트 발생 시 관련 로그를 빠르게 추적 가능
- 정기 점검 — 주 1회 보안 규칙 리뷰, Cloudflare 분석 보고서 확인, 미사용 포트 정리
실전에서 배운 교훈
보안은 제품이 아니라 과정이다. 한 번 설정하고 끝나는 것이 아니라 지속적으로 관리해야 한다.
이 아키텍처를 운영하면서 얻은 가장 큰 교훈은 단순함의 가치입니다. 처음에는 최대한 많은 보안 도구를 도입하려 했지만, 복잡한 설정은 오히려 실수와 취약점을 만듭니다. 각 계층이 명확한 역할을 가지고, 서로 겹치지 않으면서 보완하는 구조가 가장 효과적이었습니다.
또 하나는 자동화의 중요성입니다. 수동으로 로그를 확인하고 규칙을 업데이트하는 것은 지속 가능하지 않습니다. 가능한 많은 것을 자동화하고, 사람은 판단과 의사결정에 집중해야 합니다. Cloudflare의 자동 DDoS 방어, OPNsense의 자동 룰 업데이트, Docker의 자동 재시작 등이 이 원칙을 실현합니다.
개인 서버라도 실제 사용자가 있는 서비스를 운영한다면, 보안은 선택이 아닌 의무입니다. 이 글이 비슷한 환경에서 서버를 운영하는 분들에게 참고가 되면 좋겠습니다.