SSD Nodes Learn Hosting plans →
가이드 Matt Connor작성자 Matt Connor · 업데이트됨 2026-09-13

Outline VPN 서버 VPS 직접 구축 및 설치 가이드

Outline VPN 서버를 VPS에 직접 호스팅하는 방법을 설명합니다. Docker 기반 설치 과정과 관리 API 포트 설정, 그리고 Shadowsocks 프로토콜이 숨기지 못하는 네트워크 트래픽의 한계점을 명확히 정리했습니다. 위키 서비스와 혼동하지 않도록 주의 사항을 확인하십시오.

Outline VPN 서버란 무엇인가

Outline VPN 서버를 직접 호스팅하려면 VPS에서 두 가지를 실행해야 합니다. 하나는 Shadowsocks 프록시 서버이고, 다른 하나는 그 앞단에서 동작하는 소규모 REST(representational state transfer) 관리 API입니다. 이 두 가지는 Outline Manager 데스크톱 앱을 통해 제어하며, 이 앱은 사용자에게 전달할 ss:// 형식의 액세스 키를 생성합니다. Outline을 선택하는 이유는 VPN을 차단하는 네트워크 환경에서 인터넷에 접속하기 위해서입니다. 이 도구는 최대 처리량을 내기 위해 설계된 것이 아닙니다.

먼저, 검색 결과에서 혼동이 잦으므로 용어를 명확히 정리하겠습니다. Outline VPN은 이 페이지에서 설명하는 우회 도구이며, getoutline.org에서 확인할 수 있습니다. Outline은 다른 도메인에서 다른 운영자가 관리하는 자체 호스팅 위키 및 지식 베이스 서비스의 이름이기도 합니다. 두 서비스는 이름만 같을 뿐 아무런 관련이 없습니다. 위키 서비스를 찾으러 오셨다면, 이 페이지는 잘못된 곳입니다.

Outline VPN은 누가 만드는가

대부분의 가이드는 여전히 Outline을 Google 제품이라고 부릅니다. 이는 초기에는 사실이었으나 현재는 그렇지 않습니다. Outline은 2018년 Google 내부 인큐베이터인 Jigsaw에 의해 출시되었습니다. 2026년 8월 기준, 프로젝트 공식 사이트에 따르면 Outline은 독립 비영리 단체인 Outline Foundation이 소유하고 있으며, 코드는 GitHub의 OutlineFoundation 조직 하에 있습니다. 이 점은 해당 도구를 신뢰할지 결정할 때 중요합니다. 거버넌스에 대한 답변이 2018년과 오늘날 다르기 때문이며, 소유자를 잘못 기재한 가이드는 아마도 이전된 저장소 경로를 인용하고 있을 가능성이 높습니다.

설치 프로그램이 서버에 실제로 설치하는 항목

설치 스크립트는 아무것도 컴파일하지 않습니다. 대신 Docker 컨테이너를 실행합니다.

  • shadowbox: quay.io/outline/shadowbox:stable 이미지에서 실행됩니다. 이는 관리 서버이며, 데이터 평면으로 프로젝트의 Shadowsocks 백엔드인 outline-ss-server를 실행합니다.
  • watchtower: 타이머에 따라 더 새로운 shadowbox 이미지를 주기적으로 확인합니다. 기본값은 1시간마다 한 번이며, 새 이미지를 발견하면 컨테이너를 재시작합니다.
  • 자체 서명된 TLS(전송 계층 보안) 인증서와 개인 키: 서버의 상태 디렉터리에 기록됩니다. 공인 인증 기관(CA)을 거치지 않으므로, 관리자는 인증 체인을 검증하는 대신 SHA-256 지문(fingerprint)으로 해당 인증서를 고정(pinning)합니다.

상태 데이터는 /opt/outline 아래에 저장되며, 영구 파일은 /opt/outline/persisted-state에 위치합니다.

Watchtower는 단순히 넘길 문제가 아니라 결정이 필요한 부분입니다. 자동 이미지 업데이트는 사용자가 별도의 조치를 취하지 않아도 보안 패치가 즉시 적용된다는 장점이 있지만, 동시에 사용자가 검토했던 버전이 읽어보지 않은 변경 로그와 함께 하룻밤 사이에 바뀔 수 있다는 의미이기도 합니다. 본인에게 더 중요한 가치를 선택하십시오. 직접 업그레이드를 제어하고 싶다면 watchtower 컨테이너를 제거하고 사용자의 일정에 맞춰 직접 이미지를 pull 하십시오.

설치 프로그램이 실제로 확인하는 사전 요구 사항

  • 64비트 x86 머신. 스크립트는 Unsupported machine type: ${MACHINE_TYPE}. Please run this script on a x86_64 machine와 함께 중단됩니다. ARM VPS 플랜은 기본 이미지에서 작동하지 않으므로 플랜을 구매하기 전에 아키텍처를 확인하십시오.
  • Docker. Docker가 없으면 스크립트는 Would you like to install Docker? This will run 'curl https://get.docker.com/ | sh'.을 출력하며 설치를 제안합니다. Docker가 설치되어 있으나 데몬이 중지된 경우, 스크립트는 Docker 데몬이 실행 중인지 묻는 메시지와 함께 실패합니다. sudo systemctl enable --now docker을 사용하여 데몬을 시작한 후 설치 프로그램을 다시 실행하십시오.
  • 스크립트가 스스로 탐색할 수 있는 공인 IPv4 주소. 관리 URL에 기록할 주소를 확인하기 위해 현재 icanhazip.com, ipinfo.io 및 Google 엔드포인트와 같은 외부 서비스에 질의합니다. NAT(네트워크 주소 변환) 환경이거나 아웃바운드 HTTP가 차단된 서버에서는 이 조회가 실패하므로 --hostname를 사용하여 주소를 직접 제공해야 합니다.
  • sudo를 통한 root 권한.

프로젝트 문서에서는 지원되는 기반 운영체제로 Ubuntu 20.04 LTS 또는 Debian 10을 명시합니다. 모든 것이 컨테이너에서 실행되므로 최신 버전의 Ubuntu에서도 일반적으로 작동하지만, 이 경우 프로젝트에서 테스트하는 표준 경로를 벗어나게 됩니다.

Outline VPN 서버 설치

이 명령은 2026년 8월 기준 developer.getoutline.org에 있는 프로젝트 공식 문서에서 가져온 것입니다. 이 가이드를 포함하여 다른 곳에 복사된 내용을 신뢰하지 말고 직접 공식 문서를 확인하십시오. 저장소는 이미 한 차례 이전되었으며, 오래된 경로를 사용하면 보관된 경로에서 설치하게 될 위험이 있습니다.

sudo bash -c "$(wget -qO- https://raw.githubusercontent.com/OutlineFoundation/outline-apps/master/server_manager/install_scripts/install_server.sh)"

스크립트를 실행하기 전에 내용을 읽어보십시오. 원격 URL을 root 셸로 파이핑하는 것은 해당 URL이 제공하는 내용을 즉시 실행한다는 의미이므로, 잠시 시간을 내어 확인하는 것이 좋습니다.

wget -qO- https://raw.githubusercontent.com/OutlineFoundation/outline-apps/master/server_manager/install_scripts/install_server.sh | less

세 가지 선택적 플래그를 사용하면 생성된 값 대신 원하는 값을 직접 지정할 수 있습니다.

Usage: install_server.sh [--hostname <hostname>] [--api-port <port>] [--keys-port <port>]

  --hostname   The hostname to be used to access the management API and access keys
  --api-port   The port number for the management API
  --keys-port  The port number for the access keys

고정된 포트 번호를 기대하지 마십시오. --api-port--keys-port 플래그를 생략하면 스크립트가 각 항목에 대해 1023 이상의 임의 포트를 선택합니다. Outline에 정해진 표준 포트는 없으며, 특정 번호를 제시하는 가이드는 본인의 설치 환경을 인용하는 것일 뿐 귀하의 환경과는 다릅니다. 스크립트 실행 결과에서 포트 번호를 확인하십시오.

성공적으로 완료되면 스크립트는 CONGRATULATIONS! Your Outline server is up and running.로 시작하는 배너를 출력하며, 중괄호를 포함한 다음 줄을 복사하여 Outline Manager 인터페이스에 붙여넣으라고 안내합니다. 해당 줄의 형식은 다음과 같습니다.

{"apiUrl":"https://<your ip>:<api port>/<random secret>","certSha256":"<fingerprint>"}

그런 다음 스크립트는 선택된 포트 번호를 채워 넣으며 어떤 포트를 개방해야 하는지 정확히 알려줍니다.

Make sure to open the following ports on your firewall, router or cloud provider:
- Management port ${API_PORT}, for TCP
- Access key port ${ACCESS_KEY_PORT}, for TCP and UDP

터미널을 닫아 설정 줄을 분실했더라도 서버에 그대로 남아 있습니다. sudo cat /opt/outline/access.txt를 실행하면 다시 출력됩니다.

관리자 도구를 열기 전에 컨테이너가 실제로 실행 중인지 확인하십시오.

sudo docker ps

shadowboxwatchtower이 모두 Up 상태로 표시되어야 합니다. shadowbox 컨테이너가 계속 재시작된다면 관리자 도구가 연결되지 않으며, sudo docker logs shadowbox를 통해 그 이유를 확인할 수 있습니다.

관리 API 포트를 함부로 노출해서는 안 되는 이유

apiUrl를 다시 확인해 보십시오. 사용자 이름도 없고 비밀번호도 없습니다. 해당 URL의 무작위 경로 세그먼트가 인증의 전부이며, 이것이 보안 메커니즘의 전부입니다. 관리 포트에 접근할 수 있고 해당 경로를 아는 사람이라면 누구든 서버에 있는 모든 액세스 키를 읽고 삭제할 수 있습니다.

스크립트가 제안하는 UFW(Ubuntu의 Uncomplicated Firewall) 설정은 관리 포트를 전 세계 인터넷에 개방합니다.

sudo ufw allow ${API_PORT}/tcp

이는 편리하지만, 필요한 수준을 넘어선 설정입니다. 액세스 키 포트는 사용자가 연결하는 지점이므로 전 세계에 열려 있어야 합니다. 하지만 관리 포트는 Outline Manager를 실행하는 곳에서만 접근할 수 있으면 충분합니다. 범위를 좁히십시오.

sudo ufw allow <keys port>/tcp
sudo ufw allow <keys port>/udp
sudo ufw allow from <your admin ip> to any port <api port> proto tcp

더 좋은 방법은 공용 방화벽에서 관리 포트를 닫아두고, 이미 운영 중인 사설 터널을 통해 접근하는 것입니다. VPS에 직접 호스팅하는 WireGuard VPN 구축 과정을 완료했다면, Outline 서버를 해당 터널에 참여시켜 터널 주소로만 API 응답을 받도록 설정할 수 있습니다. 이렇게 하면 공용 IP를 포트 스캔했을 때 액세스 키 포트 외에는 아무것도 나타나지 않습니다. 대부분의 제공업체는 서버 내부 방화벽 외에도 제어판에서 별도의 네트워크 방화벽을 제공하며, 두 방화벽 모두에서 허용 설정이 되어야 함을 기억하십시오.

해당 설정 라인에 관한 두 가지 사실을 추가로 알려드립니다. Outline 문서에서는 이 정보를 민감한 데이터로 분류하며, 일반 이메일이나 채팅이 아닌 암호화된 채널을 통해 관리 권한이 필요한 사람에게만 공유할 것을 권장합니다. 또한, 한 번 공유된 관리 설정을 무효화하는 것은 매우 어렵습니다. 수동으로 설치한 서버의 경우, 공유된 관리 설정을 무효화하는 공식적인 방법은 서버를 완전히 재설치하는 것뿐이며, 이 과정에서 발급했던 모든 사용자 액세스 키도 초기화됩니다. 이 문자열을 서버의 root 비밀번호처럼 취급하십시오. 실제 운영 환경에서 이 문자열은 root 비밀번호와 다를 바 없기 때문입니다.

액세스 키 발급 및 취소

Outline Manager는 버튼 하나로 키를 생성합니다. 내부적으로는 비밀 API 경로에 대한 일반적인 HTTP 요청을 수행하므로, 스크립트로 자동화할 수 있습니다.

API="https://SERVER_IP:API_PORT/SECRET_PATH"  # the apiUrl from access.txt
curl -k "$API/access-keys"
curl -k -X POST "$API/access-keys"
curl -k -X PUT "$API/access-keys/3/name" -H 'Content-Type: application/json' -d '{"name":"anna-laptop"}'
curl -k -X DELETE "$API/access-keys/3"

-k은 인증서가 자체 서명되었기 때문에 필요합니다. 이 옵션이 없으면 curlSSL certificate problem: self-signed certificate 오류와 함께 중단되며 요청을 전송하지 않습니다. 또한 API는 키별 데이터 제한 기능을 제공합니다. PUT /access-keys/{id}/data-limit를 사용하여 제한을 설정하고 DELETE /access-keys/{id}/data-limit을 사용하여 해제할 수 있습니다. 이를 통해 특정 사용자의 기기 백업이 월간 대역폭 할당량을 모두 소진하는 상황을 방지할 수 있습니다.

사용자당 하나의 키를 발급하십시오. 이는 전체 시스템의 정상 작동을 결정짓는 핵심 규칙입니다. 키를 취소한다는 것은 키를 삭제하는 것을 의미하며, 서버는 즉시 해당 키의 수락을 중단합니다. 따라서 퇴사자가 발생하면 삭제 명령을 실행하는 즉시 접근 권한이 차단됩니다. 만약 10명이 하나의 키를 공유한다고 가정해 보십시오. 그중 한 명만 권한을 회수할 수 없습니다. 키를 삭제하면 10명 모두의 연결이 끊기며, 나머지 9명에게 다시 키를 발급하느라 저녁 시간을 허비하게 될 것입니다. 각 키에 사용자 이름을 지정해야 삭제 명령을 안전하게 실행할 수 있습니다.

삭제가 수행하지 않는 작업에 대해 명확히 이해해야 합니다. ss:// 문자열은 이미 누군가에게 전달한 비밀 정보입니다. 키를 삭제하면 서버가 해당 키를 더 이상 신뢰하지 않게 되며, 이는 관리자가 제어할 수 있는 범위입니다. 이미 전송된 메시지 자체를 회수할 수는 없습니다. 따라서 키가 유출되었다면 해당 키를 삭제하고 새로운 키를 발급하십시오. 기존에 유출된 복사본이 사라졌다고 가정해서는 안 됩니다.

Outline은 전체 터널이 아닌 프록시입니다

WireGuard를 사용하다가 넘어온 사람들이 가장 놀라는 차이점입니다. Shadowsocks는 TCP 및 UDP 연결을 프록시를 통해 전달합니다. 서버에는 네트워크 인터페이스, 피어 주소, 라우팅 테이블 항목이 없으며, 서버 뒤에 있는 서브넷에 대한 개념도 존재하지 않습니다. outline-ss-server는 TCP와 UDP를 전달하므로 브라우저, 앱, DNS는 모두 정상적으로 작동합니다. ping은 작동하지 않는데, 이는 ICMP(internet control message protocol)가 Shadowsocks 프록시가 전달하는 프로토콜에 포함되지 않기 때문입니다. curl https://ifconfig.me로 테스트하여 반환되는 주소가 본인의 주소가 아닌 서버의 주소인지 확인하십시오.

그 결과는 명확히 설명할 가치가 있습니다. Outline은 배포할 경로가 없으므로 WireGuard 피어가 10.20.0.0/16에 도달하는 방식처럼 Outline 서버 뒤의 사설 네트워크에 접근할 수 없습니다. Outline으로 두 서버를 서로 연결할 수도 없습니다. 클라이언트 간의 피어 투 피어 트래픽도 존재하지 않습니다. 또한 이는 휴대폰이 터널을 통해 자체 호스팅된 사진 서버로 카메라 롤을 동기화하는 일반적인 가정용 설정도 불가능하게 만듭니다. 따라서 그러한 목적이라면 PhotoPrism과 Immich 비교를 통해 먼저 서버를 선택하고, 프록시가 아닌 라우팅이 가능한 VPN을 사용하십시오. 주소와 경로가 있는 실제 네트워크가 필요하다면 Outline은 적합한 도구가 아니며, WireGuard와 OpenVPN 비교가 더 나은 출발점이 될 것입니다.

난독화의 기능과 한계

Shadowsocks는 첫 바이트부터 암호화와 인증을 수행합니다. 평문 핸드셰이크, 프로토콜 버전 필드, 인증서 교환, 고정 헤더가 존재하지 않습니다. 네트워크상에서 연결은 높은 포트로 향하는 무작위 바이트 스트림처럼 보입니다. 이것이 Outline의 핵심 논리입니다. WireGuard 핸드셰이크나 OpenVPN의 첫 패킷 내 opcode를 식별하도록 설정된 DPI(심층 패킷 분석) 장비는 이 트래픽에서 일치하는 패턴을 찾을 수 없습니다. outline-ss-server--replay_history을 통해 활성화할 수 있는 재전송 방지(replay protection) 기능도 제공합니다. 이는 검열관이 캡처한 패킷을 다시 전송하여 서버의 응답을 확인하는 능동적 탐지 공격을 무력화합니다.

이제 솔직한 한계를 설명합니다.

  • 흐름을 숨기지는 못합니다. 트래픽은 여전히 특정 주소로, 상당한 양이, 장시간에 걸쳐 전송됩니다. 타이밍과 트래픽 양 분석은 페이로드를 읽을 수 있는지 여부와 관계없이 작동합니다.
  • 익명성을 보장하지 않습니다. 서비스 제공업체는 서버 임대자를 알고 있으며 대개 결제 정보를 보유합니다. 또한 방문하는 모든 사이트는 서버의 주소를 확인하게 됩니다. VPS 임대와 VPN 서비스 구매의 차이에서는 본인 명의의 서버를 사용하는 것이 위협 모델을 제거하는 것이 아니라 변경하는 것임을 다룹니다.
  • 주소 차단을 막지 못합니다. 검열관이 서버의 IP를 차단하면 난독화는 무의미합니다. 난독화할 데이터 자체가 도착하지 않기 때문입니다.
  • 키 공유를 막지 못합니다. 공개 그룹 채팅에 게시된 키는 검열관이 수집하여 사용할 수 있습니다. 이는 검열관에게 정확히 어떤 주소를 차단해야 할지 알려주는 꼴이 됩니다.

위의 마지막 두 가지 이유 때문에 대규모 우회 서비스는 여러 주소를 순환하며 신중하게 배포해야 합니다. 이는 Tor 프로젝트가 브리지(bridge)를 통해 해결하고자 했던 문제와 정확히 일치합니다. 따라서 상대방이 서버를 임대하는 속도보다 더 빠르게 주소를 차단한다면, 두 번째 VPS를 임대하기 전에 Tor 브리지와 플러그형 전송이 비공개 진입점을 배포하는 방식을 먼저 읽어보시기 바랍니다.

Outline과 대안 사이에서 선택하기

네트워크가 VPN 프로토콜을 차단하거나, 지원 대상자가 설정 파일을 직접 수정하기 어려운 환경이라면 Outline을 선택하십시오. 문자열 하나를 전달하고 앱에 붙여넣기만 하면 되기 때문입니다. 이것은 실질적인 장점이며, Outline이 존재하는 주된 이유이기도 합니다.

네트워크가 허용한다면 WireGuard를 선택하십시오. WireGuard는 더 빠르고 커널 수준에서 동작하며, 라우팅 가능한 네트워크를 제공하고, 유지 관리해야 할 요소가 훨씬 적습니다. 전체 구축 방법은 WireGuard VPN 서버 가이드에 있습니다.

상대방이 프로토콜이 아닌 IP 주소를 차단하거나, 연결성뿐만 아니라 익명성도 필요하다면 브리지나 플러그형 전송(pluggable transport)을 선택하십시오.

검열 회피가 아니라 기기 관리(fleet management)가 문제라면 제어 평면(control plane)이 포함된 메시 네트워크를 선택하십시오. 키를 수동으로 배포하고 주소를 할당하는 방식은 기기가 10여 대를 넘어가면 확장하기 어렵기 때문입니다. 자체 호스팅 NetBird 서버를 사용하면 이러한 관리 부담을 덜 수 있습니다. 제어 평면을 직접 운영하고 싶지 않다면 먼저 Tailscale의 무료 플랜 범위를 확인해 보십시오. 가정용이나 소규모 팀 단위의 기기 관리라면 무료 플랜으로 충분히 운영 가능한 경우가 많습니다.

FAQ

Outline VPN과 Outline 위키는 같은 것인가요?

아닙니다. 두 프로젝트는 이름만 같을 뿐 서로 관련이 없습니다. Outline VPN은 getoutline.org에서 제공하는 검열 우회 도구로, Shadowsocks 서버와 REST 관리 API로 구성되며 Outline Manager 데스크톱 앱을 통해 제어합니다. Outline 위키는 팀을 위한 자체 호스팅 지식 관리 도구이며, 다른 도메인에서 운영됩니다. "self-host Outline"으로 검색하면 두 결과가 모두 나타납니다. 설치 명령어를 복사하기 전에 반드시 도메인을 확인하십시오.

Outline VPN은 여전히 Google 제품인가요?

아니요, 2026년 8월 기준으로 그렇지 않습니다. Outline은 2018년 Google 내 인큐베이터인 Jigsaw를 통해 출시되었으며, 구형 가이드에 나오는 "Google VPN"이라는 문구는 이러한 역사에서 비롯된 것입니다. 현재 프로젝트 공식 사이트에는 Outline이 독립 비영리 단체인 Outline Foundation 소유임이 명시되어 있으며, 소스 저장소는 GitHub의 OutlineFoundation 조직 하에 있습니다.

Outline 서버는 어떤 포트를 사용하나요?

설계상 고정된 포트는 없습니다. 설치 프로그램에 --api-port--keys-port을 전달하지 않으면, 관리 API용으로 1023 이상의 임의 포트를 선택하고 액세스 키용으로 또 다른 포트를 선택합니다. 설치가 완료되면 두 포트 번호가 모두 출력되며, 방화벽과 제공업체의 네트워크 방화벽에서 관리 포트는 TCP로, 액세스 키 포트는 TCP 및 UDP로 개방하라고 안내합니다. 출력을 확인하지 못했다면 sudo cat /opt/outline/access.txt를 통해 포트 번호가 포함된 관리 URL을 확인할 수 있습니다.

Outline을 사용하여 사설 네트워크에 접근할 수 있나요?

아니요. Shadowsocks는 Layer 3 터널을 구축하는 대신 TCP 및 UDP 연결을 프록시하므로, 서버에는 인터페이스나 서버 뒤의 네트워크로 향하는 경로가 없습니다. WireGuard 피어에는 AllowedIPs = 10.20.0.0/16을 부여하여 해당 대역에 접근할 수 있지만, Outline에는 라우팅할 대상이 없으므로 이에 상응하는 설정이 없습니다. 사설 네트워크 접근에는 WireGuard를 사용하고, 공개 인터넷 접속용으로만 Outline을 사용하십시오.

특정 사용자의 접근 권한을 어떻게 제거하나요?

Outline Manager 또는 관리 API에 DELETE /access-keys/{id}를 사용하여 해당 사용자의 액세스 키를 삭제하십시오. 서버는 즉시 해당 키의 수락을 중단합니다. 이 방식은 모든 사용자가 각자의 키를 보유할 때만 깔끔하게 작동하므로, 사용자별로 키를 하나씩 생성하고 이름을 지정하는 것이 좋습니다. 관리자 권한을 회수하는 것은 훨씬 복잡한 문제입니다. 수동으로 설치한 서버에서 관리자 설정을 공유했을 경우, 문서화된 해결책은 전체 재설치뿐이며 이 과정에서 모든 사용자 키가 동시에 초기화됩니다.

#outline-vpn#shadowsocks#vpn#censorship-circumvention#self-hosting#docker