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:

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

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 aCode language: Bash (bash)

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

Địa chỉ IP của WireGuard client nằm trong mục wg010.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.7Code language: YAML (yaml)

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

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

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

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

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!

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 vào hỏi trong fanpage Yêu Chạy Bộ, sẽ không có phản hồi đâu!

Để lại một bình luận

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 *


4 Comments

  1. Hi anh,

    Em có nhu cầu tạo kết nối từ xa bằng public port cho RPI cài Plex Server + Mấy dịch vụ kéo torrent. Tuy nhiên vấn đề là e chỉ có thể kết nối RPI vào hệ thống mesh wifi kết nối với router chính qua DHCP (lý do k để nó đi thẳng vào router chính là do cấu hình router k đủ). Vì vậy phải setup port forward trên mesh qua router. Tuy nhiên nó chỉ forward được 1 port. Có cách nào để e forward được nhiều port để sử dụng open port trên hệ thống mạng nhà mình được không a

    1. Mình không hiểu lắm cấu hình mạng của bạn. Nhưng theo bạn nói thì cách dễ nhất để cấu hình là mua con router mới, cỡ 500K là có được em Newifi 3D2 chạy OpenWRT tha hồ tuỳ biến.

  2. Chào bạn, mong bạn hỗ trợ
    Phía server mình đã dnat về client thành công qua port 8899.
    Phía client mình chạy docker wordpress port 8899:80
    cũng như chạy lệnh sau docker exec wireguard-client curl -s ifconfig.me trả về đúng ip của server rồi. Tuy nhiên mình ko thể truy cập wordpress đc thông qua serverip:8899, Mình đã mở port 8899 trên router xong.

    mình dùng lệnh: sudo iptables -t nat -L -n -v trên phía client thì thấy thông tin sau (docker ip của wordpress đang là 10.11.0.6:

    luna@debian:~/docker/wg-client2$ sudo iptables -t nat -L -n -v
    Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
    pkts bytes target prot opt in out source destination
    124 6474 DOCKER 0 — * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL
    0 0 DNAT 6 — * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8899 to:10.11.0.6:8899

    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    pkts bytes target prot opt in out source destination

    Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
    pkts bytes target prot opt in out source destination
    1 60 DOCKER 0 — * * 0.0.0.0/0 !127.0.0.0/8 ADDRTYPE match dst-type LOCAL

    Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
    pkts bytes target prot opt in out source destination
    0 0 MASQUERADE 0 — * !docker0 172.17.0.0/16 0.0.0.0/0
    66 4558 MASQUERADE 0 — * !br-d193e9d5e0ad 10.11.0.0/24 0.0.0.0/0
    0 0 MASQUERADE 0 — * !br-bf05e248a6b8 172.21.0.0/16 0.0.0.0/0
    1 176 MASQUERADE 0 — * !br-16c5273d8129 10.10.0.0/24 0.0.0.0/0
    0 0 MASQUERADE 6 — * * 10.11.0.6 10.11.0.6 tcp dpt:80

    Chain DOCKER (2 references)
    pkts bytes target prot opt in out source destination
    0 0 RETURN 0 — docker0 * 0.0.0.0/0 0.0.0.0/0
    0 0 RETURN 0 — br-d193e9d5e0ad * 0.0.0.0/0 0.0.0.0/0
    0 0 RETURN 0 — br-bf05e248a6b8 * 0.0.0.0/0 0.0.0.0/0
    0 0 RETURN 0 — br-16c5273d8129 * 0.0.0.0/0 0.0.0.0/0
    10 528 DNAT 6 — !br-d193e9d5e0ad * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8899 to:10.11.0.6:80