Trong thế giới self-hosting và homelab, Docker đã trở thành công cụ không thể thiếu để triển khai nhiều ứng dụng mã nguồn mở một cách dễ dàng và hiệu quả. Tôi đã tự host rất nhiều ứng dụng dưới dạng container trên chiếc Raspberry Pi của mình mà không lo làm rối hệ thống. Tuy nhiên, một số container, đặc biệt là các ứng dụng tìm kiếm và tự động tải dữ liệu, thường xuyên thu thập thông tin từ Internet. Để bảo vệ quyền riêng tư và ngăn chặn việc lộ địa chỉ IP công cộng, ý tưởng ban đầu là sử dụng một mạng riêng ảo (VPN) cho toàn bộ lưu lượng. Nhưng giải pháp này lại gây ra nhiều vấn đề: mọi hoạt động trên mạng đều chậm lại và một số dịch vụ không hoạt động khi phát hiện kết nối VPN.
Đó là lúc tôi khám phá ra Gluetun, một VPN client chuyên biệt dành cho các Docker container. Đây thực sự là một bước đột phá trong việc định tuyến lưu lượng truy cập VPN chỉ cho các ứng dụng cụ thể trên máy chủ tại nhà của tôi, giúp giải quyết triệt để các lo ngại về quyền riêng tư và ngăn chặn rò rỉ IP thông qua một đường hầm VPN an toàn. Gluetun không phải là một VPN đầy đủ với các tùy chọn kết nối inbound, nhưng nó hoạt động hoàn hảo cho một homelab tự host hoặc phục vụ mục đích phát triển. Tôi tin rằng Gluetun là phương pháp tối ưu nhất để định tuyến mọi lưu lượng outbound từ các Docker container.
Tại Sao Gluetun Là Lựa Chọn Tối Ưu để Định Tuyến Container Qua VPN?
Việc sử dụng VPN để bảo vệ toàn bộ lưu lượng trên mạng gia đình của tôi đã không hoạt động suôn sẻ như mong đợi. Nhiều hoạt động cá nhân và công việc bị gián đoạn khi phần mềm hoặc dịch vụ phát hiện kết nối VPN. Cuối cùng, việc sử dụng Gluetun cho phép định tuyến VPN theo từng container cụ thể đã giúp giải quyết vấn đề mà không cần thay đổi cài đặt mạng. Là một VPN client nhẹ cho Docker container, Gluetun dễ dàng tích hợp. Tất cả những gì tôi cần làm là cài đặt nó như một Docker container khác mà không yêu cầu cấu hình thêm về firewall hay các thay đổi mạng cấp hệ điều hành.
Kiểm Soát Chi Tiết, Cô Lập và Bảo Mật Cao cho Từng Container
Gluetun hỗ trợ nhiều nhà cung cấp VPN phổ biến như Private Internet Access, Surfshark, NordVPN, ExpressVPN, Mullvad và nhiều dịch vụ khác. Do đó, tôi chỉ cần cung cấp thông tin đăng nhập của dịch vụ VPN mình đang sử dụng (ví dụ: Surfshark), và Gluetun sẽ tự động quản lý cài đặt để cấu hình tài khoản bằng giao thức WireGuard hoặc OpenVPN. Khi hoạt động như một VPN client, Gluetun sử dụng các cài đặt của nhà cung cấp VPN để tạo một đường hầm an toàn cho tất cả lưu lượng đi ra từ các container sử dụng mạng của nó. Bằng cách này, nó cũng sử dụng các nhà cung cấp DNS an toàn hoặc được mã hóa để ngăn chặn rò rỉ DNS ra khỏi đường hầm an toàn.
Nếu kết nối VPN bị gián đoạn, Gluetun tự động chặn tất cả lưu lượng từ các container đã cấu hình để ngăn chặn rò rỉ địa chỉ IP. Gluetun sử dụng iptables để thực thi “kill switch” cho lưu lượng truy cập trong trường hợp VPN mất kết nối, điều này có nghĩa là các container được kết nối sẽ không hoạt động trừ khi VPN hoạt động trở lại. Điều này tốt hơn nhiều so với việc sử dụng bất kỳ VPN toàn hệ thống nào mà không có kill switch hoặc firewall, có thể khiến địa chỉ IP của máy chủ bị lộ.
Các Docker container phổ biến chạy trên homelab với nhu cầu VPN riêng tư
Hướng Dẫn Định Tuyến Lưu Lượng Ra Ngoài từ Các Container Nhạy Cảm với Gluetun
Tôi sử dụng các tệp Docker Compose trong Dockge để triển khai ngăn xếp ứng dụng ARR hoạt động cùng với Gluetun. Theo mặc định, các container này sẽ sử dụng ngăn xếp mạng của Gluetun và không có quyền truy cập vào IP thực hay máy chủ của tôi. Đối với các ngăn xếp của mình, tôi đã sử dụng thông tin đăng nhập của Surfshark VPN. Tôi đã đăng nhập vào tài khoản Surfshark VPN và bật tùy chọn thiết lập thủ công, từ đó tạo ra một mã chữ và số cụ thể cho tên người dùng và mật khẩu. Hãy sử dụng thông tin này trong cấu hình container của Gluetun.
Cấu Hình và Triển Khai Lưu Lượng An Toàn Qua Đường Hầm VPN
Tôi khuyên bạn nên sử dụng giao thức WireGuard thay vì OpenVPN để đạt được tốc độ, độ ổn định tốt hơn và giảm tải CPU khi sử dụng Gluetun trên các máy tính bảng đơn (SBC) như Raspberry Pi.
Dưới đây là một đoạn mã cấu hình Gluetun điển hình trong tệp Docker Compose:
services:
gluetun:
image: qmcgaw/gluetun
container_name: gluetun
cap_add:
- NET_ADMIN
environment:
- VPN_SERVICE_PROVIDER=surfshark
- OPENVPN_USER=username
- OPENVPN_PASSWORD=password
- FIREWALL=on
- TZ=Asia/Kolkata
volumes:
- ./gluetun:/gluetun
ports:
- 8080:8080 # qBittorrent web UI
- 8989:8989 # Sonarr
- 7878:7878 # Radarr
- 8686:8686 # Lidarr
- 6767:6767 # Bazarr
restart: unless-stopped
Việc thêm đoạn mã này vào đầu một stack mới đảm bảo Gluetun được cài đặt trước tiên. Sau đó, tôi đã thêm chế độ mạng để các container còn lại sử dụng mạng của Gluetun. Ngoài ra, tôi đã bao gồm biến môi trường FIREWALL=on
để chặn hoàn toàn truy cập internet khi kết nối VPN bị gián đoạn. Về mặt kỹ thuật, firewall được bật theo mặc định, nhưng như một phần của thực hành phòng thủ, tôi đã thêm nó để sử dụng cùng một tệp compose trên các môi trường khác nhau. Dưới đây là đoạn mã cho một container sử dụng mạng của Gluetun:
sonarr:
image: lscr.io/linuxserver/sonarr
container_name: sonarr
network_mode: service:gluetun
depends_on:
- gluetun
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Kolkata
volumes:
- ./sonarr:/config
- ./downloads:/downloads
- ./media/tv:/tv
restart: unless-stopped
Lưu ý rằng tôi đã chỉ định biến network_mode
để sử dụng dịch vụ Gluetun. Sau khi triển khai toàn bộ stack ứng dụng ARR, cần kiểm tra xem các container có thực sự sử dụng mạng của Gluetun cho lưu lượng đi ra của chúng hay không. Tôi đã chạy lệnh sau để kiểm tra:
docker exec radarr curl ifconfig.me
Lệnh này đã hiển thị địa chỉ IP được gán bởi nhà cung cấp dịch vụ VPN mà tôi đã sử dụng trong thiết lập Gluetun, xác nhận rằng tất cả các container đều đang sử dụng đường hầm VPN do Gluetun thiết lập.
Những Trường Hợp Docker Container Không Hoạt Động Hiệu Quả với Gluetun
Gluetun là lựa chọn tốt nhất để định tuyến lưu lượng outbound, nhưng nó không hoạt động với tất cả các ứng dụng và dịch vụ dựa trên container yêu cầu mở trực tiếp các cổng đến (inbound ports) ra mạng LAN.
Các Ngoại Lệ và Giải Pháp Thay Thế Khi Dùng Gluetun
Ví dụ, các ứng dụng torrent như qBittorrent, Transmission hoặc Deluge yêu cầu mở các cổng đến cụ thể cho TCP và UDP. Ngoài ra, các ứng dụng và dịch vụ yêu cầu khám phá mạng cục bộ thông qua multicast hoặc broadcast cũng gặp vấn đề. Chẳng hạn, Home Assistant cần khám phá các thiết bị trên mạng LAN để dễ dàng tích hợp. Tương tự, Pi-hole và Unbound sẽ gây ra xung đột DNS với các quy tắc DNS và firewall của Gluetun.
Một hạn chế lớn mà tôi nhận thấy là việc mở các cổng HTTPS không hoạt động với Gluetun. Vì vậy, tôi phải chạy một container, chẳng hạn như Nginx Proxy Manager, mà không thông qua mạng của Gluetun. Ngoài ra, tôi không thể truy cập các ứng dụng bằng IP của VPN vì Surfshark không hỗ trợ chuyển tiếp cổng (port forwarding). Tuy nhiên, việc thiết lập một reverse proxy không nằm sau VPN, ngay cả khi nó không chuyển tiếp cổng, đã khắc phục được vấn đề này vì nó giao tiếp bên ngoài Gluetun, qua mạng của Docker stack.
Tủ rack chứa homelab với các máy chủ và thiết bị mạng
Kết Luận
Gluetun thực sự là một giải pháp nhẹ nhưng mạnh mẽ, mang tính cách mạng trong việc định tuyến lưu lượng từ các Docker container. Nhờ nó, tôi có thể tiếp tục sử dụng các container chọn lọc để vượt qua các rào cản địa lý và tránh bị cấm IP. Quan trọng hơn, Gluetun không can thiệp vào các tệp hệ thống và có thể chạy mượt mà ngay cả trên các máy tính bảng đơn (SBC) có hiệu năng thấp. Mặc dù vẫn yêu cầu một tài khoản từ nhà cung cấp dịch vụ VPN, Gluetun đã giải quyết xuất sắc nhu cầu tạo đường hầm VPN cho các Docker container cụ thể. Tôi khuyên bạn nên thiết lập Health Checks bằng webhooks để Gluetun thông báo cho bạn bất cứ khi nào kết nối VPN bị ngắt, đảm bảo quyền riêng tư và hoạt động liên tục cho homelab của bạn. Hãy trải nghiệm Gluetun ngay hôm nay để nâng tầm bảo mật và tính linh hoạt cho các ứng dụng Docker của bạn.