Skip to content

Instantly share code, notes, and snippets.

@alikarimii
Last active November 7, 2024 18:00
Show Gist options
  • Save alikarimii/9841d8a2ed00dab361ef542deba23d97 to your computer and use it in GitHub Desktop.
Save alikarimii/9841d8a2ed00dab361ef542deba23d97 to your computer and use it in GitHub Desktop.
Set Up a Wireguard VPN Server with WebSocket Tunneling

این آموزش مربوط به سیستم های یونیکسه.

CDN

خب اول یک دامنه یا ساب دامنه انتخاب کنید و یک A رکورد به مقدار آی پی سرور خارجی و پرت HTTPS بسازید.سی دی ان داخلی باشه که طرح رذالتو دور بزنید. باید روی SSL,CDN رو فعال کنید.

SSL

خب برای اون دامنه باید اس اس ال داشته باشید با این فایل ها fullchain.pem, privkey.pem, chain.pem, dhparam.pem آموزش گرفتن اس اس ال هم که زیاده. (dhparam- Diffie–Hellman (D-H))

NGINX

اول nginx رو روی سرور خارجی نصب کنید. اینم کانفیگ.

server {
    server_name yourdomain.com;
    listen 443 ssl;
    
    ssl_certificate /path/to/ssl/fullchain.pem;
    ssl_certificate_key /path/to/ssl/privkey.pem;
    ssl_trusted_certificate /path/to/ssl/chain.pem
    ssl_dhparam /path/to/ssl/dhparam.pem;
    
    ssl_session_cache shared:le_nginx_SSL:10m;
    ssl_session_timeout 1440m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;
    ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";

    location /E7m5vGDqryd55MMP/ {
        proxy_pass http://127.0.0.1:54545;
        proxy_http_version  1.1;
        proxy_set_header    Upgrade $http_upgrade;
        proxy_set_header    Connection "upgrade";
        proxy_set_header    Host $http_host;
        proxy_set_header    X-Real-IP $remote_addr;

        proxy_connect_timeout       10m;
        proxy_send_timeout          10m;
        proxy_read_timeout          90m;
        send_timeout                10m;
    }
}
  • مسیر فایل های اس اس ال رو درست کنید
  • E7m5vGDqryd55MMP: این مسیر رندومه.میتونه هرچیزی باشه.والبته پورت

WireGuard Server

wget https://git.io/wireguard -O wireguard-install.sh && bash wireguard-install.sh

کافیه این اسکریپت رو روی سرور ران کنید و بوم. با wg0.confسرور کاری نداریم. ولی فایل کانفیگ که برای کلاینت میسازه رو باید تغییر بدیم مختصر

Client.conf

فایل کلاینت بعد از تغییر همچین چیزی میشه.

[Interface]
Address = 10.10.1.2/24
DNS = 8.8.8.8, 8.8.4.4
# <= این ۴خط هم اضافه میشه =>
Table = off
PreUp = source /etc/wireguard/wstunnel.sh && pre_up %I
PostUp = source /etc/wireguard/wstunnel.sh && post_up %i %I
PostDown = source /etc/wireguard/wstunnel.sh && post_down %i %I

PrivateKey = ....

[Peer]
PublicKey = ....
PresharedKey = ....
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 127.0.0.1:51820          # <= این از آی پی سرور تغییر میکنه به لوکال
PersistentKeepalive = 25

Wstunnel Server

  • به آدرس زیر میرید و نسخه مربوطه هم برای سرور و کلاینت رو دانلود میکنید.
    • https://github.com/erebe/wstunnel/releases/
wget https://github.com/erebe/wstunnel/releases/download/v4.1/wstunnel-x64-linux
mv wstunnel-x64-linux /usr/local/bin/wstunnel
chmod uo+x /usr/local/bin/wstunnel
setcap CAP_NET_BIND_SERVICE=+eip /usr/local/bin/wstunnel

Wstunnel Service in Server

  • یک فایل سرویس سیستم دی در مسیر زیر و محتویات پایین درست میکنید
    • /etc/systemd/system/wstunnel.service
[Unit]
Description=Tunnel WG UDP over websocket
After=network.target

[Service]
Type=simple
User=nobody
ExecStart=/usr/local/bin/wstunnel -q --server ws://127.0.0.1:54545 --restrictTo=127.0.0.1:51820
Restart=no

[Install]
WantedBy=multi-user.target
  • 54545: همون پورتی که برای کانفیگ nginx انتخاب کردید
  • 51820: پورت دیفالت وایرگارد.اگه تغییر دادید هرجایی این پورت بود توی تنظیمات عوضش کنید

سرویس رو با دستور زیر اجرا میکنید و وب سوکت راه میوفته sudo systemctl enable --now wstunnel.service چک کنید سرویس درست راه اندازی شده باشه sudo systemctl status wstunnel.service

Enable IP Forward

توی فایل زیر قسمت net.ipv4.ip_forward=1 رو از حالت کامنت خارج کنید و سرور رو ریستارت کنید.

  • /etc/sysctl.d/99-sysctl.conf

Client Side

wg-quick

برای وصل شدن به وایرگارد باید این نصب بشه

  • Mac : brew install wireguard-tools
  • Ubuntu: sudo apt install wireguard

WireGuard Config

اول با دسترسی روت این مسیرها رو ایجاد کنید

  • /var/run/wireguard/
  • /etc/wireguard/

فایل client.conf که قبلا سرور برامون ساخته بود و ما تغییرش دادیم رو با اسم wg0.conf روی مسیر زیر میریزیم

  • /etc/wireguard/wg0.conf
  • sudo bash -c "chown root wg0.conf && chmod 640 wg0.conf"

wstunnel

برای کلاینت هم سوکت رو نصب میکنید.چک کنید نسخه ها آخری باشه.

wget https://github.com/erebe/wstunnel/releases/download/v4.1/wstunnel-x64-linux
sudo mv wstunnel-x64-linux /usr/local/bin/wstunnel
sudo chmod +x /usr/local/bin/wstunnel

wg0.wstunnel

فایل کانفیگ وب سوکت رو توی مسیر زیر با محتویات پایین میسازیم

  • /etc/wireguard/wg0.wstunnel
REMOTE_HOST=yourdomain.com
REMOTE_PORT=51820
UPDATE_HOSTS='/etc/hosts'
WS_PREFIX='E7m5vGDqryd55MMP'
  • yourdomain.com: همونی که گذاشتید پشت سی دی ان
  • E7m5vGDqryd55MMP: همون مسیر رندومه توی nginx

wstunnel.sh

این اسکریپت کارهای روتینگ رو انجام میده که کل ترافیک لازم ما از وایرگارد از داخل سوکت رد بشه.

wget https://raw.githubusercontent.com/jnsgruk/wireguard-over-wss/master/wstunnel.sh
sudo mv wstunnel.sh /etc/wireguard/wstunnel.sh
sudo chmod +x /etc/wireguard/wstunnel.sh

فقط چون سرویس ما قراره پشت سی دی ان باشه یه هارد کد کوچک روی wstunnel.sh لازمه و اون توی خط ۱۱۳ .

  • شما این خط رو کامنت میکنی
    • remote_ip=$(dig +short "${remote}")
  • و جای خط بالا آی پی سرور خارجی رو هارد کد کن. تتبل بازی :)
    • remote_ip="1.2.3.4"

Start WireGuard

sudo wg-quick up wg0

Stop WireGuard

sudo wg-quick down wg0

References

#برای_آزادی

@jvdi
Copy link

jvdi commented Jun 25, 2023

سلام - خیلی ممنون از آموزش جالب و ایده جذابت
من خودم رفتم تستش کردم - یعضی جاها به مشکل خوردم و گفتم اینجا بگم - (من با داکر کل این سرویس رو بالا آوردم - نوت اش را هم در گیست خودم گذاشتم Wireguard Over Websocke and Nginx Reverse Proxy + cdn in docker )

در مورد ssl من نیازی ندیدم (اگر علت خاصی داره لطفا بگید) از chain.pem, dhparam.pem استفاده کنم همون دو تا کلید اولی کافی بود و
این خط ها رو هم استفاده نکردم:

    ssl_session_timeout 1440m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;
    ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";

اگر چیزایی که استفاده نکردم نکته خاصی داشته لطفا به من هم اطلاع بدبد ممنون 😇

در فایل client.conf این خط ها کلا خطا میدادن :

PreUp = source /etc/wireguard/wstunnel.sh && pre_up %I
PostUp = source /etc/wireguard/wstunnel.sh && post_up %i %I
PostDown = source /etc/wireguard/wstunnel.sh && post_down %i %I

من اینطوریشون کردم جواب دادن:

PreUp = source /etc/wireguard/wstunnel.sh && pre_up %i
PostUp = source /etc/wireguard/wstunnel.sh && post_up %i
PostDown = source /etc/wireguard/wstunnel.sh && post_down %i

به جای این remote_ip=$(dig +short "${remote}") باید آی پی - سرور سی دی ان رو بگذارید تا ترافیک از به اصطلاح ابر عبور کند (اگر آی پی خارج رو بزنیم دیگه دامنه حساب میشه که آی پیش همون سرور خارج هست و این یعنی سی دی ان پَر)

با تشکر از به اشتراک گذاری تجربه هاتون - من صرفا خواستم تجربه ام را بگم

@koss822
Copy link

koss822 commented Mar 20, 2024

Maybe also nginx reverse proxy when you have a server behind reverse proxy

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections  1024;
}

stream {
  resolver 8.8.8.8;

  map $ssl_preread_server_name $selected_upstream {
    YOUR.WIREGUARD.WEBSITE.COM 127.0.0.1:10443;
    default 127.0.0.1:8443; # YOUR EXISTING HTTPS WEBSERVER ADDRESS
  }

  server {
    listen 443; # PORT WE WILL LISTEN ON
    proxy_pass $selected_upstream;
    ssl_preread on;
  }
}

source: WebSocket connection to WireGuard

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment