5.9 KiB
5.9 KiB
MC Domain Filter Proxy
마인크래프트 서버 접속 시 특정 도메인(mc.tkrmagid.kr)으로만 접속 가능하게 필터링하는 프록시 + 웹 관리 대시보드
프로젝트 개요
목적
- 외부 IP 직접입력, 다른 도메인으로 접속 시 차단
mc.tkrmagid.kr도메인으로만 마인크래프트 서버 접속 허용- Fabric, Paper, Spigot, NeoForge 등 어떤 서버 종류든 무관하게 동작
동작 원리
마인크래프트 클라이언트는 접속 시 첫 핸드셰이크 패킷에 사용자가 입력한 주소(서버 주소창의 문자열)를 담아 전송한다.
이 프록시는 해당 패킷을 읽어 허용된 도메인이 아니면 연결을 즉시 차단한다.
네트워크 구조
외부 인터넷
↓
공유기 (포트포워딩 25565 → Proxmox IP)
↓
Proxmox Docker 컨테이너 (MC Domain Filter)
↓
게임PC 내부IP:25565 (실제 마인크래프트 서버)
기술 스택
| 구성 요소 | 기술 |
|---|---|
| 프록시 코어 | Python (asyncio) |
| 웹 대시보드 | React + Vite (또는 Next.js) |
| 백엔드 API | FastAPI |
| 설정 저장 | JSON 파일 (sqlite도 가능) |
| 컨테이너 | Docker + docker-compose |
| 리버스 프록시 | nginx (대시보드용) |
기능 요구사항
핵심 기능 (프록시)
- Minecraft 핸드셰이크 패킷 파싱 (varint 포함)
- 허용 도메인 리스트와 비교 후 차단/통과 결정
- 통과된 패킷을 백엔드 서버로 투명하게 중계
- 첫 패킷 이후 양방향 TCP 터널링
웹 대시보드 (NPM 스타일 UI)
- 허용 도메인 관리 - 추가 / 삭제 / 활성화 토글
- 백엔드 서버 설정 - 게임PC IP, 포트 변경
- 실시간 접속 로그 - 허용/차단 내역, 접속 IP, 사용 도메인, 시각
- 대시보드 홈 - 현재 상태, 총 접속 수, 차단 수 통계 카드
- 프록시 on/off 토글
- 설정 변경 후 프록시 재시작 없이 즉시 반영 (hot reload)
UI 디자인 레퍼런스
- Nginx Proxy Manager Plus 스타일
- 다크/라이트 모드
- 사이드바 네비게이션
- 카드 기반 레이아웃
- 토글 스위치, 모달 폼
프로젝트 구조
mc-domain-filter/
├── docker-compose.yml
├── proxy/
│ ├── Dockerfile
│ ├── main.py # asyncio TCP 프록시
│ ├── config.py # 설정 로드/저장
│ ├── handshake.py # MC 핸드셰이크 파서
│ └── requirements.txt
├── api/
│ ├── Dockerfile
│ ├── main.py # FastAPI 백엔드
│ ├── routes/
│ │ ├── config.py # 설정 CRUD
│ │ └── logs.py # 로그 조회
│ └── requirements.txt
├── frontend/
│ ├── Dockerfile
│ ├── src/
│ │ ├── pages/
│ │ │ ├── Dashboard.jsx
│ │ │ ├── Domains.jsx
│ │ │ └── Logs.jsx
│ │ └── components/
│ └── package.json
├── nginx/
│ └── nginx.conf
└── data/
├── config.json # 설정 파일 (볼륨 마운트)
└── logs.db # 접속 로그
설정 파일 구조 (config.json)
{
"proxy": {
"listen_port": 25565,
"enabled": true
},
"backend": {
"host": "192.168.0.xx",
"port": 25565
},
"allowed_domains": [
{
"domain": "mc.tkrmagid.kr",
"enabled": true,
"note": "메인 도메인"
}
]
}
Minecraft 핸드셰이크 파싱
패킷 구조:
[varint] Packet Length
[varint] Packet ID (0x00)
[varint] Protocol Version
[varint] Server Address Length
[string] Server Address ← 이게 클라이언트가 입력한 주소
[ushort] Server Port
[varint] Next State (1=status, 2=login)
서버 주소 끝에 \x00 널 문자가 붙는 경우 있음 → strip 처리 필요
docker-compose.yml 예시
version: '3.8'
services:
proxy:
build: ./proxy
ports:
- "25565:25565"
volumes:
- ./data:/data
restart: unless-stopped
network_mode: bridge
api:
build: ./api
expose:
- "8000"
volumes:
- ./data:/data
restart: unless-stopped
frontend:
build: ./frontend
expose:
- "3000"
restart: unless-stopped
nginx:
image: nginx:alpine
ports:
- "8080:80" # 대시보드 접근 포트
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
depends_on:
- api
- frontend
restart: unless-stopped
API 엔드포인트
| 메서드 | 경로 | 설명 |
|---|---|---|
| GET | /api/config |
전체 설정 조회 |
| PUT | /api/config |
설정 저장 |
| GET | /api/domains |
도메인 목록 |
| POST | /api/domains |
도메인 추가 |
| DELETE | /api/domains/{domain} |
도메인 삭제 |
| PATCH | /api/domains/{domain} |
도메인 활성화/비활성화 |
| GET | /api/logs |
접속 로그 (페이지네이션) |
| GET | /api/status |
프록시 상태, 통계 |
| POST | /api/proxy/restart |
프록시 재시작 |
환경 정보
Proxmox 서버 스펙 (프록시 실행 환경)
- CPU: Intel Core i3-10100 (4코어 8스레드, 3.6GHz, 최대 4.3GHz)
- RAM: DDR4 32GB (Samsung 16GB × 2, 3200 MT/s, 듀얼채널)
- 가상화: VT-x 지원
게임PC (실제 MC 서버)
- 같은 공유기 내 LAN 환경
- 내부 IP로 통신
주의사항
- 프록시와 FastAPI는
data/config.json을 공유 볼륨으로 사용 - 설정 변경 시 프록시 프로세스에 SIGHUP 또는 내부 이벤트로 hot reload
- 게임PC의 MC 서버는 포트 변경 불필요 (프록시가 25565→25565 그대로 중계)
- 대시보드는 Proxmox 내부 IP:8080 으로 접근
- 대시보드 포트(8080)는 외부에 포트포워딩 하지 않을 것 권장