Cách đây khá lâu mình có làm bài hướng dẫn cách cài đặt OpenVPN trực tiếp bằng script trên Ubuntu lên máy chủ ảo của mình ở DigitalOcean. Cũng đã lâu rồi mình không sử dụng VPN mà chủ yếu chỉ sử dụng Cloudflare để truy cập các website bị chặn ở Việt Nam mà thôi. Do đợt này đi nước ngoài nên mình cần có IP Việt Nam để có thể sử dụng các ứng dụng đặt khách sạn và mua vé tàu xe (cụ thể là Agoda và Klook) bằng tiền đồng Việt Nam mà không bị chuyển vùng sang nước khác. Do đó, mình quyết định cài đặt OpenVPN bằng Docker lên máy chủ ở nhà để sử dụng. Lý do mình chọn sử dụng OpenVPN là vì OpenVPN có hỗ trợ giao thức TCP nên sẽ không bị chặn ở một số quốc gia hoặc khu vực mình đến, mặc dù TCP cho tốc độ kết nối chậm hơn rất nhiều.
1. Điều kiện tiên quyết
- Đã có máy chủ / máy ảo Ubuntu (xem hướng dẫn cài đặt máy ảo Ubuntu)
- Đã cài đặt Docker & Docker Compose
2. Cài đặt OpenVPN bằng Docker Compose
Truy cập vào máy chủ Ubuntu và thực hiện các lệnh sau:
$ mkdir openvpn-docker
$ cd openvpn-docker
$ nano docker-compose.yml
# nhập nội dung sau
version: '3'
services:
dockovpn:
image: workleast/openvpn
container_name: dockovpn
restart: always
ports:
- '1194:1194/udp' # tắt phần này nếu sử dụng TCP
#- '443:1194/tcp' # mở phần này nếu sử dụng TCP
- '80:8080/tcp'
environment:
- HOST_ADDR=#<Thay the bang WAN IP hoặc tên miền>
#- HOST_TUN_PORT=443 # mở phần này nếu sử dụng TCP
#- HOST_TUN_PROTOCOL=tcp # mở phần này nếu sử dụng TCP
#- HOST_CONF_PORT=80
cap_add:
- NET_ADMIN
volumes:
- ./openvpn_conf:/opt/Dockovpn_data
Sau đó nhấn “Ctrl-X”, chọn “Y” rồi “Enter” để lưu lại
HOST_ADDR: thay thế bằng tên miền hoặc WAN IP của mạng internet mà máy chủ / máy ảo đang sử dụng. Trong trường hợp của mình do WAN IP của mình là IP động chứ không phải IP tĩnh nên mình sử dụng thêm dịch vụ DDNS để cập nhật lại IP khi nó thay đổi. Do đó mình sẽ điền tên miền DDNS vào chỗ này (Ví dụ: myhome.changeip.net).
HOST_TUN_PROTOCOL: Có thể khai báo là “udp” hoặc “tcp”. Mặc định thì OpenVPN docker sử dụng giao thức UDP để có tốc độ kết nối tốt nhất. Tuy nhiên một số nơi có thể sẽ chặn kết nối UDP nên mình có thể chuyển qua sử dụng TCP. Lưu ý: nếu sử dụng TCP thì cũng phải thay đổi khai báo “ports” thành ‘443:1194/tcp’
HOST_TUN_PORT: Mặc định sử dụng port 1194. Nếu muốn sử dụng port khác để kết nối thì phải khai báo ở đây và thay đổi ở phần khai báo “ports” tương ứng. Trường hợp nếu sử dụng giao thức TCP bằng port 443 thì cũng phải khai báo ở đây.
HOST_CONF_PORT: Mặc định là port 80. Đây là port để tải file “client.ovpn”. Nếu sử dụng khác port 80 thì phải khai báo ở đây và thay đổi ở phần khai báo “ports” tương ứng.
Để có thể truy cập OpenVPN Server bằng máy tính hay điện thoại từ bên ngoài mình cũng cần phải mở cổng “1194/udp” (nếu dùng UDP) hoặc “443/tcp” (nếu dùng TCP) trên router và chuyển hướng truy cập (port forwarding) về IP nội bộ của máy chủ / máy ảo Ubuntu
Lưu ý
Để biết thêm chi tiết có thể tham khảo thên từ liên kết sau: https://github.com/dockovpn/dockovpn
3. Chạy OpenVPN Docker lần đầu
Ở lần chạy đầu tiên thì container OpenVPN sẽ khởi tạo 1 profile người dùng mặc định nên mình sẽ chạy với chế độ interactive mode để có thể xem được quá trình khởi tạo, do đó mình không sử dụng “-d” trong câu lệnh
$ docker compose up
...
dockovpn | Fri Jun 28 07:59:35 2024 /opt/Dockovpn_data/clients/YH1T5nRlZpXR8TYblosUhqmDrmyOgaK6/client.ovpn file has been generated
dockovpn | Fri Jun 28 07:59:35 2024 Config server started, download your client.ovpn config at http://123.123.123.123:80/
dockovpn | Fri Jun 28 07:59:35 2024 NOTE: After you download your client config, http server will be shut down!
Sau khi thấy hiện như trên thì việc khởi tạo đã thành công. Ở bước này OpenVPN docker cũng cho phép mình tải file “client.ovpn” để có thể chạy trên máy tính hoặc điện thoại bằng đường link đến WAN IP hoặc tên miền của mình. Ở ví dụ này mình sử dụng “http://123.123.123.123:80/” là WAN IP của mình để tải về.
1. Để tải về bằng đường link đến WAN IP yêu cầu phải mở port (port forwarding) trên router trước hoặc có thể sử dụng địa chỉ LAN IP của máy chủ / máy ảo để tải thì không cần phải mở port.
2. Đường link này chỉ có thể sử dụng 1 lần, sau khi tải về file “client.opvn” lần đầu thì sẽ không thể sử dụng để tải được nữa. Xin xem thêm bên dưới để biết cách chép file “client.ovpn” bằng lệnh
Lưu ý
Sau đó mình nhấn “Ctrl-C” để thoát ra và chạy tiếp lệnh sau:
$ docker compose up -d
4. Xem danh sách các profile hiện tại
Sau bước khởi tạo thì OpenVPN container đã tạo 1 profile mặc định, mình có thể xem lại danh sách các profile đã tạo bằng lệnh
$ ls ./openvpn_conf/clients
hoặc
$ docker exec dockovpn ./listconfigs.sh
(Ví dụ: N0N1UtQ9WyPIsUVAuIdWqfB2ovhB1vA)
5. Chép file client.ovpn ra ngoài
Để có thể sử dụng profile trên máy tính hoặc điện thoại, mình cần phải chép file client.ovpn của profile tương ứng ra ngoài.
Mặc định các file client.ovpn sẽ được lưu tại thư mục “./openvpn_conf/clients/<ID>” (Lưu ý: thay ID bằng ID của profile), mình chỉ cần chép file này ra máy tính hay điện thoại là xong.
Ngoài ra cũng có thể chép trực tiếp từ container bằng lệnh sau:
$ docker cp dockovpn:/opt/Dockovpn_data/clients/<ID>/client.ovpn ./client.ovpn
6. Tạo profile mới
Tạo profile mới có ID ngẫu nhiên bằng lệnh sau:
$ docker exec dockovpn ./genclient.sh
Nếu muốn tạo profile mới với tên ID cụ thể thì sử dụng lệnh
$ docker exec dockovpn ./genclient.sh n <profile_name>
# Lưu ý: thay <profile_name> bằng tên ID cụ thể. Ví dụ: myprofile
7. Xoá profile đã tạo
Để xoá profile đã tạo, thực hiện lênh sau
$ docker exec dockovpn ./rmclient.sh <ID>
# Lưu ý: thay <ID> bằng ID của profile. Ví du: N0N1UtQ9WyPIsUVAuIdWqfB2ovhB1vA
Chúc bạn thành công!