Tiếp tục loạt bài nghiên cứu về WireGuard và Docker Network, bài viết này mình sẽ hướng dẫn cách cấu hình Destination NAT (viết tắt là DNAT), hay còn gọi là Port Forwading (chuyển tiếp cổng mạng) cho dịch vụ mạng được kết nối vào WireGuard VPN.
Mình sẽ thực hiện cấu hình Port Forwarding cho cổng 8112 từ VPS đang cài đặt WireGuard VPN Server (địa chỉ Public IP của VPS: 2.2.2.2
) vào container Deluge nằm trên máy chủ ở nhà (địa chỉ Public IP ở nhà: 5.5.5.5
). Container Deluge đã được cấu hình chuyển hướng mạng đi qua WireGuard Tunnel thông qua WireGuard client container nằm trên cùng máy chủ.
Sau khi thiết lập thành công, mình có thể sử dụng bất kỳ máy tính nào có kết nối Internet để truy cập vào địa chỉ http://2.2.2.2:8112
. Trình duyệt sẽ hiện ra Web UI của Deluge đang chạy ở nhà.
I. Yêu cầu chuẩn bị
Bài viết này có thể được xem là [Phần 3] của 2 bài viết trước về cách thiết lập WireGuard Client bằng Docker. Do đó, bạn nên tham khảo và thực hành thành công các thao tác trong 2 bài viết dưới đây trước khi tiếp tục với hướng dẫn bên dưới
Các bước cần chuẩn bị trước khi tiếp tục:
- 1 máy chủ nằm ngoài mạng LAN ở nhà, đã được cài đặt WireGuard VPN Server. Trong bài viết này, mình sử dụng wg-easy. Nếu bạn cài đặt bằng cách khác, cần phải chỉnh sửa lại các dòng lệnh cho phù hợp.
- 1 máy chủ ở nhà đã được thiết lập WireGuard client bằng Docker.
- Một dịch vụ mạng được thiết lập bằng Docker, và đã được cấu hình chuyển hướng đi qua WireGuard VPN.
II. Cấu hình DNAT từ VPS vào WireGuard Server container
Việc đầu tiên mình cần làm là cấu hình Port Forwarding cổng 8112
từ máy chủ VPS vào WireGuard Server container
Thêm thông số 8112:8112
vào file docker-compose.yml
(dòng 23) của wg-easy.
version: "3.8"
services:
wg-easy:
environment:
# ⚠️ Required:
# Change this to your host's public address
- WG_HOST=wgeasy.thuanbui.me
# Optional:
- PASSWORD=thuanbui123
# - WG_PORT=51820
# - WG_DEFAULT_ADDRESS=10.8.0.x
# - WG_DEFAULT_DNS=1.1.1.1
# - WG_ALLOWED_IPS=192.168.15.0/24, 10.0.1.0/24
image: weejewel/wg-easy
container_name: wg-easy
volumes:
- .:/etc/wireguard
ports:
- "51820:51820/udp"
- "51821:51821/tcp"
- "8112:8112"
restart: unless-stopped
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
Sau đó kích hoạt lại wg-easy bằng lệnh docker-compose up -d
.
III. Cấu hình DNAT từ WireGuard Server đến WireGuard client
Quay lại terminal của máy chủ ở nhà đang cài đặt WireGuard client, tìm địa chỉ WireGuard IP bằng lệnh sau
docker exec wireguard ip a
Kết quả trả về sẽ tương tự như dưới đây
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
link/none
inet 10.6.0.7/24 scope global wg0
valid_lft forever preferred_lft forever
43: eth0@if44: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:14:00:32 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.20.0.50/16 brd 172.20.255.255 scope global eth0
valid_lft forever preferred_lft forever
Địa chỉ IP của WireGuard client nằm trong mục wg0
là 10.6.0.7
.
Mình quay lại Terminal của VPS đang cài WireGuard server, sử dụng lệnh sau để thực hiện NAT port 8112
đến địa chỉ 10.6.0.7
docker exec wg-easy iptables -t nat -A PREROUTING -p tcp --dport 8112 -j DNAT --to-destination 10.6.0.7
Kiểm tra lại iptables bằng lệnh docker exec wg-easy iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- anywhere anywhere tcp dpt:8112 to:10.6.0.7
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER_OUTPUT all -- anywhere 127.0.0.11
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
DOCKER_POSTROUTING all -- anywhere 127.0.0.11
MASQUERADE all -- 10.6.0.0/24 anywhere
Chain DOCKER_OUTPUT (1 references)
target prot opt source destination
DNAT tcp -- anywhere 127.0.0.11 tcp dpt:domain to:127.0.0.11:36103
DNAT udp -- anywhere 127.0.0.11 udp dpt:domain to:127.0.0.11:34377
Chain DOCKER_POSTROUTING (1 references)
target prot opt source destination
SNAT tcp -- 127.0.0.11 anywhere tcp spt:36103 to::53
SNAT udp -- 127.0.0.11 anywhere udp spt:34377 to::53
Dòng số 3 đã hiện ra NAT rule: chuyển hướng truy cập cổng 8112
đến địa chỉ 10.6.0.7
.
IV. Cấu hình DNAT đến Deluge container
1. Thiết lập IP tĩnh cho Deluge container
Mình sẽ thiết lập IP tĩnh cho Deluge container để tránh việc Docker IP bị thay đổi khi khởi tạo lại, gây lỗi cho DNAT trong tương lai.
Chỉnh sửa lại file docker-compose.yml
để thêm thông số IP tĩnh cho Deluge container: dòng 14-16.
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
networks:
default:
ipv4_address: 172.30.0.10
ports:
- 8112:8112
- 6881:6881
- 6881:6881/udp
restart: unless-stopped
networks:
default:
name: wgnet
external: true
Kích hoạt lại Deluge: docker-compose up -d
2. Cấu hình DNAT
Tương tự như bước DNAT thực hiện trên WireGuard server, lệnh thực hiện DNAT vào Deluge container sẽ như sau
iptables -t nat -A PREROUTING -p tcp --dport 8112 -j DNAT --to-destination 172.30.0.10:8112
Trong đó, 172.30.0.10
là địa chỉ IP của Deluge trong mạng wgnet
Mình sẽ bổ sung lệnh này vào file cấu hình wg0.conf
, dòng PostUp và PreDown để container WireGuard tự động kích hoạt mỗi khi chạy.
[Interface]
PrivateKey = sO7U9OS0s5vxxxdfY1aNHzVYXpJhKAaU/HG9MyfaWU=
Address = 10.6.0.7/24
DNS = 10.2.0.100
PostUp = iptables -t nat -A POSTROUTING -o wg+ -j MASQUERADE;iptables -t nat -A PREROUTING -p tcp --dport 8112 -j DNAT --to-destination 172.30.0.10:8112
PreDown = iptables -t nat -D POSTROUTING -o wg+ -j MASQUERADE;iptables -t nat -D PREROUTING -p tcp --dport 8112 -j DNAT --to-destination 172.30.0.10:8112
[Peer]
PublicKey = 9NknLwkQRaxxxsfNr9wKIC15KsqRvN5eOwUZxuhDFWI=
PresharedKey = xhqj9bnxxxuuFtzbVJ5GJPD6D4YAMHdk6RbL5JVkT+M=
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 0
Endpoint = 222.222.96.107:51822
Kích hoạt lại Wireguard client container: docker-compose up -d
V. Kiểm tra kết nối
Sau khi thực hiện đầy đủ các bước ở trên, cổng mạng 8112
từ VPS sẽ được chuyển hướng đến Deluge container.
Kiểm tra bằng cách sử dụng điện thoại, dùng mạng 4G và truy cập vào địa chỉ http://2.2.2.2:8112
(2.2.2.2
là địa chỉ IP của VPS), nếu thấy Web UI hiện ra nghĩa là mọi thứ đã chạy ngon lành. Bravo!
Nếu kết nối báo lỗi nghĩa là bạn đã làm sai bước nào đó, cần kiểm tra lại.
Chúc bạn thực hiện thành công!
Nguồn: thuanbui