Profile picture

[Docker] 쾌적한 게임 서버 운영을 위한 DDOS 방어용 프록시 서버 구축하기

JaehyoJJAng2024년 02월 02일

▶︎ 개요

게임 서버를 개인 홈서버 환경에서 운영하게 되면 접근 및 관리가 쉬워진다는 장점이 있지만

이를 상쇄하는 가장 큰 단점이 존재한다.

바로 악성 사용자가 DDOS를 날리게 되면 꼼짝없이 당해야 한다는 것.

게임 서비스뿐만 아니라 홈 서버 내부에서 와이파이 및 랜선으로 연결되는 전자기기들 또한 같이 먹통이 되어버리니

치명적이지 않을 수가 없다.

가장 좋은 방법은 DDOS를 제공해주는 호스팅 업체에서 서버를 임대해 게임 서버를 운영하거나

방화벽 장비를 구비하는 것이 좋으나

전자의 경우 비용이 막대하고,

후자의 경우 비용은 DDOS 호스팅 업체와 비교해서 낮은 편에 속하지만 그래도 가격이 있을 뿐더러 관련 설정도 복잡하다.

고작 소규모 인원만 들어오는 서버에 그 정도의 돈을 쓰기에는 너무 손해가 크다.

그래서 이번에는 Nginx Proxy Manager라는 오픈소스 기반 프록시 서비스를 활용해 DDOS를 1차적으로 예방 해보려고 한다.


▶︎ 사전 준비

  • 운영할 서버
  • DDOS 방어가 지원되는 클라우드
  • Docker
  • Docker Compose (V2.20.3 ↑)
  • 본 예제에서는 AWS Lightsail 기준으로 작성되었음.

▶︎ 시작

  • 인스턴스 생성부터 프록시 구축까지의 과정을 다룸.

‣ 인스턴스 생성

  • 인스턴스 스펙
    • OS: Ubuntu 22.04
    • $5 Plan
      • 1GB Memory
      • 2 vCPU
      • SSD 40GB
      • 2TB network traffic

먼저 프록시 서버를 운영하기 위해

AWS의 Lightsail로 접속한 후, 인스턴스를 생성해주자.
image


‣ 컨테이너 생성

도커와 도커 컴포즈를 설치하고 아래 YAML을 복사하여 실행하자.

~/game_proxy/docker-compose.

version: "3.9"

include:
  - "composes/npm.yaml"

networks:
  npm-net:
    driver: bridge
    external: false

volumes:
  npm-data: {}

~/game_proxy/composes/npm.yaml

services:
  npm:
    image: 'jc21/nginx-proxy-manager:latest'
    depends_on:
      - "db"
    restart: always
    volumes:
      - "./data:/data"
      - "./letsencrypt:/etc/letsencrypt"
    ports:
      - "80:80"
      - "81:81"
      - "443:443"
    environment:
      - "TZ=Asia/Seoul"
      - "DB_MYSQL_HOST=db"
      - "DB_MYSQL_PORT=3306"
      - "DB_MYSQL_USER=npm"
      - "DB_MYSQL_PASSWORD=npm"
      - "DB_MYSQL_NAME=npm"
    networks:
      - "npm-net"
    container_name: npm

  db:
    image: 'jc21/mariadb-aria:latest'
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: "npm"
      MYSQL_DATABASE: "npm"
      MYSQL_USER: "npm"
      MYSQL_PASSWORD: "npm"
    volumes:
      - type: volume
        source: "npm-data"
        target: "/var/lib/mysql"
    networks:
      - "npm-net"
    container_name: db

컨테이너 생성 전에 컨테이너의 마운트 포인트와 매핑할 폴더를 호스트에 생성해줘야 한다.

mkdir -p ~/game_proxy/{data,letsencrypt}

컨테이너를 생성해주자.

docker-compose up -d --build

‣ npm 설정

컨테이너 설치가 정상적으로 완료되었다면 Stream을 지정해주기만 하면 된다.

npm의 프록시 기능을 이용해 프록시 서버로 들어온 트래픽을 게임 서버로 보내주는 것이 목적이므로

아래와 같이 설정해주도록 하자.

  • Stream udp forwarding On
  • incomming port 지정
  • Forward host 지정
    • 본인의 경우 홈 공인IP 주소

image


▶︎ 마무리

이제 사용자에게는 프록시 서버의 IP와 incomming에서 지정한 포트 번호만 알려주면 된다.

이러면 '클라이언트 - Proxy - 홈 게임서버' 이렇게 연결되어 게임 서버 IP를 숨기고

프록시 서버단에서 제공되는 DDOS 방어 기능을 사용할 수 있다.

또한, DDOS를 맞더라도 프록시 서버의 고정 IP를 날린 후 재발급 받기만 하면 되서

장애 처리가 매우 간단해진다.


Loading script...