SSD Nodes Learn Hosting plans →
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-09-13

Tự host Outline VPN trên VPS: cài đặt và access key

Chạy Outline VPN server trên VPS, không phải wiki Outline. Hướng dẫn cài đặt, tạo access key, mở management API port và nêu rõ Shadowsocks không che giấu gì.

Outline VPN server là gì

Để tự host một Outline VPN server, bạn chạy 2 thành phần trên VPS của mình: một Shadowsocks proxy server và một management API REST (representational state transfer) nhỏ đặt phía trước proxy đó. Bạn điều khiển cả 2 thành phần bằng ứng dụng desktop Outline Manager. Ứng dụng này tạo access key dưới dạng chuỗi ss:// để bạn gửi cho người khác. Outline phù hợp khi bạn cần truy cập Internet từ một network chặn VPN. Nó không được thiết kế để đạt throughput cao nhất.

Trước hết cần phân biệt rõ, vì kết quả tìm kiếm thường xuyên trộn lẫn 2 sản phẩm này. Outline VPN là công cụ vượt chặn được mô tả trong trang này, tại getoutline.org. Outline cũng là tên của một wiki và knowledge base tự host, nằm trên domain khác và do một nhóm khác phát triển. Hai sản phẩm chỉ trùng tên, không có điểm chung nào khác. Nếu bạn đang tìm wiki, đây không phải trang phù hợp.

Ai phát triển Outline VPN

Nhiều hướng dẫn vẫn gọi Outline là sản phẩm của Google. Điều đó đúng vào thời gian đầu, nhưng hiện nay không còn đúng. Outline được Jigsaw ra mắt vào năm 2018. Jigsaw là một incubator bên trong Google. Tính đến tháng 8 năm 2026, website chính thức của dự án nêu rằng Outline thuộc sở hữu của Outline Foundation, một tổ chức phi lợi nhuận độc lập. Mã nguồn được lưu trong tổ chức OutlineFoundation trên GitHub. Điều này quan trọng khi bạn quyết định có nên tin tưởng công cụ này hay không. Câu trả lời về governance hiện nay khác với năm 2018. Một hướng dẫn ghi sai chủ sở hữu có thể cũng đang trích dẫn một repository path đã thay đổi.

Trình cài đặt thực sự cài gì lên máy chủ

Install script không biên dịch mã nguồn nào. Nó chạy các Docker container.

  • shadowbox, từ image quay.io/outline/shadowbox:stable. Đây là management server. Nó chạy outline-ss-server, backend Shadowsocks của dự án, làm data plane.
  • watchtower, định kỳ kiểm tra xem có image shadowbox mới hơn hay không. Mặc định, việc kiểm tra diễn ra mỗi giờ một lần. Khi phát hiện image mới, container sẽ được restart.
  • Một certificate TLS (transport layer security) tự ký và private key được ghi vào state directory của server. Không có public certificate authority nào tham gia. Vì vậy, manager pin certificate đó bằng fingerprint SHA-256 thay vì xác thực chain.

State được lưu trong /opt/outline. Các file persistent nằm trong /opt/outline/persisted-state.

Watchtower cần được cân nhắc rõ ràng, không nên bỏ qua. Automatic image update giúp security fix được áp dụng mà bạn không cần làm gì. Nhưng version bạn đã audit cũng có thể thay đổi qua đêm mà không có changelog bạn đã đọc. Hãy chọn ưu tiên của bạn. Nếu muốn tự kiểm soát việc upgrade, hãy xóa watchtower container và tự pull image theo lịch của bạn.

Các điều kiện mà installer thực sự kiểm tra

  • Máy x86 64-bit. Script dừng với Unsupported machine type: ${MACHINE_TYPE}. Please run this script on a x86_64 machine. Gói VPS ARM sẽ không chạy được với image mặc định, vì vậy hãy kiểm tra kiến trúc trước khi mua gói.
  • Docker. Nếu thiếu Docker, script sẽ đề nghị cài đặt và in ra Would you like to install Docker? This will run 'curl https://get.docker.com/ | sh'.. Nếu Docker đã được cài nhưng daemon đang dừng, script sẽ lỗi và hỏi docker daemon có đang chạy hay không. Khởi động daemon bằng sudo systemctl enable --now docker rồi chạy lại installer.
  • Địa chỉ IPv4 public mà script có thể tự phát hiện. Script truy vấn các dịch vụ bên ngoài, hiện gồm icanhazip.com, ipinfo.io và một endpoint của Google, để lấy địa chỉ cần ghi vào management URL. Nếu máy nằm sau NAT (network address translation), hoặc bị chặn HTTP outbound, quá trình tra cứu sẽ thất bại và bạn phải cung cấp địa chỉ bằng --hostname.
  • root thông qua sudo.

Tài liệu của dự án nêu Ubuntu 20.04 LTS hoặc Debian 10 là các nền tảng được hỗ trợ. Vì mọi thứ chạy trong container, Ubuntu mới hơn thường vẫn hoạt động, nhưng khi đó bạn không còn nằm trong cấu hình mà dự án đã kiểm thử.

Cài đặt máy chủ Outline VPN

Đây là command trong tài liệu chính thức của dự án tại developer.getoutline.org, được đọc vào tháng 8 năm 2026. Hãy tự truy cập và lấy command từ đó thay vì tin vào bản sao trong bất kỳ hướng dẫn nào, kể cả hướng dẫn này: repository đã được chuyển một lần, và bản sao cũ của dòng này là nguyên nhân khiến nhiều người cài đặt từ một path đã được lưu trữ.

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

Hãy đọc script trước khi chạy. Pipe một URL từ xa vào root shell có nghĩa là bạn thực thi bất kỳ nội dung nào URL đó trả về tại thời điểm chạy. Xem trước chỉ mất một phút:

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

Ba flag tùy chọn cho phép bạn tự chọn giá trị thay vì dùng các giá trị được tạo tự động:

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

Không được mặc định rằng port có số cố định. Khi không cung cấp --api-port--keys-port, script sẽ chọn một port ngẫu nhiên lớn hơn 1023 cho mỗi port. Không có port Outline cố định. Bất kỳ hướng dẫn nào đưa ra một số cụ thể đều đang trích từ lần cài đặt của chính họ, không phải của bạn. Hãy đọc số port từ output của lần chạy command.

Khi chạy thành công, script in một banner bắt đầu bằng CONGRATULATIONS! Your Outline server is up and running. và yêu cầu bạn sao chép dòng tiếp theo, bao gồm cả dấu ngoặc nhọn, vào giao diện Outline Manager. Dòng đó có dạng:

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

Sau đó, script cho biết chính xác các port cần mở và điền vào những số port đã chọn:

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

Nếu đóng terminal và làm mất dòng cấu hình đó, dòng này vẫn còn trên server. sudo cat /opt/outline/access.txt sẽ in lại dòng đó.

Trước khi mở manager, hãy kiểm tra xem các container có thực sự đang chạy hay không:

sudo docker ps

Bạn phải thấy shadowboxwatchtower, cả hai đều có trạng thái Up. Container shadowbox liên tục restart có nghĩa là manager sẽ không bao giờ kết nối được. sudo docker logs shadowbox cho biết nguyên nhân.

Vì sao không nên tùy tiện public port management API

Xem lại apiUrl. Không có username và cũng không có password. Cơ chế authentication duy nhất là path segment ngẫu nhiên trong URL đó. Bất kỳ ai truy cập được management port và biết path này đều có thể đọc mọi access key trên server và xóa toàn bộ chúng.

Đề xuất UFW của chính script (ufw là firewall đơn giản trên Ubuntu) mở management port cho toàn bộ Internet:

sudo ufw allow ${API_PORT}/tcp

Cách này tiện, nhưng rộng hơn mức cần thiết. Access key port phải mở cho toàn thế giới vì người dùng của bạn kết nối vào đó. Management port chỉ cần truy cập được từ nơi bạn chạy Outline Manager. Hãy giới hạn phạm vi:

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

Tốt hơn nữa, giữ management port đóng trên public firewall và truy cập port này qua private tunnel mà bạn đã vận hành. Nếu bạn đã làm theo hướng dẫn tự host WireGuard VPN trên VPS, máy chủ Outline có thể tham gia tunnel đó và chỉ trả lời API trên địa chỉ của tunnel. Khi đó, port scan vào public IP chỉ hiển thị access key port và không hiển thị gì khác. Lưu ý rằng hầu hết provider đều có network firewall trong control panel, bên cạnh firewall trên server, và cả hai phải cho phép cùng một cấu hình.

Có thêm 2 điểm cần lưu ý về dòng config đó. Tài liệu Outline gọi đây là thông tin nhạy cảm và yêu cầu chỉ chia sẻ với những người cần quyền management, qua một kênh đã mã hóa thay vì email hoặc chat dạng plain text. Việc thu hồi quyền này cũng thực sự khó: với server được cài thủ công, cách được tài liệu hướng dẫn để vô hiệu hóa management config đã chia sẻ là cài lại toàn bộ server. Thao tác này cũng reset mọi user access key đã cấp. Hãy xem chuỗi này như root password của server, vì trên thực tế nó có vai trò như vậy.

Cấp và thu hồi access key

Outline Manager tạo key bằng một nút bấm. Bên dưới, công cụ này chỉ thực hiện các request HTTP thông thường đến đường dẫn secret API, nên bạn có thể script hóa:

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 là bắt buộc vì certificate này là self-signed. Nếu thiếu tùy chọn đó, curl sẽ dừng với lỗi SSL certificate problem: self-signed certificate và không bao giờ gửi request. API cũng hỗ trợ giới hạn dữ liệu riêng cho từng key: dùng PUT /access-keys/{id}/data-limit để đặt giới hạn và DELETE /access-keys/{id}/data-limit để gỡ giới hạn. Nhờ vậy, bạn có thể ngăn backup trên điện thoại của một người chiếm hết dung lượng bandwidth hằng tháng.

Cấp một key cho từng người. Đây là quy tắc quyết định mọi phần còn lại có hoạt động đúng hay không. Thu hồi key nghĩa là xóa key. Server sẽ ngừng chấp nhận key ngay lập tức, nên người đã rời đi sẽ mất quyền truy cập ngay khi bạn chạy lệnh xóa. Giả sử 10 người dùng chung một key. Bạn không thể chỉ xóa quyền của một người. Bạn phải xóa key, khiến cả 10 người đều ngừng hoạt động, rồi mất cả buổi tối để cấp lại key cho 9 người còn lại. Đặt tên từng key theo người sở hữu giúp lệnh xóa luôn an toàn để chạy.

Cần hiểu rõ việc xóa key không làm được gì. Chuỗi ss:// là secret bạn đã gửi cho người khác. Xóa key sẽ khiến server ngừng chấp nhận secret đó. Đây là phần bạn kiểm soát được. Việc này không thu hồi được tin nhắn bạn đã gửi chứa secret đó. Vì vậy, nếu key bị lộ, hãy xóa key và cấp một key mới, thay vì cho rằng bản sao đã biến mất.

Outline là proxy, không phải tunnel đầy đủ

Đây là điểm khiến những người chuyển từ WireGuard thường bất ngờ. Shadowsocks chuyển các kết nối TCP và UDP qua một proxy. Trên server không có network interface, không có địa chỉ peer, không có entry trong routing table và cũng không có khái niệm subnet nằm phía sau server. outline-ss-server truyền được TCP và UDP, nên browser, app và DNS đều hoạt động qua đó. ping không làm được vậy vì ICMP (internet control message protocol) không nằm trong các loại lưu lượng mà proxy Shadowsocks truyền tải. Kiểm tra bằng curl https://ifconfig.me và xác nhận địa chỉ mà lệnh trả về là địa chỉ của server, không phải địa chỉ của bạn.

Cần nói rõ các hệ quả. Bạn không thể truy cập một private network phía sau Outline server như một WireGuard peer truy cập 10.20.0.0/16, vì Outline không có route để phân phối. Bạn cũng không thể dùng nó để kết nối 2 server với nhau. Traffic peer-to-peer giữa các client không tồn tại. Vì vậy, mô hình home phổ biến trong đó điện thoại đồng bộ camera roll về một photo server tự host qua tunnel cũng không hoạt động. Nếu đó là mục tiêu, trước tiên hãy chọn server từ bài so sánh PhotoPrism và Immich rồi cấp cho server đó một VPN có thể định tuyến thay vì một proxy. Nếu bạn cần một network thực sự với địa chỉ và route, Outline không phải công cụ phù hợp. Hãy bắt đầu với bài so sánh WireGuard và OpenVPN.

Obfuscation làm gì và không làm gì

Shadowsocks mã hóa và xác thực ngay từ byte đầu tiên. Không có handshake dạng cleartext, trường phiên bản protocol, trao đổi certificate hay header cố định. Trên đường truyền, một connection trông giống như một stream gồm các byte ngẫu nhiên đi đến một high port. Đây là toàn bộ cơ sở của Outline: một thiết bị DPI (deep packet inspection) được cấu hình để nhận diện handshake của WireGuard hoặc opcode của OpenVPN trong packet đầu tiên sẽ không có dữ liệu nào để đối chiếu ở đây. outline-ss-server cũng cung cấp replay protection, được bật bằng --replay_history. Tính năng này ngăn một dạng active probing, trong đó censor gửi lại một packet đã thu thập để xem server của bạn phản hồi thế nào.

Bây giờ là phần cần nói rõ.

  • Nó không che giấu flow. Traffic của bạn vẫn đi đến một địa chỉ duy nhất, với volume đáng kể, trong nhiều giờ. Phân tích timing và volume không quan tâm payload có đọc được hay không.
  • Nó không giúp bạn ẩn danh. Nhà cung cấp biết ai đã thuê server và thường lưu thông tin thanh toán của bạn. Mọi site bạn truy cập đều thấy địa chỉ của server. Sự khác nhau giữa thuê VPS và mua dịch vụ VPN giải thích vì sao server đứng tên bạn làm thay đổi threat model thay vì loại bỏ nó.
  • Nó không hoạt động nếu địa chỉ bị chặn. Nếu censor chặn IP của server, obfuscation không còn ý nghĩa vì không có traffic nào đến để được obfuscate.
  • Nó không ngăn việc chia sẻ key. Một key được đăng trong public group chat là key mà censor có thể lấy và sử dụng. Khi đó, họ biết chính xác địa chỉ cần chặn.

Hai điểm cuối giải thích vì sao circumvention ở quy mô lớn cần nhiều địa chỉ, được xoay vòng và phân phối cẩn thận. Đây chính xác là vấn đề mà dự án Tor xây dựng bridge để giải quyết. Vì vậy, nếu adversary chặn địa chỉ nhanh hơn tốc độ bạn thuê server, hãy đọc cách Tor bridge và pluggable transport phân phối các entry point không được công khai trước khi thuê VPS thứ hai.

Chọn giữa Outline và các lựa chọn khác

Chọn Outline khi mạng chặn các giao thức VPN và những người bạn hỗ trợ sẽ không tự chỉnh sửa file cấu hình. Bạn chỉ cần gửi một chuỗi, rồi họ dán chuỗi đó vào một app. Đây là một lợi thế thực tế và cũng là lý do chính Outline tồn tại.

Chọn WireGuard khi mạng không chặn giao thức này. WireGuard nhanh hơn, chạy trong kernel, cung cấp một network có thể định tuyến và cần ít thành phần phải duy trì hơn nhiều. Toàn bộ hướng dẫn nằm trong hướng dẫn triển khai WireGuard VPN server.

Chọn bridge hoặc pluggable transport khi đối phương chặn địa chỉ thay vì chặn giao thức, hoặc khi bạn cần anonymity bên cạnh khả năng truy cập.

Chọn mesh có control plane khi vấn đề của bạn là quản lý fleet thay vì vượt chặn, vì việc phát key và cấp địa chỉ thủ công sẽ không còn mở rộng được khi có khoảng một chục máy. NetBird server tự host sẽ xử lý phần quản lý đó thay bạn. Nếu không muốn chạy control plane, trước tiên hãy xem gói miễn phí của Tailscale thực sự bao gồm những gì, vì fleet của một gia đình hoặc team nhỏ thường nằm trong giới hạn của gói này và không tốn chi phí vận hành.

FAQ

Outline VPN có giống wiki Outline không?

Không. Đây là 2 dự án không liên quan nhưng tình cờ dùng cùng một tên. Outline VPN là công cụ vượt kiểm duyệt tại getoutline.org, gồm một Shadowsocks server và REST management API, được điều khiển từ ứng dụng desktop Outline Manager. Wiki Outline là knowledge base self-host cho các team, nằm trên một domain khác. Tìm kiếm "self-host Outline" sẽ trả về cả 2. Hãy kiểm tra domain trước khi copy bất kỳ lệnh cài đặt nào.

Outline VPN có còn là sản phẩm của Google không?

Không, tính đến tháng 8 năm 2026 thì không còn. Outline được Jigsaw ra mắt vào năm 2018. Jigsaw là một incubator thuộc Google, và lịch sử này là nguồn gốc của dòng "Google VPN" trong các guide cũ. Website chính thức của dự án hiện cho biết Outline thuộc sở hữu của Outline Foundation, một tổ chức phi lợi nhuận độc lập. Các source repository nằm dưới organisation OutlineFoundation trên GitHub.

Outline server sử dụng những cổng nào?

Không có câu trả lời cố định. Đây là thiết kế có chủ ý. Nếu không truyền --api-port--keys-port cho installer, installer sẽ chọn một cổng ngẫu nhiên lớn hơn 1023 cho management API và một cổng khác cho access key. Khi chạy xong, installer in ra cả 2 cổng và yêu cầu bạn mở management port cho TCP, đồng thời mở access key port cho TCP và UDP trên firewall của bạn cũng như network firewall của nhà cung cấp. Nếu đã mất output đó, sudo cat /opt/outline/access.txt sẽ trả về management URL có kèm port.

Tôi có thể dùng Outline để truy cập private network không?

Không. Shadowsocks proxy các kết nối TCP và UDP thay vì tạo một Layer 3 tunnel. Vì vậy server không có interface hoặc route vào các mạng phía sau nó. Bạn có thể cấp AllowedIPs = 10.20.0.0/16 cho một WireGuard peer để peer đó truy cập dải mạng này. Outline không có thiết lập tương đương vì nó không có gì để route. Hãy dùng WireGuard để truy cập private network và chỉ dùng Outline để đi ra public internet.

Làm cách nào để xóa quyền truy cập của một người?

Xóa access key của người đó trong Outline Manager hoặc dùng DELETE /access-keys/{id} với management API. Server sẽ ngừng chấp nhận key đó ngay lập tức. Cách này chỉ hoạt động đúng khi mỗi người có key riêng. Vì vậy, hãy tạo 1 key cho mỗi người và đặt tên key theo tên của họ. Thu hồi quyền truy cập management là vấn đề nghiêm trọng hơn nhiều. Cách khắc phục được ghi trong tài liệu đối với management config đã chia sẻ trên server cài thủ công là cài lại toàn bộ server. Thao tác này đồng thời reset mọi user key.

#outline-vpn#shadowsocks#vpn#censorship-circumvention#tự lưu trữ#Docker