Chuyên mục
Network

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

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

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: trueCode language: YAML (yaml)

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: trueCode language: YAML (yaml)

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": {}
    }
]
Code language: JSON / JSON with Comments (json)

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 Code language: YAML (yaml)

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.50Code language: CSS (css)

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 Code language: YAML (yaml)

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.meCode language: Bash (bash)
  • 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ủa docker-compose.yml để container sử dụng 1.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://<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.1Code language: CSS (css)
  • 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.

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.

Nếu bài viết của mình mang đến thông tin, kiến thức hữu ích cho bạn, đừng ngại mời mình ly bia để có thêm động lực chia sẻ nhiều hơn nữa. Cám ơn bạn!

Lưu ý: Nếu bạn cần hỗ trợ kỹ thuật, vui lòng gửi câu hỏi trực tiếp ở phần Thảo luận bên dưới, mình sẽ trả lời sớm. Đừng mò vào hỏi trong fanpage Yêu Chạy Bộ, sẽ không có phản hồi đâu!

Bởi Thuận Bùi

Runner at Yêu Chạy Bộ. Blogger at Ba Lô & Dép Lào. Web Developer at TB's Blog.
Follow me: Facebook / Instagram

3 trả lời trong “Chuyển hướng mạng của Docker Container đi qua WireGuard VPN”

Thay vì đi qua VPN có cách nào để toàn bộ traffic mỗi Docker Container đi qua 1 proxy sock5 không bạn?
Mặc định Docker chỉ cho proxy qua http, https, ftp chứ nó không đẩy toàn bộ traffic qua proxy.

Trả lời Thuận Bùi Hủy

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *