Skip to content
Thuan Bui's Blog
Go back

Chuyển hướng mạng của Docker Container đi qua WireGuard VPN

Updated:

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 (xem hướng dẫn).

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

https://thuanbui.me/thiet-lap-wireguard-client-bang-docker-tren-may-chu-linux/?swcfpc=1#3-tao-wireguard-client-container

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-28,
"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

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://<server-ip>:8112 được nữa, vì đường truyền sẽ hoạt động như sau:

  1. Máy tính A tạo truy vấn đến <server-ip>:8112, là địa chỉ IP của máy chủ đang cài đặt Deluge
  2. Máy chủ sẽ chuyển hướng kết nối vào Deluge container.
  3. 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.
  4. Theo thiết lập Routing tab, kết nối phản hồi từ Deluge sẽ đi qua WireGuard VPN Server.
  5. 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

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.

https://thuanbui.me/nginx-proxy-manager-reverse-proxy-docker-container/?swcfpc=1

Giờ mình đã có thể truy cập Web UI của Deluge thông qua tên miền, ví dụ https://deluge.thuanbui.me.


Share this post on:

Previous Post
Cấu hình DNAT (Port Forwarding) cho dịch vụ mạng kết nối vào WireGuard VPN
Next Post
Thiết lập WireGuard client bằng Docker trên máy chủ Linux