پرش به مطلب اصلی

CDN Tunnel

هدف

هدف اصلی این پروژه، ایجاد یک تونل معکوس بهینه و آزمایش شده با استفاده از Cloudflare است که انعطاف‌پذیری لازم برای اضافه کردن ایده‌های جدید را نیز دارد.

مزایای استفاده از Cloudflare

  • یکی از امن‌ترین روش‌های تونل به دلیل استفاده از آی‌پی‌های تمیز و قانونی Cloudflare
  • مناسب برای کاهش نگرانی از دسترسی غیرمجاز به سرور ایرانی
  • محافظت در برابر حملات DDoS و سایر مزایای Cloudflare

نیازمندی‌ها

  1. دامنه شخصی: ترجیحاً دامنه .ir (اما سایر دامنه‌ها نیز کار می‌کنند)

    • استفاده از دامنه .ir نگرانی خاصی ندارد زیرا اتصال تحت پروتکل امن TLS برقرار می‌شود.
  2. گواهینامه امنیتی (Certificate):

    • دریافت گواهینامه از طریق ابزار certbot یا Cloudflare
    • گواهینامه Cloudflare فقط توسط Cloudflare قابل اعتماد است و برای کانفیگ مستقیم کار نمی‌کند.
    • هر دو روش برای تونل Cloudflare مناسب هستند.
  3. زیردامنه (Subdomain):

    • گواهینامه certbot فقط برای زیردامنه درخواست شده معتبر است، مگر به روش Wildcard درخواست شود.
    • Cloudflare به صورت پیش‌فرض گواهینامه Wildcard ارائه می‌دهد.
    • زیردامنه‌ها با گواهینامه Cloudflare باید تک‌بخشی باشند (مثلاً sub1.mydomain.com مجاز است اما sub2.sub1.mydomain.com خیر).
  4. فعال‌سازی gRPC در Cloudflare:

    • فعال‌سازی از طریق بخش "Network" در پنل Cloudflare
    • غیرفعال کردن "Bot Fight Mode"
    • تنظیم حداقل نسخه پروتکل TLS روی 1.2
    • تنظیم "SSL/TLS encryption mode" روی "Full"
  5. محدودیت پورت در Cloudflare:

    • اتصال Cloudflare به سرور ایران فقط از طریق پورت 443
    • Waterwall از یک سیستم فیلترینگ بسته‌های داخلی پشتیبانی می‌کند که امکان استفاده دوگانه از پورت 443 را فراهم می‌کند.

نمونه‌های تونل معکوس با gRPC

مثال ساده: تونل معکوس TLS gRPC تک‌پورت

این کانفیگ فقط پورت 443 را تونل می‌کند. کاربر به پورت 443 سرور ایران متصل می‌شود و در نهایت به پورت 443 سرور خارجی وصل می‌شود.

سرور خارج
{
"name": "config_reverse_tls_grpc_singleport_kharej",
"nodes": [
{
"name": "core_outbound",
"type": "TcpConnector",
"settings": {
"nodelay": true,
"address": "127.0.0.1",
"port": 443
}
},
{
"name": "bridge1",
"type": "Bridge",
"settings": {
"pair": "bridge2"
},
"next": "core_outbound"
},
{
"name": "bridge2",
"type": "Bridge",
"settings": {
"pair": "bridge1"
},
"next": "reverse_client"
},
{
"name": "reverse_client",
"type": "ReverseClient",
"settings": {},
"next": "grpc_client"
},
{
"name": "grpc_client",
"type": "ProtoBufClient",
"settings": {},
"next": "h2client"
},
{
"name": "h2client",
"type": "Http2Client",
"settings": {
"host": "sub.mydomain.com",
"port": 443,
"path": "/service",
"content-type": "application/grpc"
},
"next": "sslclient"
},
{
"name": "sslclient",
"type": "OpenSSLClient",
"settings": {
"sni": "sub.mydomain.com",
"verify": true,
"alpn": "h2"
},
"next": "iran_outbound"
},
{
"name": "iran_outbound",
"type": "TcpConnector",
"settings": {
"nodelay": true,
"address": "sub.mydomain.com",
"port": 443
}
}
]
}
سرور ایران
{
"name": "config_reverse_tls_grpc_singleport_iran",
"nodes": [
{
"name": "inbound_users",
"type": "TcpListener",
"settings": {
"address": "0.0.0.0",
"port": 443,
"nodelay": true
},
"next": "bridge2"
},
{
"name": "bridge2",
"type": "Bridge",
"settings": {
"pair": "bridge1"
}
},
{
"name": "bridge1",
"type": "Bridge",
"settings": {
"pair": "bridge2"
}
},
{
"name": "reverse_server",
"type": "ReverseServer",
"settings": {},
"next": "bridge1"
},
{
"name": "grpc_server",
"type": "ProtoBufServer",
"settings": {},
"next": "reverse_server"
},
{
"name": "h2server",
"type": "Http2Server",
"settings": {},
"next": "grpc_server"
},
{
"name": "sslserver",
"type": "OpenSSLServer",
"settings": {
"cert-file": "fullchain.pem",
"key-file": "privkey.pem",
"alpns": [
{
"value": "h2",
"next": "node->next"
},
{
"value": "http/1.1",
"next": "node->next"
}
],
"fallbackintencedelay": 0
},
"next": "h2server"
},
{
"name": "inbound_cloudflare",
"type": "TcpListener",
"settings": {
"address": "0.0.0.0",
"port": 443,
"nodelay": true,
"whitelist": [
// فهرست IP های Cloudflare
]
},
"next": "sslserver"
}
]
}

مثال چندپورت: تونل معکوس TLS gRPC چندپورت

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

سرور خارج
{
"name": "config_reverse_tls_grpc_multiport_kharej",
"nodes": [
{
"name": "core_outbound",
"type": "TcpConnector",
"settings": {
"nodelay": true,
"address": "127.0.0.1",
"port": "dest_context->port"
}
},
{
"name": "port_header",
"type": "HeaderServer",
"settings": {
"override": "dest_context->port"
},
"next": "core_outbound"
},
{
"name": "bridge1",
"type": "Bridge",
"settings": {
"pair": "bridge2"
},
"next": "port_header"
}
// سایر گره‌ها مشابه قبل
]
}
سرور ایران
{
"name": "config_reverse_tls_grpc_multiport_iran",
"nodes": [
{
"name": "inbound_users",
"type": "TcpListener",
"settings": {
"address": "0.0.0.0",
"port": [23, 65535],
"nodelay": true
},
"next": "port_header"
},
{
"name": "port_header",
"type": "HeaderClient",
"settings": {
"data": "src_context->port"
},
"next": "bridge2"
}
// سایر گره‌ها مشابه قبل
]
}

مثال ترکیب با HalfDuplex

این کانفیگ تونل معکوس را با پروتکل HalfDuplex ترکیب می‌کند تا مشکلات پینگ یا نوسان را کاهش دهد.

هشدار

ترکیب با HalfDuplex ممکن است مشکلاتی داشته باشد و بیشتر برای تونل معکوس عادی آزمایش شده است. در به‌روزرسانی‌های آینده، مشکلات احتمالی برطرف خواهند شد.

تغییرات در کانفیگ سرور خارج
"nodes": [
// گره‌های قبلی
{
"name": "reverse_client",
"type": "ReverseClient",
"settings": {},
"next": "halfc"
},
{
"name": "halfc",
"type": "HalfDuplexClient",
"settings": {},
"next": "grpc_client"
},
// سایر گره‌ها
]
تغییرات در کانفیگ سرور ایران
"nodes": [
// گره‌های قبلی
{
"name": "reverse_server",
"type": "ReverseServer",
"settings": {},
"next": "bridge1"
},
{
"name": "halfs",
"type": "HalfDuplexServer",
"settings": {},
"next": "reverse_server"
},
{
"name": "grpc_server",
"type": "ProtoBufServer",
"settings": {},
"next": "halfs"
},
// سایر گره‌ها
]

دانشنامه

  • Cloudflare: یک شرکت ارائه‌دهنده خدمات شبکه تحویل محتوا (CDN) و امنیت وب که از آی‌پی‌های تمیز و قانونی برخوردار است.
  • gRPC: یک فریمورک متن‌باز که امکان ارتباطات کارآمد و سبک بین سرویس‌ها را فراهم می‌کند.
  • گواهینامه امنیتی (Certificate): یک فایل دیجیتال که هویت و مالکیت یک وب‌سایت را تأیید می‌کند و برای برقراری اتصالات امن HTTPS استفاده می‌شود.
  • Certbot: یک ابزار خط فرمان برای دریافت و نصب خودکار گواهینامه‌های SSL/TLS از Let's Encrypt.
  • HalfDuplex: یک پروتکل ارتباطی که انتقال داده‌ها را در هر زمان فقط در یک جهت امکان‌پذیر می‌کند، اما جهت انتقال قابل تغییر است.