블로그로 돌아가기
8월 19, 2026가이드

VPS에 3X-UI 패널을 설치하는 방법

Ubuntu에 3X-UI Xray 패널을 설치하고, 웹 인터페이스를 잠그고, TLS를 발급하고, VLESS Reality 인바운드를 만들고, 사용자를 관리하고, 데스크톱과 모바일에서 클라이언트를 연결하는 완전한 프로덕션 지향 가이드입니다.

VPS에 3X-UI 패널을 설치하는 방법

3X-UI는 Xray-core용 웹 패널입니다. JSON을 손으로 고치지 않고도 인바운드(VLESS, VMess, Trojan, Shadowsocks 등)를 관리하고, 구독 링크를 발급하고, 트래픽 한도와 만료일을 설정하고, 실시간 연결을 볼 수 있습니다. 이미 VPS를 운영하는 사람에게는, 여섯 달 뒤 아무도 손대지 못하는 일회성 설정 대신 유지 가능한 프록시 스택을 가장 빨리 얻는 방법 중 하나입니다.

이 가이드는 대부분의 Hiddence Linux 이미지가 첫 부팅 후 보이는 모습인, 깨끗한 Ubuntu 22.04 또는 24.04 VPS를 기준으로 작성했습니다. 널리 쓰이는 MHSanaei 3X-UI 빌드를 설치하고, 첫 로그인에서 모든 기본 비밀값을 바꾸고, 패널을 HTTPS 뒤에 두고, 실제로 필요한 포트만 열고, VLESS + Reality 인바운드를 만든 다음 클라이언트 앱까지 따라갑니다. 이미 Marzban 글을 읽었다면 아이디어는 비슷합니다. Xray 위의 패널입니다. 다만 설치 경로, 파일 배치, 일상 작업 흐름이 다르므로 포트를 나누는 법을 정말 알지 않는 한 같은 서버에 둘을 섞지 마세요.

날것의 Xray 설정 대신 3X-UI를 쓰는 이유

날것의 Xray 설정은 사용자 한 명, 인바운드 하나에는 괜찮습니다. 친구를 추가하고, Reality 키를 순환하고, 폰이 한 번에 가져올 구독 URL이 필요한 순간 패널은 몇 시간을 아껴 줍니다. 3X-UI는 사용자를 로컬 데이터베이스에 저장하고, 변경 후 Xray를 깔끔하게 재시작하며, 트래픽과 온라인 상태용 작은 대시보드를 제공합니다. 그 자체로 마법의 익명 계층은 아닙니다. VPS 위치, TLS 지문, 인바운드 유형, 운영 습관이 네트워크에서의 동작을 여전히 결정합니다.

  • 손으로 고친 JSON 대신 인바운드, 클라이언트, 트래픽, 만료를 다루는 웹 UI
  • v2rayN, v2rayNG, Streisand, Happ 등 클라이언트용 구독 링크 내장
  • 한 줄 설치와 문서화된 업데이트 경로
  • 작은 VPS에서도 잘 동작(개인 용도라면 1 vCPU / 1 GB RAM이면 충분)
  • root는 자신의 서버에 남습니다. 패널이 설정을 제3자 클라우드로 보내지 않습니다

시작하기 전에 필요한 것

도메인과 방화벽 부분을 건너뛰지 마세요. 포트 2053의 HTTP에 기본 비밀번호로 남겨 둔 패널은 몇 시간 안에 봇이 스캔합니다. 아래를 준비한 뒤 SSH로 root(또는 sudo 사용자)로 접속하세요.

  • 공인 IPv4 주소가 있는 Linux VPS(Ubuntu 22.04/24.04 권장)
  • RAM 최소 1 GB, 디스크 10 GB. 다른 서비스도 돌리면 2 GB가 더 편함
  • SSH를 통한 root 또는 sudo 권한
  • VPS IP를 가리키는 A 레코드가 있는 도메인 또는 서브도메인(정상적인 패널 인증서에 필요)
  • 약 20–30분. A 레코드를 방금 만들었다면 DNS 대기 시간 추가

1단계: 시스템을 업데이트하고 시간대를 설정합니다

새 VPS에는 대기 중인 보안 업데이트가 있고 시계는 UTC인 경우가 많습니다. 설치 프로그램이 오래된 OpenSSL이나 curl과 싸우지 않도록 먼저 패키지를 업데이트하세요. 시간대는 Xray 자체에는 선택 사항이지만, 패널 로그와 인증서 만료일을 훨씬 읽기 쉽게 만듭니다.

bash
ssh root@YOUR_VPS_IP

apt update && apt -y upgrade
apt -y install curl wget ca-certificates gnupg socat tar unzip

timedatectl set-timezone UTC
hostnamectl set-hostname panel

# Confirm DNS for your subdomain (should print your VPS IP):
dig +short panel.example.com

2단계: 3X-UI 설치

MHSanaei 3X-UI 빌드의 공식 설치 스크립트는 최신 릴리스를 받고, Xray-core를 설치하고, systemd 서비스를 만들고, 첫 로그인 URL을 출력합니다. 출력을 주의 깊게 읽으세요. 무작위 경로와 생성된 사용자 이름/비밀번호가 들어 있습니다. 즉시 비밀번호 관리자에 복사하세요. 스크립트가 패널 포트를 물으면 2053을 유지하거나 사용하지 않는 높은 포트를 고르면 됩니다. 방화벽 단계에서 쓰니 기억해 두세요.

bash
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)

# After install, useful commands:
x-ui                    # interactive menu (start/stop/restart, reset, update)
systemctl status x-ui    # confirm the service is active
ss -tulpn | grep x-ui    # see which port the panel listens on
이 SSH 세션은 열어 두세요. 패널에서 잠기면 서버의 x-ui 메뉴로 재설치 없이 관리자 비밀번호를 재설정할 수 있습니다.

3단계: 첫 로그인과 즉시 강화

설치 프로그램이 출력한 URL을 엽니다. 보통 http://YOUR_IP:2053/<random-path> 입니다. 생성된 자격 증명으로 로그인한 뒤 Panel Settings(또는 Configuration)로 갑니다. 사용자 이름과 비밀번호를 고유한 값으로 바꿉니다. 패널이 웹 기본 경로를 바꿀 수 있게 하면 바꾸세요. 긴 무작위 경로는 지나가는 스캔을 크게 줄입니다. 2053이 아닌 값을 원하면 수신 포트를 설정합니다. 저장하고 UI에서 또는 systemctl restart x-ui로 패널을 재시작한 뒤 새 URL로 다시 로그인합니다.

다음으로, 빌드가 제공하면 이중 인증을 켜고 절대 쓰지 않을 인바운드 템플릿은 끕니다. Xray 설정에서는 다른 빌드를 고정할 분명한 이유가 없으면 패널과 함께 온 코어 버전을 그대로 둡니다. 나중에 Reality나 리버스 프록시가 80/443을 쓸 예정이면 지금은 패널을 그 포트에 노출하지 마세요. 전략을 하나 고르고 지키세요.

  • 생성된 관리자 로그인은 즉시 교체
  • 비밀 웹 경로는 유지하고 패널을 / 로 옮기지 않음
  • 기본이 아닌 패널 포트를 선호하고 기록
  • 이 비밀번호를 다른 서비스에서 재사용하지 않음

4단계: 패널용 TLS 인증서

브라우저는 HTTP에서 경고하고, 공용 네트워크에서 관리자 비밀번호를 평문으로 보내는 것은 나쁜 생각입니다. 포트 80이 비어 있고 도메인이 이 VPS를 가리키면 3X-UI는 Let's Encrypt 인증서를 요청할 수 있습니다. 패널에서 인증서 / SSL 섹션을 열고 panel.example.com을 입력한 뒤 인증서를 요청하세요. 포트 80이 이미 쓰이면 DNS-01 흐름을 쓰거나 Caddy/Nginx를 앞에 두고 127.0.0.1:2053으로 리버스 프록시하세요.

bash
# Quick check that port 80 is free before the panel ACME challenge:
ss -tulpn | grep ':80'

# If you terminate TLS on Caddy instead of inside 3X-UI:
# Caddyfile example (panel stays on 127.0.0.1:2053):
# panel.example.com {
#     reverse_proxy 127.0.0.1:2053
# }
패널의 인증서는 웹 UI 전용입니다. VLESS Reality는 다른 TLS 이야기입니다(다른 사이트로 위장). 클라이언트 트래픽에 이 Let's Encrypt 파일을 쓰지 않습니다.

5단계: VLESS Reality 인바운드 만들기

Inbounds에서 새 인바운드를 만듭니다. 많은 네트워크에서 단단한 기본값은 Reality와 TCP를 쓰는 VLESS입니다. 패널 포트가 아닌 포트를 고르세요. 다른 것이 묶여 있지 않으면 443이 흔합니다. 아니면 높은 TCP 포트를 쓰고 방화벽과 맞추세요. 첫 클라이언트용 UUID를 생성하고, UI에서 Reality 키 쌍을 만들고, dest / serverNames를 흉내 내도 되는 합법적인 대상(TLS 1.3을 지원하는 잘 알려진 사이트)으로 설정하세요. 인바운드를 저장하고 패널 로그에서 Xray가 오류 없이 다시 로드되는지 확인하세요.

그다음 필요하면 그 인바운드에 클라이언트를 추가합니다. 각 사용자는 UUID, 선택적 이메일 태그, 선택적 트래픽 또는 시간 한도를 받습니다. 사용자 행에서 연결 링크나 구독 URL을 복사하세요. 공개 채팅에 그 링크를 올리지 마세요. 비밀번호와 같습니다.

bash
# On the server, confirm Xray is listening on the inbound port (example: 443):
ss -tulpn | grep -E ':443|:2053'

# Follow Xray logs if a client cannot connect:
journalctl -u x-ui -f

6단계: 방화벽 — 필요한 포트만

Ubuntu에서는 UFW면 충분합니다. 잠기지 않도록 먼저 SSH를 허용하고, 그다음 패널 포트와 인바운드 포트입니다. 패널에서 Let's Encrypt 인증서를 요청했다면 발급 중에 80/tcp도 허용하세요. 443의 Reality 인바운드는 443/tcp가 필요합니다(같은 포트에 패널은 두지 않음).

bash
ufw allow OpenSSH
ufw allow 2053/tcp comment '3x-ui panel (change if you picked another port)'
ufw allow 443/tcp comment 'VLESS Reality inbound'
# ufw allow 80/tcp comment 'only if panel ACME needs it'
ufw enable
ufw status verbose

클라이언트 연결

Windows에서는 v2rayN이 클립보드의 VLESS 링크를 가져올 수 있습니다. Android에서는 v2rayNG 또는 비슷한 Xray 클라이언트가 QR 코드로 같은 일을 합니다. iOS에서는 VLESS Reality를 지원하는 클라이언트를 쓰세요(예: Streisand 또는 Happ, 지역에서 현재 구할 수 있는 것에 따름). 가져온 뒤 프로필을 켜고 패널의 온라인 목록을 확인하세요. 클라이언트가 오프라인으로 남으면 흔한 원인은 잘못된 포트, TCP 전용 인바운드에 UDP가 켜짐, dest와 맞지 않는 Reality serverName, 노트북의 로컬 방화벽입니다.

  • Windows: v2rayN — VLESS 링크를 가져오고 필요에 따라 라우팅 설정(전역 vs 규칙 기반)
  • Android: v2rayNG — 패널 사용자 페이지에서 QR 스캔
  • macOS / iOS: VLESS + Reality를 지원하는 클라이언트. 같은 링크를 붙여넣기
  • 구독 URL: 클라이언트에 추가하면 UUID 순환 때 수동 재가져오기가 필요 없음

업데이트, 백업, 재설치 안전

패널을 업데이트하기 전에 매번 UI에서 백업(데이터베이스 + 설정)을 다운로드하세요. VPS 밖에 보관하세요. 업데이트는 보통 x-ui 다음 메뉴의 업데이트 옵션이거나, 기존 설치를 감지하는 같은 설치 스크립트입니다. 업데이트 후 systemd 서비스가 active인지, 인바운드가 여전히 수신하는지 확인하세요. OS를 재설치하면 모든 UUID를 손으로 다시 만들지 말고 패널에서 백업을 복원하세요.

bash
x-ui   # choose update when prompted, or:
# bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)

# Backup files commonly live under /etc/x-ui/ — copy them off-box:
ls -la /etc/x-ui/
# Example offsite copy:
# scp -r /etc/x-ui/ you@backup-host:~/x-ui-backup-$(date +%F)/

문제 해결

첫날 실패의 대부분은 DNS, 포트, Reality 필드입니다. 패널을 재설치하기 전에 이 목록을 따라가세요. 백업 없이 재설치하는 것이 모든 클라이언트 UUID를 잃는 방법입니다.

  • 웹 UI를 열 수 없음: systemctl status x-ui, ss -tulpn, UFW를 확인. URL에 비밀 경로가 들어 있는지도 확인.
  • 관리자 비밀번호를 잊음: 서버에서 x-ui를 실행하고 재설정 옵션을 사용.
  • 클라이언트는 연결되다 멈춤: 인바운드 포트가 막혔거나 TCP Reality 인바운드에 UDP를 켰음.
  • 패널 TLS 오류: 도메인 A 레코드가 아직 여기를 가리키지 않거나 ACME 중 포트 80이 사용 중.
  • Reality 핸드셰이크 실패: dest/serverNames 불일치, 또는 다른 서비스가 이미 443에 바인딩.
  • CPU가 높음: 1 vCPU 플랜에 인바운드가 너무 많거나 열린 포트에 대한 스캔/플러드 — ss와 패널 온라인 수를 확인.

실제로 중요한 보안 메모

패널을 프로덕션 관리 소프트웨어처럼 다루세요. 새 사용자를 만들고 모든 UUID를 읽을 수 있습니다. 웹 포트에 도달할 수 있는 사람을 제한하세요. 안정적인 사무실 IP가 있으면 UFW에서 2053/tcp는 그 IP만 허용하세요. SSH는 비밀번호가 아니라 키로 하세요. 443에서 Reality를 쓰면 같은 IP에서 관련 없는 공개 사이트를 돌리지 마세요. 한 포트에서 경쟁하는 TLS 스택은 장애의 고전입니다. 패널 스크린샷이 채팅에 새면 관리자 비밀번호를 순환하세요.

  • SSH는 키만. 키가 되면 비밀번호 로그인 비활성화
  • 가능하면 방화벽에서 패널 포트 제한
  • /etc/x-ui를 일정에 따라 서버 밖으로 백업
  • 공개 Telegram 그룹에 구독 URL을 공유하지 않음
  • 디스크를 주시: 바쁜 인바운드에서 로그와 트래픽 통계가 커짐

실무 팁

  • 거의 같은 인바운드 열 개보다 클라이언트가 많은 인바운드 하나가 운영하기 쉬움
  • 클라이언트를 기기 단위로 이름 짓기(laptop-anna, phone-ben)하면 트래픽 차트가 의미가 있음
  • 웹사이트용 리버스 프록시도 필요하면 사이트를 다른 IP나 다른 포트에 두세요. Reality와 443을 다투지 마세요
  • x-ui를 재시작한 뒤에는 SSH 세션을 떠나기 전에 클라이언트 하나로 테스트
  • 업데이트 전에 changelog를 읽으세요. 금요일 밤에 'latest'로 점프하지 마세요

이제 3X-UI가 systemd 서비스로 설치되었고, 잠긴 관리 URL, 패널의 TLS, VLESS Reality 인바운드, 그 포트에 맞는 방화벽 규칙, 백업 습관이 있습니다. 인바운드 페이지에서 클라이언트를 추가하고, 각 기기에서 링크를 가져오고, 백업 후에만 패널을 업데이트하세요. 무언가 깨지면 전체 재설치가 아니라 VPS의 x-ui 메뉴가 복구 경로입니다.