worker-tunnel یک تونل TCP روی WebSocket است که کلاینت آن با Go خالص نوشته شده و سمت سرور آن روی Cloudflare Workers اجرا میشود.
- روی یک آدرس TCP محلی گوش میدهد
- چند اتصال WebSocket احراز هویتشده به Worker باز نگه میدارد
- اتصالهای TCP ورودی را روی این WebSocketها multiplex میکند
- هر کانال را از سمت Worker به یک مقصد TCP دیگر وصل میکند
main.go: کلاینت اصلی پروژهworker.js: کد Cloudflare Worker.github/workflows/build.yml: ورکفلو بیلد و انتشار فایلهای اجرایی
ابتدا یک Worker در Cloudflare بسازید و محتوای فایل worker.js را داخل آن قرار دهید. این Worker درخواستهای WebSocket را میپذیرد و با استفاده از cloudflare:sockets به مقصد TCP وصل میشود.
برای احراز هویت، Worker هدر Authorization را بررسی میکند. اگر در محیط Cloudflare متغیر AUTH_SECRET تعریف شده باشد، همان استفاده میشود؛ در غیر این صورت مقدار پیشفرض داخل فایل به کار میرود.
برای دیپلوی سریع از روی همین ریپو هم میتوانید از دکمه زیر استفاده کنید:
یک مسیر ساده برای ساخت Worker با wrangler:
npm create cloudflare@latestwrangler deployبعد از دیپلوی، آدرس Worker شما چیزی شبیه your-worker.your-subdomain.workers.dev خواهد بود. همین آدرس را باید بهعنوان مقدار SNI در کلاینت Go استفاده کنید.
go build -o worker-tunnel .AUTH_TOKEN="your-secret" \
SNI="your-worker.workers.dev" \
WORKER_IPS="204.12.196.34,63.141.252.203" \
PROXY_TARGET="1.1.1.1:443" \
LISTEN_ADDR="0.0.0.0:443" \
./worker-tunnel| متغیر | مقدار پیشفرض | توضیح |
|---|---|---|
LISTEN_ADDR |
0.0.0.0:443 |
آدرس محلی برای listen کردن |
PROXY_TARGET |
1.1.1.1:443 |
مقصد TCP که Worker به آن وصل میشود |
WORKER_IPS |
204.12.196.34,63.141.252.203 |
لیست IPهای جداشده با ویرگول برای dial مستقیم |
SNI |
*.workers.dev |
مقداری که برای TLS SNI و هدر Host استفاده میشود |
AUTH_TOKEN |
d4TkphgXAsFk-Ij7APvyw3BPjOhQMDZcO9ngJ4o11wY |
توکن احراز هویت ارسالی به Worker |
BUFFER_SIZE |
4096 |
اندازه بافر خواندن TCP |
WORKERS_COUNT |
5 |
تعداد workerهای WebSocket که همزمان زنده نگه داشته میشوند |
RECONNECT_AFTER_SEC |
2 |
فاصله زمانی برای reconnect بعد از قطع اتصال |
CONNECT_TIMEOUT_SEC |
10 |
timeout برای برقراری اتصال WebSocket |
TLS_SKIP_VERIFY |
وقتی SNI شامل * باشد بهصورت پیشفرض true است، وگرنه false |
کنترل بررسی گواهی TLS |
- کلاینت Go فقط از standard library استفاده میکند و وابستگی خارجی ندارد.
- اگر از
*.workers.devاستفاده میکنید، بررسی TLS بهصورت پیشفرض غیرفعال میشود. برای حالت مطمئنتر از یک hostname واقعی مثلyour-worker.workers.devاستفاده کنید. - اگر یکی از workerها قطع شود، همه کانالهای متصل به همان worker بسته میشوند و کلاینت دوباره تلاش میکند اتصال را برقرار کند.
- در
worker.jsتبدیل base64 برای payloadهای بزرگ و مدیریت بستن socketها تقویت شده تا رفتار پایدارتر شود.