Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save work-on-code/71497e386d9e586570f13bceacac534e to your computer and use it in GitHub Desktop.
Save work-on-code/71497e386d9e586570f13bceacac534e 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

#برای_آزادی

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