CDN Tunnel
هدف
هدف اصلی این پروژه، ایجاد یک تونل معکوس بهینه و آزمایش شده با استفاده از Cloudflare است که انعطافپذیری لازم برای اضافه کردن ایدههای جدید را نیز دارد.
مزایای استفاده از Cloudflare
- یکی از امنترین روشهای تونل به دلیل استفاده از آیپیهای تمیز و قانونی Cloudflare
- مناسب برای کاهش نگرانی از دسترسی غیرمجاز به سرور ایرانی
- محافظت در برابر حملات DDoS و سایر مزایای Cloudflare
نیازمندیها
-
دامنه شخصی: ترجیحاً دامنه
.ir
(اما سایر دامنهها نیز کار میکنند)- استفاده از دامنه
.ir
نگرانی خاصی ندارد زیرا اتصال تحت پروتکل امن TLS برقرار میشود.
- استفاده از دامنه
-
گواهینامه امنیتی (Certificate):
- دریافت گواهینامه از طریق ابزار
certbot
یا Cloudflare - گواهینامه Cloudflare فقط توسط Cloudflare قابل اعتماد است و برای کانفیگ مستقیم کار نمیکند.
- هر دو روش برای تونل Cloudflare مناسب هستند.
- دریافت گواهینامه از طریق ابزار
-
زیردامنه (Subdomain):
- گواهینامه
certbot
فقط برای زیردامنه درخواست شده معتبر است، مگر به روش Wildcard درخواست شود. - Cloudflare به صورت پیشفرض گواهینامه Wildcard ارائه میدهد.
- زیردامنهها با گواهینامه Cloudflare باید تکبخشی باشند (مثلاً
sub1.mydomain.com
مجاز است اماsub2.sub1.mydomain.com
خیر).
- گواهینامه
-
فعالسازی gRPC در Cloudflare:
- فعالسازی از طریق بخش "Network" در پنل Cloudflare
- غیرفعال کردن "Bot Fight Mode"
- تنظیم حداقل نسخه پروتکل TLS روی 1.2
- تنظیم "SSL/TLS encryption mode" روی "Full"
-
محدودیت پورت در 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: یک پروتکل ارتباطی که انتقال دادهها را در هر زمان فقط در یک جهت امکانپذیر میکند، اما جهت انتقال قابل تغییر است.