Profile picture

[Docker] 홈서버를 DDoS 공격으로부터 보호하기: AWS Lightsail과 Nginx Proxy Manger 활용기

JaehyoJJAng2024년 02월 04일

개요

이번 게시글에서는 홈서버에서 게임 서버를 운영하면서 겪은 DDoS 공격 문제와 이를 해결하기 위해 AWS Lightsail과 Nginx Proxy Manager를 활용한 경험을 기록해보려고 한다.

문제 상황

최근 홈서버에서 게임 서버를 운영하던 중 빈번한 DDoS 공격으로 인해 서버 접속이 매우 불안정해지고 서비스 품질이 저하되는 문제가 발생하였다.

직접적인 공격으로부터 홈서버를 보호하기 위해 1차적인 방어책이 필요하다고 판단했다.

해결책

DDoS 공격을 완벽히 방어하기 위해서는 전문적인 방화벽 솔루션 등이 필요하지만,

고작 개인인 나로써는, 그런 큰 비용을 감당하면서까지 게임 서버를 운영할 동기가 생기지는 않았다.

그래서 우선운 홈서버의 IP를 숨기고 트래픽을 우회시키는 방법을 선택해봤다.

이를 위해 다음과 같은 과정을 거쳤다.

  • 1. AWS Lightsail 인스턴스 생성: 저렴하고 간편하게 사용할 수 있는 AWS Lightsail을 선택했다. 고정 IP 주소를 할당받아 외부에서 해당 IP로 접근할 수 있도록 설정했다.
  • 2. Docker 설치 및 Nginx Proxy Manager 설정: Lightsail 인스턴스에 도커를 설치하고, Nginx Proxy Manager 컨테이너를 띄웠다. 이를 통해 GUI 기반으로 프록시 설정을 손쉽게 관리할 수 있었다.
  • 프록시 설정 구성: AWS Lightsail의 고정 IP 주소와 포트(예: 22.22.22.22:4509)로 들어오는 요청을 홈서버의 게임 서버로 전달되도록 프록시를 설정했다.

고려해야할 점

위 방법에는 몇 가지 주의할 사항이 있다.

  • 1. AWS 인스턴스 한계: DDoS 공격이 AWS 인스턴스로 집중될 경우 인스턴스 자원이 부족해져 서비스가 중단되거나, 엄청난 과금이 발생할 수 있다.
  • 2. DDoS 방어 수준: AWS는 기본적인 DDoS 보호만 제공하므로, 대규모 공격에 대해서는 충분하지 않다.

사전 준비

  • 운영할 서버
  • DDOS 방어가 지원되는 클라우드
  • Docker
  • Docker Compose (V2.20.3 ↑)
  • 본 예제에서는 Proxy 서버를 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


마무리

AWS Lightsail과 Nginx Proxy Manager를 활용하여 홈서버의 직접적인 노출을 막는데에는 성공했으나,

서비스가 정상적으로 이어질지는 미지수이다.

DDoS가 너무 많이 들어온다 ..


Loading script...