Chuyên mục
Docker Network

Cấu hình DNAT (Port Forwarding) cho dịch vụ mạng kết nối vào WireGuard VPN

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

Thiết lập WireGuard client bằng Docker trên máy chủ Linux

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

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=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 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.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