راه‌اندازی سرور Vless+WS+TLS+CDN با هسته سینگ‌باکس

 راه‌اندازی سرور Vless+WS+TLS+CDN با هسته سینگ‌باکس

خب امروز میخوام درباره‌ی یک روش دیگه که می‌تونید از فیلترینگ بگذرید بنویسم. توی این روش که یک مدل قدیمی تر از ریلیتی (Reality) هست. ما با استفاده از کلودفلر به سرورمون وصل میشه که باعث میشه شانس فیلترشدن آی پی سرور کم بشه و فیلترچی فقط دامنه رو میبینه. البته دامنه رو هم فیلتر میکنه اگه ترافیک زیاد باشه یا سیستم فیلترینگ مشکوک بشه، اما برای اون هم راه حل هست.

پست قبلی من در رابطه با نصب سینگ باکس و ریلیتی توی این روش زیاد کاربردی نیست چون برای TLS ما نیاز به Certificate داریم که اونو سینگ باکس میره مستقیم از Let’s Encrypt میگیره و نیاز به نصب ماژول داره که با اون روش کار نمیکنه. البته اگه فنی هستید میتونید همون روش رو پیگیری کنید و خودتون دستی Certificate رو وارد کنید. اما این پست برای عموم مردم هست.

نصب رو روی محیط Ubuntu 20.04 انجام دادم. با آپدیت پکیج ها و نصب Go زیر ادامه بدید:

sudo su
apt update && apt install -y build-essential
curl -fsL https://raw.githubusercontent.com/jetsung/golang-install/main/install.sh | bash
source /root/.bashrc

با دستور زیر خود هسته سینگ باکس رو با تمام ماژول هاش نصب کنید:

go install -v -tags "with_clash_api with_reality_server with_quic with_grpc with_wireguard with_shadowsocksr with_ech with_utls with_acme with_v2ray_api with_gvisor with_lwip" github.com/sagernet/sing-box/cmd/sing-box@dev-next

به تمام یوزرها اجازه دسترسی بدید:

cp ~/go/bin/sing-box /usr/local/bin/

یه فولدری بسازید که سینگ باکس وسایلاشو بریزه اونجا:

mkdir /etc/sing-box/ && cd $_

یه کانفیگ برای systemctl برای سینگ باکس بسازید:

cat <<EOF > /etc/systemd/system/sing-box.service
[Unit]
Description=sing-box Service
Documentation=https://sing-box.sagernet.org/
After=network.target nss-lookup.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/sing-box run -c /etc/sing-box/config.json
Restart=always
RestartSec=3s
RestartPreventExitStatus=23
LimitNPROC=10000
LimitNOFILE=1000000
[Install]
WantedBy=multi-user.target
EOF

با دستورات زیر هم می‌تونید سرویس سینگ باکس رو استارت، ریستارت و استاپ کنید. یادتون باشه فقط یکبار دستور enable رو واردکنید تا موقعی که سرور خاموش روشن شد دوباره سینگ باکس اتوماتیک اجرا بشه.

systemctl enable sing-box.service
systemctl start sing-box.service
systemctl restart sing-box.service
systemctl stop sing-box.service

با نانو یا هر برنامه دیگه یه فایل کانفیگ بسازید: (اگه چیزی به جاش هست پاک کنید)

nano /etc/sing-box/config.json

و کانفیگ زیر رو توش بندازید تا توضیحاتش رو بگم:

{
  "log": {
    "level": "info",
    "timestamp": true
	,"disabled": true
  },
  "dns": {
    "servers": [
      { 
        "tag": "local",
        "address": "https://1.1.1.1/dns-query",
        "detour": "direct"
      },
      {
        "tag": "block",
        "address": "rcode://success"
      }
    ]
  },
  "inbounds": [{
	"type": "vless",
	"tag": "vless-in",
	"listen": "::",
	"listen_port": 443,
	"users": [
		{
      "name": "user1",
      "uuid": "8337f541-d602-46f0-9da6-23516ab4c6a7"
		},
		{
      "name": "user2",
      "uuid": "1d4584c5-6293-4a92-0262-b448835166b7"
		}
	],
	"tls": {
		"enabled": true,
		"server_name": "sub1.example.com",
		"alpn": [
			"http/1.1","h2"
		],
		"min_version": "1.3",
		"max_version": "1.3",
		"acme": {
			"domain": ["sub1.example.com"],
			"data_directory": "/etc/sing-box",
			"default_server_name": "",
			"email": "[email protected]",
			"provider": "letsencrypt"
		}
	},
	"transport": {
		"type": "ws",
		"path": "/speedtest",
		"max_early_data": 0,
		"early_data_header_name": "Sec-WebSocket-Protocol"
	}
}],

  "outbounds": [
    {
      "type": "direct",
      "tag": "direct"
    },
    {
      "type": "block",
      "tag": "block"
    }
  ],
  "route": {
	"geosite": {
      "path": "/var/lib/sing-box/geosite.db",
      "download_url": "https://github.com/SagerNet/sing-geosite/releases/latest/download/geosite.db"
    },
	"geoip": {
      "path": "/var/lib/sing-box/geoip.db",
      "download_url": "https://github.com/SagerNet/sing-geoip/releases/latest/download/geoip.db"
    },
    "rules": [
      {
		"domain_keyword": [
          "snapp", "digikala","tapsi", "blogfa", "bank", "sb24.com", "sheypoor.com", "tebyan.net", "beytoote.com", "telewebion.com", "Film2movie.ws", "Setare.com", "Filimo.com", "Torob.com", "Tgju.org", "Sarzamindownload.com", "downloadha.com", "P30download.com", "Sanjesh.org", "irancell"
        ],
        "domain_suffix": [
          ".ir"
        ],
        "geoip": [
          "ir"
        ],
        "invert": false,
        "outbound": "block"
      }
    ]
  }
}

برای اضافه کردن یوز، میتونید همون user1 user2 رو تغییر بدید و با هر اسم دلخواهی و توی همون قالب کاربر جدید درست کنید. هر کاربر هم uuid خودش رو داره. اینجوری دیگه به پنل هم نیاز ندارید.

توی قسمت server_name یه دامنه که توی کلودفلر رو ثبت کردید رو بدید. پیشنهادم اینه که یه ساب دامنه بسازید تا بعدا انعطاف پذیر تر بمونید. ساب دامنه رو با رکورد A به سرور وصل کنید و اون گزینه proxy کلودفلر رو خاموش کنید فعلا. ابر باید سیاه سفید باشه.

کمترین ورژن TLS رو میگن باید 1.2 بذارید و بیشترین هم که 1.3 هست. اما من پیشنهاد میکنم همه 1.3 باشن. اگه دیدید هیچکس نمیتونه وصل بشه 1.2 بکنید.

دامنه هم همون ساب دامین رو دوباره بذارید و یه ایمیل هم وارد کنید. فیک هم باشه مهم نیست.

توی بخش transport و path من speedtest گذاشتم که بیشتر به ترافیک واقعی شبیه بشه. هرچیز دلخواه هم قبوله.

توی بخش بعدی route قبلا توضیح دادم که میاد دیتابیس دامنه ها و آی پی ها رو دانلود میکنه و سایت های ایرانی رو کلا می‌بنده که با فیلترشکن نتونید وارد سایت ایرانی بشید.

بعد از این تغییرات می‌تونید دستی سرویس رو اجرا کنید تا ببینید چی میشه بعد سرویس رو با systemctl اجرا کنید.

sing-box run -c /etc/sing-box/config.json

براتون کلی نوشته میاره که داره میره برای ساب دامنه‌ای که وارد کردید گواهینامه SSL بگیره. تهش می‌نویسه verification Successfully که یعنی گواهینامه رو گرفته و سرویس اجرا شده. دقت کنید که دیگه لاگ سرویس ندارید چون بنابه تجربه‌ی خودم یکم سرور رو کند می‌کرد. توی خط چهارم همون کانفیگ لاگ رو با disable: false فعال کنید. در ضمن، دریافت گواهینامه فقط یکبار انجام میشه و توی فولدر سینگ-باکس ذخیره میشه. اگه بخوایید ساب دامنه رو عوض کنید دوباره باید بره گواهینامه رو بگیره.

حالا وقتشه توی کلودفر اون گزینه پروکسی رو فعال کنید و ابر نارنجی رنگ میشه.

بخش کانفیگ کلاینت مثل ویندوز هم مثل زیر هست:

یک قدم به جلو……

فیلترچی و سیستم فیلترینگ میاد و آی پی کلودفلر که توی قسمت Address دامنه بهش متصل هست رو فیلتر میکنه و نمی‌تونید وصل بشید. کلودفلر آی پی هاش خیلی زیادن و فیلترکردنشون در عین حال که کار راحتیه اما باعث میشه خیلی از سرویس های دیگه مختل بشن و کار نکنن.(البته برای فیلترچی مهم نیست و سابقه فیلترشدن داشته). اما به هرحال میاد و آی پی هایی که کلودفلر به ایرانیاها میده رو فیلتر میکنه (آی پی هایی میده که به CDNهاش نزدیکن) با استفاده از اسکنرهای مختلف 1 و 2 و 3 و حتی آنلاین می‌تونید یکسری آی پی تمیز پیداکنید که فعلا فیلتر نیستن و جای Address بذارید. البته آی پی های کلودفلر موقتی شاید برای چند روز فیلتربشن ولی اینقدر زیادن که ما از یکی دیگه استفاده می‌کنیم. هروقت هم کند شد یا وصل نشد یه اسکن دیگه کنید و یکی دیگه وارد کنید.

یک قدم دیگه به جلو……

فیلترچی و سیستم فیلترینگ پیشرفته شده و این روش هم ممکنه جواب نده یا زود فیلتر بشه. اونم بخاطر SNI هست که چون دامنه شما معروف نیست ولی ترافیک زیادی ازش رد میشه ممکنه تشخیص فیلترشکن داده بشه. راهش اینه که بیایم و SNI یه سایت معروف رو بذاریم که برخلاف Reality امکانش اینجا نیست(چون کلید خصوصی سرور رو نداریم). پس راه حل چیه؟ راه حل اینه که دامنه خود کلودفلر رو بدیم! (هم معروفه و هم کلی ترافیک ازش رد میشه) برای این کار توی کلودفلر یه قابلیتی هست به نام ورکر Worker که میاد به شما اجازه میده یه کد جاوااسکریپت رو روی سرورهای کلودفلر اجرا کنید. خیلی سریع بگم، برید توی اکانت کلودفلرتون توی قسمت worker یدونه پروژه ایجاد کنید و کد زیر رو توش وارد کنید:

export default {
  async fetch(req) {
    try {
      const url = new URL(req.url);
      const splitted = url.pathname.replace(/^\/*/, '').split('/');
      const address = splitted[0];
      url.pathname = splitted.slice(1).join('/');
      url.hostname = address;
      url.protocol = 'https';
      return await fetch(new Request(url, req));
    } catch (e) {
      return new Response(e);
    }
  }
};

این کد میاد و هرچی ترافیکی که به سمتش میاد رو پاس میده به سرور اصلی. چطور میفهمه که سرور اصلی چیه و کجاست؟ توی کانفیگمون توی قسمت Path ما میایم و سرور اصلی رو اونجا وارد می‌کنیم و این کد، اون بخش رو جدا میکنه و تشخیص میده! در نتیجه کانفیگتون به شکل زیر میشه:

توی این حالت، Address که همون آی پی کلودفلر هست که با اسکن بدست اومده. SNI و Host هم اسم پروژه‌ای هست که توی ورکر کلودفلر ساختید. فیلترکردن این یکم هزینه بره و انجام نمیدن معمولا.

یک راه دیگه هم بود که با این وضعیت و مخفی شدن دامنه دیگه کاربرد نداره. اونم با استفاده از nginx میاید و یک صفحه وبلاگ الکی درست مکنید که سیستم فیلترینگ اگر درخواست بده به دامنه، وبلاگ اجرا بشه و دامنه مثل یه سایت عمل کنه نه یک فیلتر شکن. اگر علاقه‌مند بودید اینجا رو ببینید.

دو روش دیگه که بدون اینکه VPS یا سرور داشته باشید هم وجود داره و عملا خود کلودفلر سرور میشه. اینجا و اینجا. اما مشکلی که هست اینه که هردفعه آی پی خروجی عوض میشه و یکی از آی پی کلودفلره و بدرد ترید نمیخوره.

منابع:

وبسایت خوب ircf.space

نصب و توضیح سینگ باکس در وبسایت vpnrouter.homes

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *