Trong bài viết trước, mình đã hướng dẫn cách thiết lập WireGuard client bằng Docker trên máy chủ Linux. Kèm theo đó là cách cấu hình chuyển hướng mạng của máy chủ đi qua WireGuard VPN.
Tuy nhiên, trong thực tế nếu muốn chuyển hướng mạng của toàn bộ máy chủ đi qua WireGuard VPN thì mình sẽ không dùng cách này. Thay vào đó, sử dụng command line nmcli
sẽ đơn giản và tiện lợi hơn nhiều
Mục đích chính của việc thiết lập WireGuard client bằng Docker là tạo ra sự linh hoạt cho cấu hình mạng của máy chủ. Mình có thể nhanh chóng tùy biến kết nối của các Docker container đang hoạt động trên máy chủ đi trực tiếp qua ISP hay đi qua VPN.
Ví dụ: container Deluge tải torrent sẽ đi qua VPN, còn container ols-docker-env sẽ đi trực tiếp qua ISP.
Dưới đây là hướng dẫn cách chuyển hướng mạng của Docker container đi qua WireGuard VPN.
I. Thiết lập WireGuard Client bằng Docker
Đã thiết lập thành công WireGuard client bằng Docker trên máy chủ Linux. Xem lại bài viết hướng dẫn bên dưới
Bạn chỉ cần làm tới bước II.3 – Tạo Wireguard client container là đủ. Không cần làm thêm bước II.4 trở đi.
II. Kết nối Deluge vào cùng Docker network với WireGuard
Để minh họa, mình sẽ chuyển hướng mạng của container chạy Deluge đi qua WireGuard VPN.
Container WireGuard client đang kết nối vào mạng wgnet
, nên mình sẽ chỉnh lại file docker-compose.yml
của Deluge, thêm vào đoạn sau ở dưới cùng
networks:
default:
name: wgnet
external: true
Nội dung sẽ tương tự như sau
version: "2.1"
services:
deluge:
image: lscr.io/linuxserver/deluge:latest
container_name: deluge
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Ho_Chi_Minh
- DELUGE_LOGLEVEL=error #optional
volumes:
- ./config:/config
- ./downloads:/downloads
ports:
- 8112:8112
- 6881:6881
- 6881:6881/udp
restart: unless-stopped
networks:
default:
name: wgnet
external: true
Sau đó, kích hoạt lại container Deluge bằng lệnh docker-compose up -d
Kiểm tra lại docker network wgnet bằng lệnh docker inspect wgnet
, sẽ thấy có 2 container đang nằm trong network này: wireguard
(IP: 172.30.0.50
) và deluge
(IP: 172.30.0.2
)
[
{
"Name": "wgnet",
"Id": "395281362a007244f03d8b8008a12c55ecea141410143d970376029564d5a02c",
"Created": "2022-09-28T21:40:39.761479649+07:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.30.0.0/24",
"Gateway": "172.30.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"12746dedba5c36430ee0b3bb3c101f668cd6828e5a7cefee0f21c53d5cb90628": {
"Name": "deluge",
"EndpointID": "1627a117ab97832a9c4569a1e5dd5ed38c74e558e77dd38e0c2e964357a8bdc9",
"MacAddress": "02:42:ac:1e:00:02",
"IPv4Address": "172.30.0.2/24",
"IPv6Address": ""
},
"65aec8527dbbb07b68c38982dddb644b75ea5421ce10a5e93e8d21c0a25b9d20": {
"Name": "wireguard",
"EndpointID": "924395dbd314c359a1be41034bea35a460fc9eb2f927b5b8bfb40e63190f8a2d",
"MacAddress": "02:42:ac:1e:00:32",
"IPv4Address": "172.30.0.50/24",
"IPv6Address": ""
}
},
"Options": {},
"Labels": {}
}
]
III. Chỉnh sửa Routing Table của Deluge container
Kiểm tra routing table hiện tại của container Deluge bằng lệnh docker exec deluge ip route
default via 172.30.0.1 dev eth0
172.30.0.0/24 dev eth0 scope link src 172.30.0.2
Kết nối mạng mặc định của Deluge hiện đang đi qua gateway 172.30.0.1
– mạng chính của máy chủ.
Để kết nối mạng của Deluge đi qua WireGuard VPN, mình cần phải chỉnh sửa lại dòng default
để nó đi qua IP của WireGuard container – 172.30.0.50
docker exec --privileged deluge ip route del default
docker exec --privileged deluge ip route add default via 172.30.0.50
Bạn cần thay thế deluge
bằng tên của container tương ứng. Kiểm tra lại Routing Table của Deluge: docker exec deluge ip route
default via 172.30.0.50 dev eth0
172.30.0.0/24 dev eth0 scope link src 172.30.0.2
Kết nối mặc định giờ đã được chuyển hướng đi qua 172.30.0.50
, là IP của container đang chạy WireGuard client.
IV. Xác nhận chuyển hướng mạng thành công
Để kiểm tra xem đường truyền của Deluge có đi qua WireGuard hay không, mình sẽ kiểm tra IP Public của nó bằng lệnh
docker exec deluge curl -s ifconfig.me
- Nếu bị báo lỗi
Hostname not found
thì nhiều khả năng máy chủ đang dùng DNS nội bộ (AdGuard Home / Pi-Hole). Do lúc này mọi kết nối trong container Deluge đều đi qua Wireguard VPN Server, nên sẽ không thể kết nối đến được DNS Server, vốn nằm trong mạng LAN. Để xử lý, chúng ta cần thêm thông sốdns: 1.1.1.1
vào phần environment củadocker-compose.yml
để container sử dụng1.1.1.1
làm DNS thay cho DNS mặc định của máy chủ. - Nếu thấy kết quả trả về là IP của máy chủ đang cài WireGuard VPN Server nghĩa là kết nối đã được chuyển hướng thành công. Bravo!
V. Cấu hình truy cập Web UI
Hiện tại, mọi kết nối mạng in và out của Deluge đều đã đi qua WireGuard VPN. Tuy nhiên, mình không thể truy cập vào Web UI thông qua địa chỉ http://:8112
được nữa, vì đường truyền sẽ hoạt động như sau:
- Máy tính A tạo truy vấn đến
:8112
, là địa chỉ IP của máy chủ đang cài đặt Deluge - Máy chủ sẽ chuyển hướng kết nối vào Deluge container.
- Deluge container phản hồi lại kết nối về lại IP gốc của máy tính A.
- Theo thiết lập Routing tab, kết nối phản hồi từ Deluge sẽ đi qua WireGuard VPN Server.
- WireGuard VPN Server sẽ tự động hủy kết nối do không tìm thấy lịch sử truy vấn trước đó từ IP của máy tính A.
Để xử lý tình huống này, có thể sử dụng 2 cách
1. Điều chỉnh Routing Table
Để phản hồi từ Web UI của Deluge không đi qua WireGuard VPN Server, mình sẽ bổ sung thêm 1 dòng cho Routing Table của Deluge container như sau
docker exec --privileged deluge ip route add xxx.xxx.xxx.xxx via 172.30.0.1
- Nếu máy tính A và máy chủ Deluge nằm cùng trong mạng LAN thì
xxx.xxx.xxx.xxx
là LAN IP của máy tính A. - Nếu máy tính A và máy chủ Deluge nằm khác mạng LAN thì `xxx.xxx.xxx.xxx là Pubic IP của máy tính A.
Với thiết lập này, phản hồi từ Web UI của Deluge sẽ đi qua ISP trực tiếp, tạo nên kết nối thành công.
Chú ý: các thiết lập thay đổi Routing Table trong container Deluge sẽ bị reset mỗi khi bạn khởi động hay tạo mới lại container. Bạn cần phải gõ lại các lệnh trên để kết nối qua WireGuard hiệu lực trở lại. Ngoài ra, bạn còn có thể sử dụng custom script để chỉnh sửa trực tiếp container khi khởi tạo.
2. Sử dụng Reverse Proxy
Mình khuyến khích sử dụng cách này vì nó tiện lợi hơn nhiều, có thể kết nối đến Deluge Web UI từ bất kỳ máy tính nào, mà không cần phải chỉnh sửa Routing Table.
Mình sử dụng Nginx Proxy Manager, thiết lập cho nó vào cùng Docker network wgnet
chung với WireGuard và Deluge. Sau đó tạo Reverse Proxy cho Deluge theo hướng dẫn trong bài viết này.
Cấu hình NPM làm Reverse Proxy cho Docker container trên cùng máy chủ
Giờ mình đã có thể truy cập Web UI của Deluge thông qua tên miền, ví dụ https://deluge.blntech.asia