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
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
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
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:
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
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] iptables-restore -n
[#] iptables -t nat -A POSTROUTING -o wg+ -j MASQUERADE
[ls.io-init] done.
Code language: YAML (yaml)
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.
Error: IPv6 is disabled on nexthop device.
[#] resolvconf -d wg0 -f
[#] ip link delete dev wg0Code language: Python (python)
Kiểm tra xem Wireguard-client đã kết nối thành công chưa bằng lệnh
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
docker exec --privileged wireguard-server ip rule add from 10.8.0.0/24 table 120
docker exec --privileged wireguard-server ip route add default via 10.10.0.2 table 120
Code language: YAML (yaml)
Giải thích:
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.
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.