TLS Tunnel
در این بخش، به بررسی تونل TLS میپردازیم که یک روش پیشرفتهتر و امنتر نسبت به تونل پورت به پورت است. تونل TLS با استفاده از پروتکل امنیتی TLS، ارتباط رمزگذاری شدهای را بین سرور ایران و سرور خارج برقرار میکند.
مزایای استفاده از تونل TLS
- مناسب برای بهبود سرعت در سرورهای خارجی مانند هتزنر که با تونلهای معکوس مشکل سرعت دارند.
- در صورت استفاده ساده، ممکن است توسط فایروال ایران فیلتر شود. اما با اقداماتی مانند استفاده از ماکس و فعالسازی
anti-tls-in-tls
، میتوان احتمال فیلتر شدن را به حداقل رساند. - برای کاهش زمان هندشیک، بهتر است با
preconnect
ترکیب شود.
نیازمندیها
-
دامنه: برای برقراری تونل TLS، نیاز به یک دامنه است. دامنههای
.ir
ارزانترین گزینه هستند و استفاده از آنها نگرانی خاصی ندارد. -
گواهینامه امنیتی (Certificate): برای دامنه، باید یک گواهینامه امنیتی دریافت شود. این کار را میتوان با ابزار
certbot
انجام داد. دستورات نصب و درخواست گواهینامه به شرح زیر هستند:apt-get install certbot
sudo certbot certonly --standalone --preferred-challenges http --agree-tos --email emaileshoma@gmail.com -d sub.mydomain.ir
پس از اجرای دستورات، گواهینامهها در قالب دو فایل fullchain.pem و privkey.pem ذخیره میشوند.
حالتهای مختلف تونل TLS
حالت تک پورت و جدا
در این حالت، فرض میشود که همه کاربران روی یک پورت (مثلاً 2083) ساخته شدهاند و پنل روی سرور خارج در حال اجراست.
فلوچارت حالت تک پورت و جدا
{
"name": "tls_port_to_port",
"nodes": [
{
"name": "input",
"type": "TcpListener",
"settings": {
"address": "0.0.0.0",
"port": 2083,
"nodelay": true
},
"next": "mysslclient"
},
{
"name": "mysslclient",
"type": "OpenSSLClient",
"settings": {
"sni": "mydomain.ir",
"verify": true,
"alpn": "http/1.1"
},
"next": "output"
},
{
"name": "output",
"type": "TcpConnector",
"settings": {
"nodelay": true,
"address": "1.1.1.1",
"port": 443
}
}
]
}
{
"name": "tls_port_to_port_kharej",
"nodes": [
{
"name": "input",
"type": "TcpListener",
"settings": {
"address": "0.0.0.0",
"port": 443,
"nodelay": true
},
"next": "mysslserver"
},
{
"name": "mysslserver",
"type": "OpenSSLServer",
"settings": {
"cert-file": "fullchain.pem",
"key-file": "privkey.pem",
"alpns": [
{
"value": "h2",
"next": "node->next"
},
{
"value": "http/1.1",
"next": "node->next"
}
]
},
"next": "output"
},
{
"name": "output",
"type": "TcpConnector",
"settings": {
"nodelay": true,
"address": "127.0.0.1",
"port": 2083
}
}
]
}
استفاده بهینه از پورت 443
برای استفاده بهینه از پورت 443 هم برای کاربران مستقیم و هم برای تونل، میتوان کانفیگ را به شکل زیر تغییر داد:
فلوچارت استفاده بهینه از پورت 443
{
"name": "tls_port_to_port_iran",
"nodes": [
{
"name": "input",
"type": "TcpListener",
"settings": {
"address": "0.0.0.0",
"port": 443,
"nodelay": true
},
"next": "mysslclient"
},
{
"name": "mysslclient",
"type": "OpenSSLClient",
"settings": {
"sni": "mydomain.ir",
"verify": true,
"alpn": "http/1.1"
},
"next": "output"
},
{
"name": "output",
"type": "TcpConnector",
"settings": {
"nodelay": true,
"address": "1.1.1.1",
"port": 443
}
}
]
}
{
"name": "tls_port_to_port_kharej",
"nodes": [
{
"name": "input_direct_users",
"type": "TcpListener",
"settings": {
"address": "0.0.0.0",
"port": 443,
"nodelay": true
},
"next": "output_direct_users"
},
{
"name": "output_direct_users",
"type": "TcpConnector",
"settings": {
"nodelay": true,
"address": "127.0.0.1",
"port": 2083
}
},
{
"name": "input_tunnel",
"type": "TcpListener",
"settings": {
"address": "0.0.0.0",
"port": 443,
"nodelay": true,
"whitelist": ["2.2.2.2/32"]
},
"next": "mysslserver"
},
{
"name": "mysslserver",
"type": "OpenSSLServer",
"settings": {
"cert-file": "fullchain.pem",
"key-file": "privkey.pem",
"alpns": [
{
"value": "h2",
"next": "node->next"
},
{
"value": "http/1.1",
"next": "node->next"
}
]
},
"next": "output_tunnel"
},
{
"name": "output_tunnel",
"type": "TcpConnector",
"settings": {
"nodelay": true,
"address": "127.0.0.1",
"port": 2083
}
}
]
}
حالت مالتی پورت
در این حالت، کاربر به هر پورتی که روی سرور ایران وصل شود، به همان پورت روی سرور خارج وصل میشود. تبادل اطلاعات از طریق کانکشن TLS بین Waterwall سرور ایران و پورت 443 سرور خارج انجام میشود.