Chuyên mục
Network

Khắc phục lỗi WireGuard VPN (wg-easy) không hoạt động trên Oracle Cloud VPS

Sau một thời gian dài không đụng tới VPS miễn phí của Oracle Cloud, cách đây vài ngày mình mới quay trở lại. Không ngờ truy cập vào lại Dashboard thì tạo ngay được 1 con VPS ARM 4 vCPU, 24GB RAM, 200GB HDD luôn. Tận dụng ngay để nghịch ngợm các web app mới.

Trong khi cài đặt Wirehole-UI để thiết lập VPN trên con server của Oracle Cloud này, mình phát hiện ra Wireguard không còn hoạt động được nữa. Chính xác hơn là client vẫn kết nối được tới server, nhưng không truy cập Internet được.

Bài viết này sẽ hướng dẫn nhanh cách khắc phục tình trạng WireGuard VPN không hoạt đọng được trên Oracle Cloud VPS.

1. Nguyên nhân bị lỗi

Ứng dụng Wirehole-UI hoạt động dựa trên nền WireGuard VPN được thiết lập bởi wg-easy. Mặc định sau khi kích hoạt, wg-easy sẽ cấu hình iptables của container cho phép wireguard client truy cập internet thông qua interface eth0.

Các bạn có thể kiểm tra bằng cách xem nội dung file wg0.conf nằm cùng thư mục với file docker-compose.yml

sudo cat wg0.conf

# Note: Do not edit this file directly.
# Your changes will be overwritten!

# Server
[Interface]
PrivateKey = GC3uPUZkrEVtvxxxxxxxkw+//UNQCpqTMO3sTVSkE0=
Address = 10.8.0.1/24
ListenPort = 51820
PreUp =
PostUp = iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE; iptables -A INPUT -p udp -m udp –dport 51820 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT;
PreDown =
PostDown =

Ở dòng 10 là lệnh để cấu hình iptables, sử dụng interface eth0

Tuy nhiên trên Oracle Cloud VPS, container sau khi tạo đôi khi không sử dụng eth0, mà lại là eth1. Kiểm tra bằng lệnh sau

docker exec wg-easy ip r | grep default | cut -d ' ' -f 5 | head -n1
eth1

Vì lệnh cấu hình iptables được chỉ định thực thi trên interface eth0 nên wireguard client chỉ có thể truy cập được đến server nhưng không thể truy cập được Internet.

2. Cách khắc phục

Cập nhật lại file docker-compose.yml, bổ sung thêm thông số - WG_DEVICE=eth+ vào phần environment:. Đồng thời sửa lại tên image từ image: weejewel/wg-easy thành image: weejewel/wg-easy:nightly.

Nội dung của file docker-compose.yml của wg-easy sẽ tương tự như dưới đây. Nếu bạn dùng Wirehole-UI thì chỉnh sửa lại trong phần service của wg-easy.

version: "3.8"
services:
  wg-easy:
    environment:
      # ⚠️ Required:
      # Change this to your host's public address
      - WG_HOST=111.111.111.111
      - WG_DEVICE=eth+
      #- WG_PATH='./'
      # Optional:
      # - PASSWORD=10h30
      # - WG_PORT=51820
      # - WG_DEFAULT_ADDRESS=10.8.0.x
      # - WG_DEFAULT_DNS=1.1.1.1
      # - WG_MTU=1420
      # - WG_ALLOWED_IPS=192.168.15.0/24, 10.0.1.0/24
      # - WG_PRE_UP=echo "Pre Up" > /etc/wireguard/pre-up.txt
      # - WG_POST_UP=echo "Post Up" > /etc/wireguard/post-up.txt
      # - WG_PRE_DOWN=echo "Pre Down" > /etc/wireguard/pre-down.txt
      # - WG_POST_DOWN=echo "Post Down" > /etc/wireguard/post-down.txt
    image: weejewel/wg-easy:nightly
    container_name: wg-easy
    volumes:
      - .:/etc/wireguard
    ports:
      - "51820:51820/udp"
      - "51824:51821/tcp"
    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 bằng lệnh

docker compose down
docker compose up -d

Kiểm tra lại file wg0.conf sẽ thấy trong dòng lệnh iptables đã được đổi từ eth0 qua eth+

# Note: Do not edit this file directly.
# Your changes will be overwritten!

# Server

[Interface]
PrivateKey = GC3uPUZkrEVtvxxxxxxxkw+//UNQCpqTMO3sTVSkE0=
Address = 10.8.0.1/24
ListenPort = 51820
PreUp = 
PostUp =  iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth+ -j MASQUERADE; iptables -A INPUT -p udp -m udp --dport 51820 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; 
PreDown = 
PostDown = 

Vậy là xong. Nếu không có gì sai lầm, WireGuard VPN đã hoạt động ngon lành trên Oracle Cloud VPS.

Nguồn: thuanbui