Kết nối dây chuyền 2 mạng Wireguard để chuyển hướng mạng sử dụng Docker

Mới đây, mình nhận được 1 yêu cầu hướng dẫn cách cấu hình kết nối dây chuyền 2 mạng Wireguard với nhau để chuyển hướng mạng gián tiếp. Mô hình hoạt động sẽ như hình minh hoạ dưới đây:

Sau khi nghiên cứu, mình đã tìm ra được cách thiết lập chuyển hướng dây chuyền 2 mạng Wireguard để chia sẻ trong bài viết hôm nay.

Bài viết này được dựa trên 2 bài viết mình đã chia sẻ trước đây về Wireguard Docker

I. Yêu cầu chuẩn bị

  • Máy tính / điện thoại làm client kết nối, đã được cài đặt WireGuard client

  • Một VPS (VPS A) làm trung gian đã được cài đặt sẵn Docker và Docker Compose. IP: 111.111.111.111

  • Một VPS (VPA B) làm đã được thiết lập sẵn WireGuard VPN Server, sử dụng wg-easy để thiết lập. IP: 222.222.222.222

  • File cấu hình WireGuard client được tạo ra bởi WireGuard Server trên VPS B, có dạng như dưới đây

II. Tạo Wireguard Server (VPS B)

Tạo Wireguard Server trên VPS B theo hướng dẫn ở đây

III. Tạo Docker network (VPS A)

Để có thể điều hướng mạng bằng routing table, container Wireguard client cần sử dụng IP tĩnh để tránh rắc rối về sau. Mình sẽ tạo 1 mạng docker bridge mới với tên gọi wgnet bằng lệnh

Kiểm tra lại thông số của wgnet bằng lệnh docker inspect wgnet

IV. Cấu hình WireGuard server (VPS A)

Tạo Wireguard Server trên VPS A cũng dùng wg-easy tương tự như trên VPS B. Tuy nhiên, cần chú ý thay đổi thông số WG_DEFAULT_ADDRESS khác với subnet đã sử dụng trên VPS B.

Ví dụ:

  • VPS B: WG_DEFAULT_ADDRESS=10.9.0.x

  • VPS A: WG_DEFAULT_ADDRESS=10.8.0.x

Nếu hai subnet trùng nhau sẽ khiến phần cấu hình routing table ở phần sau gặp lỗi.

Ngoài ra, cần phải cấu hình cho container này kết nối vào network wgnet bằng cách thêm vào các dòng sau

File docker-compose.yml trên VPS A sẽ tương tự như sau

Tiếp theo, tại file cấu hình Wireguard client và cài đặt trên máy tính / điện thoại dùng để kết nối.

V. Cấu hình Wireguard client (VPS A)

1. Tạo file cấu hình wg0.conf

Trong bài này mình sẽ lấy file cấu hình từ Wireguad VPN Server từ VPS B đã được thiết lập bằng wg-easy. Truy cập vào dashboard của wg-easy, tạo client mới và tải file cấu hình về, có nội dung tương tự như dưới đây

Với cấu hình này, một đường truyền tunnel sẽ được tạo ra và tất cả kết nối bên trong WireGuard container sẽ đi qua tunnel này. Tuy nhiên, chúng ta muốn còn kết nối của máy chủ, nằm ngoài container đi qua Wireguard Tunnel. Do đó, cần phải cấu hình NAT để kết nối đi đúng hướng bằng lệnh sau:

Để thiết lập tự động, mình sẽ dùng thông số PostUpPreDown trong file cấu hình của WireGuard.

  • PostUp: lệnh sẽ chạy sau khi WireGuard tunnel được tạo.

  • PostDown: lệnh sẽ chạy trước khi WireGuard tunnel bị hủy.

Lưu lại cấu hình cuối cùng trong thư mục ~/wireguad-client/config/wg0.conf

Nhập vào nội dung sau và lưu lại

2. Tạo Wireguard client container

Tạo file docker-compose.yml để thiết lập Wireguard Client

Nhập vào nội dung sau

Các thông số cần chú ý:

  • Phần networks được cấu hình để WireGuard container kết nối vào Docker netwok wgnet đã tạo trước đó.

  • Dòng 17: cấu hình IP tĩnh cho container 10.10.0.2

Kích hoạt Docker container bằng lệnh docker-compose up -d

Để bảo đảm WireGuard Tunnel đã được tạo thành công, kiểm tra lại logs bằng lệnh docker logs wireguard-client. Nếu thấy nó kết thúc với nội dung như dưới đây nghĩa là Tunnel đã được tạo thành công

Nếu trong logs hiện ra lỗi như dưới đây, bạn cần chỉnh sửa lại dòng AllowedIPs trong file wg0.conf, xóa ::/0 và chỉ chừa lại 0.0.0.0/0. Sau đó khởi động lại container.

Kiểm tra xem Wireguard-client đã kết nối thành công chưa bằng lệnh

Nếu thấy kết quả trả về là IP của VPS B nghĩa là Container đã kết nối thành công đến VPS B.

VI. Cấu hình routing table (VPS A)

1. Trước khi chỉnh sửa

Đầu tiên, kiểm tra thông số của mạng wgnet

Kết quả sẽ hiện ra 2 container wireguard-client (đang kết nối đến VPS B) và wireguard-server (đang có kết nối từ máy tính ở nhà vào) đang được kết nối vào.

Kiểm tra IP của máy tính đang kết nối vào VPS A bằng cách truy cập https://ifconfig.me. Nếu đang kết nối thành công, kết quả sẽ hiện ra IP của VPS A 111.111.111.111

2. Chỉnh sửa routing table trên wireguard-server container

Trên VPS A, để chuyển kết nối từ container wireguard-server (IP: 10.10.0.3) đi qua wireguard-client (IP: 10.10.0.2), mình sẽ sửa lại routing table trong container Wireguard-server như sau

Giải thích:

  1. Tạo routing table mới với id 120, các truy cập từ subnet 10.8.0.0/24 sẽ đi qua routing table này.

  2. Chuyển hướng kết nối mặc định của routing table 120 sẽ đi qua IP 10.10.0.2, là IP của Wireguard-client.

Chú ý: Mỗi khi khởi động lại container wireguard-server, routing table sẽ tự động bị reset, bạn cần phải chạy lại 2 lệnh trên để thiết lập lại kết nối.

3. Xác nhận kết nối thành công

Trên máy tính đang kết nối vào VPS A, truy cập lại https://ifconfig.me.

Nếu thấy hiện ra IP của VPS B 222.222.222.222 nghĩa là kết nối bắc cầu đã được thực hiện thành công. Từ PC –> VPS A –> VPS B.

Chúc bạn thực hiện thành công

Last updated

Was this helpful?