آموزش‌های کلادفلر به‌زودی در این بخش قرار داده می‌شود.

برچسب: مرورگر

  • gRPC-Web چیست؟ ارتباط وب با سرویس‌های gRPC

    خب gRPC-Web یک کتابخانه جاوااسکریپتیه. کتابخانه یعنی یک سری کد آماده که کار ما رو راحت میکنه. حالا کار این کتابخانه چیه؟ کارش اینه که به کلاینت‌های مرورگر، یعنی همون اپلیکیشن‌هایی که توی کروم یا فایرفاکس شما باز میشن، اجازه میده که بتونن به یک سرویس gRPC وصل بشن و باهاش حرف بزنن. پس این یه جور پل ارتباطی بین دنیای وب و مرورگرها با دنیای سرویس‌های gRPC حساب میشه.

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

    یک نکته مهم که باید بدونید اینه که gRPC-Web الان به مرحله «عرضه عمومی» یا همون «Generally Available» رسیده. این یعنی چی؟ یعنی دیگه یک پروژه آزمایشی و نصفه و نیمه نیست. کاملا پایداره و شرکت‌ها و برنامه‌نویس‌ها میتونن با خیال راحت در محصولات نهایی و تجاری خودشون ازش استفاده کنن.

    نکته کلیدی اینه که کلاینت‌های gRPC-Web نمیتونن مستقیم با سرویس‌های gRPC صحبت کنن. این وسط به یک واسطه یا یک جور مترجم نیاز دارن. این مترجم یک «پراکسی» یا «gateway» مخصوصه. به طور پیش‌فرض، کتابخانه gRPC-Web از پراکسی به اسم Envoy استفاده میکنه که پشتیبانی از gRPC-Web به صورت داخلی در اون تعبیه شده. پس روند کار اینطوری میشه: اپلیکیشن توی مرورگر شما درخواستش رو به زبان gRPC-Web به Envoy میفرسته، بعد Envoy اون درخواست رو ترجمه میکنه و به زبان gRPC اصلی به سرویس پشتیبان یا همون بک‌اند میفرسته. جواب رو هم به همین صورت برعکس ترجمه میکنه و به مرورگر برمیگردونه.

    نگران نباشید، در آینده قراره این وضعیت بهتر هم بشه. تیم توسعه‌دهنده gRPC-Web انتظار داره که پشتیبانی از این تکنولوژی مستقیما به فریمورک‌های تحت وب در زبان‌های مختلف مثل پایتون، جاوا و نود جی‌اس اضافه بشه. این یعنی شاید در آینده دیگه نیازی به اون پراکسی جداگانه نباشه. اگه دوست دارید بیشتر در مورد برنامه‌های آینده بدونید، میتونید سند نقشه راه یا «roadmap» این پروژه رو مطالعه کنید.

    چرا اصلا باید از gRPC و gRPC-Web استفاده کنیم؟

    خب، سوال خوبیه. بیایید ببینیم مزیت این کار چیه. با gRPC شما میتونید سرویس خودتون رو فقط یک بار در یک فایلی به نام .proto تعریف کنید. این فایل مثل یک قرارداد یا یک نقشه ساختمون میمونه. بعد از اینکه این نقشه رو تعریف کردید، میتونید با استفاده از ابزارهای gRPC، کلاینت‌ها و سرورهای مربوط به اون سرویس رو در هر زبانی که gRPC ازش پشتیبانی میکنه، بسازید. این زبان‌ها میتونن خیلی متنوع باشن و در محیط‌های مختلفی هم اجرا بشن، از سرورهای غول‌پیکر در دیتاسنترهای بزرگ گرفته تا تبلت شخصی شما.

    تمام پیچیدگی‌های ارتباط بین این زبان‌ها و محیط‌های مختلف توسط خود gRPC مدیریت میشه و شما دیگه درگیر جزئیات نمیشید. علاوه بر این، شما از تمام مزایای کار با «پروتکل بافر» یا همون «Protocol Buffers» هم بهره‌مند میشید. این مزایا شامل سریال‌سازی بهینه (یعنی تبدیل داده‌ها به فرمتی فشرده و سریع برای انتقال)، یک زبان تعریف رابط کاربری ساده (IDL) و قابلیت به‌روزرسانی آسان رابط‌ها میشه.

    حالا gRPC-Web این وسط چه نقشی داره؟ gRPC-Web به شما این امکان رو میده که از داخل مرورگرها، با یک API کاملا طبیعی و آشنا برای برنامه‌نویس‌های وب، به همین سرویس‌های gRPC که ساختید دسترسی پیدا کنید.

    محدودیت‌های مرورگر و راه حل‌های موجود

    یک حقیقت مهم وجود داره که باید بدونیم: امکان فراخوانی مستقیم یک سرویس gRPC از مرورگر وجود نداره. چرا؟ چون gRPC از ویژگی‌های پروتکل HTTP/2 استفاده میکنه و هیچ مرورگری اون سطح از کنترل دقیق روی درخواست‌های وب رو که برای پشتیبانی از یک کلاینت gRPC لازمه، در اختیار ما قرار نمیده. مثلا ما نمیتونیم مرورگر رو مجبور کنیم حتما از HTTP/2 استفاده کنه و حتی اگه میتونستیم، به فریم‌های خام HTTP/2 در مرورگرها دسترسی نداریم.

    اینجا gRPC روی ASP.NET Core دو تا راه حل سازگار با مرورگر ارائه میده:

    • gRPC-Web
    • gRPC JSON transcoding

    آشنایی با gRPC-Web

    این همون تکنولوژی هست که داریم در موردش صحبت میکنیم. gRPC-Web به اپلیکیشن‌های مرورگر اجازه میده تا با استفاده از کلاینت gRPC-Web و پروتکل بافر، سرویس‌های gRPC رو فراخوانی کنن.

    • این روش خیلی شبیه به gRPC معمولیه، اما یک پروتکل انتقال داده کمی متفاوت داره که باعث میشه با HTTP/1.1 و مرورگرها سازگار باشه.
    • برای استفاده از این روش، اپلیکیشن مرورگر باید یک کلاینت gRPC رو از روی همون فایل .proto که تعریف کردیم، تولید کنه.
    • این روش به اپلیکیشن‌های مرورگر اجازه میده از مزایای پیام‌های باینری که عملکرد بالا و مصرف شبکه کمی دارن، بهره‌مند بشن.

    خبر خوب اینه که دات نت (.NET) به صورت داخلی از gRPC-Web پشتیبانی میکنه.

    آشنایی با gRPC JSON transcoding

    این یک راه حل جایگزینه. این روش به اپلیکیشن‌های مرورگر اجازه میده تا سرویس‌های gRPC رو طوری فراخوانی کنن که انگار دارن با یک RESTful API معمولی با فرمت JSON کار میکنن.

    • در این حالت، اپلیکیشن مرورگر نیازی به تولید کلاینت gRPC نداره و اصلا لازم نیست چیزی در مورد gRPC بدونه.
    • RESTful API‌ها به صورت خودکار از روی سرویس‌های gRPC ساخته میشن. این کار با اضافه کردن یک سری حاشیه‌نویسی یا «metadata» مربوط به HTTP به فایل .proto انجام میشه.
    • این روش به یک اپلیکیشن اجازه میده که هم از gRPC و هم از JSON web API‌ها پشتیبانی کنه، بدون اینکه لازم باشه برای هر کدوم سرویس‌های جداگانه‌ای بسازه و کار تکراری انجام بده.

    دات نت همچنین از ساخت JSON web API از روی سرویس‌های gRPC هم پشتیبانی داخلی داره. فقط یادتون باشه که برای استفاده از gRPC JSON transcoding به دات نت ۷ یا بالاتر نیاز دارید.

    یک آموزش پایه‌ای: بیایید دست به کار بشیم

    خب، تئوری کافیه. بیایید با یک مثال عملی ببینیم چطور میشه از gRPC-Web استفاده کرد. در این آموزش یاد میگیریم که:

    • چطور یک سرویس رو در یک فایل .proto تعریف کنیم.
    • چطور با استفاده از کامپایلر پروتکل بافر، کد کلاینت رو تولید کنیم.
    • چطور از API ی gRPC-Web برای نوشتن یک کلاینت ساده برای سرویسمون استفاده کنیم.

    فرض ما اینه که شما یک آشنایی اولیه با پروتکل بافرها دارید.

    مرحله ۱: تعریف سرویس در فایل echo.proto

    اولین قدم در ساخت یک سرویس gRPC، تعریف متدهای سرویس و انواع پیام‌های درخواست و پاسخ اونها با استفاده از پروتکل بافرهاست. در این مثال، ما یک سرویس به نام EchoService رو در فایلی به اسم echo.proto تعریف میکنیم. این فایل مثل یک نقشه اولیه برای ارتباط ما عمل میکنه.

    message EchoRequest {
      string message = 1;
    }
    
    message EchoResponse {
      string message = 1;
    }
    
    service EchoService {
      rpc Echo(EchoRequest) returns (EchoResponse);
    }

    این تعریف خیلی ساده است. ما یک درخواست به نام EchoRequest داریم که یک پیام متنی میگیره. یک پاسخ به نام EchoResponse داریم که اون هم یک پیام متنی برمیگردونه. و یک سرویس به نام EchoService داریم که یک متد به نام Echo داره. این متد یک EchoRequest میگیره و یک EchoResponse برمیگردونه. کارش اینه که هر پیامی بهش بدی، همون رو بهت برگردونه. مثل یک اکو یا پژواک صدا.

    مرحله ۲: پیاده‌سازی سرور بک‌اند gRPC

    حالا که نقشه رو داریم، باید سرور رو بسازیم. در مرحله بعد، ما رابط EchoService رو با استفاده از Node.js در بک‌اند پیاده‌سازی میکنیم. این سرور که اسمش رو EchoServer میذاریم، درخواست‌های کلاینت‌ها رو مدیریت میکنه. برای دیدن جزئیات کامل کد، میتونید به فایل node-server/server.js در مثال‌های رسمی gRPC-Web مراجعه کنید.

    یک نکته مهم اینه که شما میتونید سرور رو با هر زبانی که gRPC ازش پشتیبانی میکنه پیاده‌سازی کنید. این یکی از قدرت‌های gRPC هست.

    یک تیکه کد از سرور نود جی‌اس این شکلیه:

    function doEcho(call, callback) {
      callback(null, {message: call.request.message});
    }

    همونطور که میبینید، این تابع خیلی ساده است. یک درخواست (call) میگیره، پیام داخلش رو برمیداره و در یک پیام جدید به عنوان پاسخ (callback) برمیگردونه.

    مرحله ۳: پیکربندی پراکسی Envoy

    همونطور که قبلا گفتیم، برای اینکه درخواست مرورگر به سرور بک‌اند ما برسه، به یک مترجم یا پراکسی نیاز داریم. در این مثال، ما از پراکسی Envoy استفاده میکنیم. فایل پیکربندی کامل Envoy رو میتونید در envoy.yaml ببینید.

    برای اینکه Envoy درخواست‌های gRPC رو به سرور بک‌اند ما فوروارد کنه، به یک بلوک تنظیمات شبیه به این نیاز داریم:

    admin:
      address:
        socket_address: { address: 0.0.0.0, port_value: 9901 }
    static_resources:
      listeners:
      - name: listener_0
        address:
          socket_address: { address: 0.0.0.0, port_value: 8080 }
        filter_chains:
        - filters:
          - name: envoy.http_connection_manager
            typed_config:
              "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
              codec_type: auto
              stat_prefix: ingress_http
              route_config:
                name: local_route
                virtual_hosts:
                - name: local_service
                  domains: ["*"]
                  routes:
                  - match: { prefix: "/" }
                    route: { cluster: echo_service }
              http_filters:
              - name: envoy.grpc_web
                typed_config:
                  "@type": type.googleapis.com/envoy.extensions.filters.http.grpc_web.v3.GrpcWeb
              - name: envoy.filters.http.router
                typed_config:
                  "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router
      clusters:
      - name: echo_service
        connect_timeout: 0.25s
        type: LOGICAL_DNS
        typed_extension_protocol_options:
          envoy.extensions.upstreams.http.v3.HttpProtocolOptions:
            "@type": type.googleapis.com/envoy.extensions.upstreams.http.v3.HttpProtocolOptions
            explicit_http_config:
              http2_protocol_options: {}
        lb_policy: ROUND_ROBIN
        load_assignment:
          cluster_name: echo_service
          endpoints:
          - lb_endpoints:
            - endpoint:
                address:
                  socket_address:
                    address: node-server
                    port_value: 9090

    این تنظیمات شاید در نگاه اول پیچیده به نظر بیاد، ولی بیایید با هم بررسیش کنیم:

    • listeners: این بخش تعریف میکنه که Envoy روی چه آدرس و پورتی منتظر درخواست‌های ورودی باشه. اینجا روی پورت 8080 منتظر میمونه.
    • http_filters: اینجاست که جادو اتفاق میفته. ما دو تا فیلتر مهم داریم. یکی envoy.grpc_web که درخواست‌های gRPC-Web رو میشناسه و پردازش میکنه. دومی envoy.filters.http.router هست که درخواست رو به مقصد مناسبش هدایت میکنه.
    • clusters: این بخش تعریف میکنه که سرور بک‌اند ما کجاست. ما یک کلاستر به اسم echo_service تعریف کردیم که به آدرس node-server و پورت 9090 اشاره میکنه.

    پس سناریو اینطوریه: مرورگر یک درخواست gRPC-Web به پورت 8080 میفرستسه. Envoy این درخواست رو دریافت میکنه، با استفاده از فیلتر grpc_web اون رو ترجمه میکنه و به سرور gRPC بک‌اند ما که روی پورت 9090 قرار داره، ارسال میکنه. پاسخ سرور رو هم به همین ترتیب برعکس ترجمه میکنه و برای مرورگر میفرسته.

    گاهی اوقات لازمه یک سری تنظیمات مربوط به CORS هم اضافه کنید تا مرورگر اجازه داشته باشه محتوا رو از یک مبدا دیگه درخواست بده.

    مرحله ۴: تولید پیام‌های پروتوباف و کلاینت سرویس

    حالا وقتشه که از روی فایل echo.proto خودمون، کلاس‌های پیام جاوااسکریپتی رو تولید کنیم. این کار با یک دستور در ترمینال انجام میشه:

    protoc -I=$DIR echo.proto \
    --js_out=import_style=commonjs:$OUT_DIR
    • protoc: این همون کامپایلر پروتکل بافر هست.
    • -I=$DIR: به کامپایلر میگه فایل‌های .proto رو کجا پیدا کنه.
    • --js_out=import_style=commonjs:$OUT_DIR: این قسمت میگه که خروجی جاوااسکریپت بساز. import_style=commonjs باعث میشه که فایل‌های تولید شده از سیستم ماژول require() ی CommonJS استفاده کنن که در دنیای Node.js خیلی رایجه. $OUT_DIR هم پوشه خروجی رو مشخص میکنه.

    خب، این فقط کلاس‌های مربوط به پیام‌ها رو ساخت. ما به کدهای مربوط به کلاینت سرویس هم نیاز داریم. برای این کار، به یک پلاگین مخصوص برای protoc به اسم protoc-gen-grpc-web نیاز داریم.

    اول باید این پلاگین رو دانلود و نصب کنید. میتونید فایل باینری protoc رو از صفحه رسمی پروتکل بافر و پلاگین protoc-gen-grpc-web رو از صفحه گیت‌هاب gRPC-Web دانلود کنید. بعد باید مطمئن بشید که هر دوی این فایل‌ها اجرایی هستن و در PATH سیستم شما قرار دارن تا از هر جایی قابل دسترس باشن.

    یک راه دیگه برای نصب پلاگین اینه که از سورس کد کامپایلش کنید. برای این کار باید از ریشه مخزن gRPC-Web دستور زیر رو اجرا کنید:

    cd grpc-web
    sudo make install-plugin

    بعد از اینکه پلاگین آماده شد، با دستور زیر میتونیم کد کلاینت سرویس رو تولید کنیم:

    protoc -I=$DIR echo.proto \
    --grpc-web_out=import_style=commonjs,mode=grpcwebtext:$OUT_DIR

    این دستور خیلی شبیه دستور قبلیه، ولی از --grpc-web_out استفاده میکنه که مخصوص پلاگین ماست. بیایید پارامترهاش رو بررسی کنیم:

    • mode: این پارامتر میتونه grpcwebtext (که پیش‌فرض هست) یا grpcweb باشه. این دو حالت در نحوه کدگذاری داده‌ها تفاوت دارن که بعدا بیشتر در موردش صحبت میکنیم.
    • import_style: این پارامتر هم میتونه closure (که پیش‌فرض هست) یا commonjs باشه. ما از commonjs استفاده کردیم تا با خروجی قبلیمون هماهنگ باشه.

    این دستور به طور پیش‌فرض یک فایل به نام echo_grpc_web_pb.js تولید میکنه که شامل کد کلاینت ماست.

    مرحله ۵: نوشتن کد کلاینت جاوااسکریپت

    بالاخره رسیدیم به قسمت شیرین ماجرا. حالا آماده‌ایم که کد جاوااسکریپت سمت کلاینت رو بنویسیم. این کد رو در یک فایلی به نام client.js قرار میدیم.

    const {EchoRequest, EchoResponse} = require('./echo_pb.js');
    const {EchoServiceClient} = require('./echo_grpc_web_pb.js');
    
    var echoService = new EchoServiceClient('http://localhost:8080');
    
    var request = new EchoRequest();
    request.setMessage('Hello World!');
    
    echoService.echo(request, {}, function(err, response) {
      // اینجا میتونیم با پاسخ سرور کار کنیم
      // مثلا response.getMessage() رو چاپ کنیم
    });

    بیایید این کد رو با هم تحلیل کنیم:

    1. در دو خط اول، ما کلاس‌هایی که در مرحله قبل تولید کردیم (EchoRequest, EchoResponse, EchoServiceClient) رو با استفاده از require وارد برنامه‌مون میکنیم.
    2. بعد یک نمونه جدید از EchoServiceClient میسازیم و آدرس پراکسی Envoy خودمون (http://localhost:8080) رو بهش میدیم.
    3. یک نمونه جدید از EchoRequest میسازیم و پیام «Hello World!» رو داخلش قرار میدیم.
    4. در نهایت، متد echo رو روی سرویسمون فراخوانی میکنیم. به عنوان ورودی، درخواست (request)، یک آبجکت خالی برای متادیتا ({}) و یک تابع callback بهش میدیم. این تابع زمانی اجرا میشه که پاسخی از سرور دریافت بشه. این پاسخ میتونه خطا (err) یا جواب موفقیت‌آمیز (response) باشه.

    برای اینکه این کد کار کنه، به یک سری پکیج دیگه هم نیاز داریم. باید یک فایل package.json در پروژه‌مون داشته باشیم:

    {
      "name": "grpc-web-commonjs-example",
      "dependencies": {
        "google-protobuf": "^3.6.1",
        "grpc-web": "^0.4.0"
      },
      "devDependencies": {
        "browserify": "^16.2.2",
        "webpack": "^4.16.5",
        "webpack-cli": "^3.1.0"
      }
    }

    این فایل مشخص میکنه که پروژه ما به پکیج‌های google-protobuf و grpc-web نیاز داره. همچنین برای ساختن فایل نهایی برای مرورگر، از ابزارهایی مثل browserify یا webpack استفاده میکنیم.

    مرحله ۶: کامپایل کتابخانه جاوااسکریپت

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

    اول با دستور npm install پکیج‌های مورد نیاز رو نصب میکنیم.

    بعد با دستوری مثل این، فایل نهایی رو میسازیم:

    npx webpack client.js

    این دستور فایل client.js ما و تمام وابستگی‌هاش رو در یک فایل به نام main.js در پوشه dist قرار میده. حالا کافیه این فایل dist/main.js رو در صفحه HTML خودمون قرار بدیم و نتیجه رو ببینیم!

    یک راه سریع برای شروع

    اگر حوصله انجام تمام این مراحل رو به صورت دستی ندارید، یک راه سریع‌تر هم وجود داره. میتونید از مثال‌های آماده خود gRPC-Web استفاده کنید:

    $ git clone https://github.com/grpc/grpc-web
    $ cd grpc-web
    $ docker-compose up node-server envoy commonjs-client

    این دستورات با استفاده از داکر، همه چیز رو براتون آماده میکنه: سرور نود جی‌اس، پراکسی Envoy و یک کلاینت نمونه. بعد کافیه مرورگر خودتون رو باز کنید و به آدرس http://localhost:8081/echotest.html برید تا همه چیز رو در عمل ببینید.

    نگاهی عمیق‌تر به ویژگی‌ها و گزینه‌ها

    حالا که با اصول اولیه آشنا شدیم، بیایید کمی جزئی‌تر به گزینه‌هایی که در اختیار داریم نگاه کنیم.

    انواع RPC و پشتیبانی در gRPC-Web

    gRPC در حالت کلی چهار نوع متد یا RPC رو پشتیبانی میکنه:

    1. Unary RPCs: یک درخواست میفرستی و یک پاسخ میگیری. مثل همین مثال Echo ما.
    2. Server-side Streaming RPCs: یک درخواست میفرستی و یک جریان از پاسخ‌ها رو به صورت پشت سر هم دریافت میکنی.
    3. Client-side Streaming RPCs: یک جریان از درخواست‌ها رو میفرستی و در نهایت یک پاسخ میگیری.
    4. Bi-directional Streaming RPCs: یک جریان دوطرفه از درخواست‌ها و پاسخ‌ها به صورت همزمان داری.

    gRPC-Web در حال حاضر فقط از دو نوع اول پشتیبانی میکنه. یعنی Unary RPC و Server-side Streaming RPC. استریمینگ سمت کلاینت و دوطرفه فعلا پشتیبانی نمیشن. البته برای استریمینگ سمت سرور هم یک شرط وجود داره: باید حتما از حالت grpcwebtext استفاده کنید.

    حالت‌های مختلف انتقال داده (mode)

    وقتی داشتیم کد کلاینت رو تولید میکردیم، یک پارامتر به اسم mode دیدیم. این پارامتر دو تا مقدار میتونه داشته باشه:

    • mode=grpcwebtext: این حالت پیش‌فرض هست.
      • Content-type درخواست میشه application/grpc-web-text.
      • داده‌ها یا همون payload به صورت base64 کدگذاری میشن. این یعنی داده‌های باینری به فرمت متنی تبدیل میشن.
      • هم از Unary و هم از Server-side streaming پشتیبانی میکنه.
    • mode=grpcweb: این حالت از فرمت باینری پروتوباف استفاده میکنه.
      • Content-type درخواست میشه application/grpc-web+proto.
      • داده‌ها به صورت باینری و خام پروتوباف فرستاده میشن. این حالت معمولا بهینه‌تر و کم‌حجم‌تره.
      • فقط از Unary call پشتیبانی میکنه. استریمینگ سمت سرور در این حالت کار نمیکنه.

    استایل‌های مختلف ایمپورت (import_style)

    یک پارامتر دیگه هم به اسم import_style داشتیم. این پارامتر نحوه وارد کردن ماژول‌ها در کد تولید شده رو مشخص میکنه:

    • import_style=closure: این حالت پیش‌فرض هست و از سیستم ماژول goog.require() کتابخانه Closure گوگل استفاده میکنه.
    • import_style=commonjs: این حالت از require() ی CommonJS استفاده میکنه که برای کار با ابزارهایی مثل Webpack و Browserify خیلی مناسبه.
    • import_style=commonjs+dts: (آزمایشی) این حالت علاوه بر کد CommonJS، یک فایل تایپینگ .d.ts هم برای پیام‌های پروتوباف و کلاینت سرویس تولید میکنه. این برای کار با TypeScript خیلی مفیده.
    • import_style=typescript: (آزمایشی) این حالت مستقیما کد کلاینت سرویس رو به زبان TypeScript تولید میکنه.

    پشتیبانی از TypeScript

    خبر خوب برای طرفدارهای TypeScript اینه که gRPC-Web به صورت آزمایشی از این زبان پشتیبانی میکنه. حالا ماژول grpc-web رو میشه به عنوان یک ماژول TypeScript وارد کرد.

    برای استفاده از این قابلیت، باید موقع تولید کد از پلاگین protoc-gen-grpc-web، یکی از این دو گزینه رو بهش بدید:

    • import_style=commonjs+dts: کد CommonJS به همراه فایل‌های تایپینگ .d.ts تولید میکنه.
    • import_style=typescript: کد کاملا TypeScript تولید میکنه.

    یک نکته خیلی مهم: شما نباید import_style=typescript رو برای فلگ --js_out استفاده کنید. این فلگ فقط باید روی import_style=commonjs تنظیم بشه. در واقع --js_out کد جاوااسکریپت پیام‌ها (echo_pb.js) رو تولید میکنه و --grpc-web_out فایل‌های TypeScript مربوط به سرویس (EchoServiceClientPb.ts) و تایپینگ پیام‌ها (echo_pb.d.ts) رو میسازه. این یک راه حل موقتیه تا زمانی که خود --js_out به صورت کامل از TypeScript پشتیبانی کنه.

    پس دستور کامل برای تولید کد TypeScript با فرمت باینری این شکلی میشه:

    protoc -I=$DIR echo.proto \
    --js_out=import_style=commonjs,binary:$OUT_DIR \
    --grpc-web_out=import_style=typescript,mode=grpcweb:$OUT_DIR

    و کد سمت کلاینت در TypeScript میتونه این شکلی باشه:

    import * as grpcWeb from 'grpc-web';
    import {EchoServiceClient} from './EchoServiceClientPb';
    import {EchoRequest, EchoResponse} from './echo_pb';
    
    const echoService = new EchoServiceClient('http://localhost:8080', null, null);
    
    const request = new EchoRequest();
    request.setMessage('Hello World!');
    
    const call = echoService.echo(request, {'custom-header-1': 'value1'},
      (err: grpcWeb.RpcError, response: EchoResponse) => {
        if (err) {
          console.log(`Received error: ${err.code}, ${err.message}`);
        } else {
          console.log(response.getMessage());
        }
      });
    
    call.on('status', (status: grpcWeb.Status) => {
      // ...
    });

    همونطور که میبینید، همه چیز تایپ-سیف و مشخصه.

    کلاینت مبتنی بر Promise

    علاوه بر مدل callback که دیدیم، میتونید از یک کلاینت مبتنی بر Promise هم استفاده کنید. این مدل کدنویسی برای خیلی‌ها خواناتر و مدرن‌تره.

    // Create a Promise client instead
    const echoService = new EchoServicePromiseClient('http://localhost:8080', null, null);
    
    // ... (request is the same as above)
    
    echoService.echo(request, {'custom--header-1': 'value1'})
      .then((response: EchoResponse) => {
        console.log(`Received response: ${response.getMessage()}`);
      }).catch((err: grpcWeb.RpcError) => {
        console.log(`Received error: ${err.code}, ${err.message}`);
      });

    فقط یک نکته مهم رو در نظر داشته باشید: وقتی از Promise استفاده میکنید، دیگه نمیتونید به callback‌های .on(...) (مثلا برای metadata و status) دسترسی داشته باشید.

    تاریخچه و وضعیت فعلی gRPC در مرورگر

    جالبه بدونید که داستان gRPC در مرورگر چطور شروع شد. در تابستان ۲۰۱۶، یک تیم در گوگل و یک شرکت به نام Improbable به صورت مستقل از هم شروع به کار روی چیزی کردن که میشد اسمش رو گذاشت «gRPC برای مرورگر». خیلی زود از وجود هم باخبر شدن و با هم همکاری کردن تا یک مشخصات فنی یا «spec» برای این پروتکل جدید تعریف کنن.

    مشخصات فنی gRPC-Web

    همونطور که گفتیم، پیاده‌سازی کامل مشخصات gRPC مبتنی بر HTTP/2 در مرورگرها غیرممکنه. به خاطر همین، مشخصات gRPC-Web با در نظر گرفتن این محدودیت‌ها و با تعریف تفاوت‌هاش با gRPC اصلی نوشته شد. این تفاوت‌های کلیدی عبارتند از:

    • پشتیبانی از هر دو پروتکل HTTP/1.1 و HTTP/2.
    • ارسال هدرهای تریلر gRPC در انتهای بدنه درخواست/پاسخ.
    • الزامی بودن استفاده از یک پراکسی برای ترجمه بین درخواست‌های gRPC-Web و پاسخ‌های gRPC HTTP/2.

    دو پیاده‌سازی اصلی

    تیم‌های گوگل و Improbable هر کدوم پیاده‌سازی خودشون رو از این مشخصات ارائه دادن. این دو پیاده‌سازی در دو مخزن جداگانه قرار داشتن و برای مدتی با هم سازگار نبودن.

    • کلاینت Improbable:
      • با زبان TypeScript نوشته شده.
      • در npm با نام @improbable-eng/grpc-web موجوده.
      • یک پراکسی به زبان Go هم داره که هم به صورت پکیج و هم به صورت یک برنامه مستقل قابل استفاده است.
      • از هر دو Fetch و XHR برای ارسال درخواست‌ها استفاده میکنه و به صورت خودکار بر اساس قابلیت‌های مرورگر یکی رو انتخاب میکنه.
    • کلاینت Google:
      • با زبان جاوااسکریپت و با استفاده از کتابخانه Google Closure نوشته شده.
      • در npm با نام grpc-web موجوده.
      • در ابتدا با یک افزونه برای NGINX به عنوان پراکسی عرضه شد، ولی بعدا روی فیلتر HTTP پراکسی Envoy تمرکز کرد.
      • فقط از XHR برای ارسال درخواست‌ها استفاده میکنه.

    بیایید این دو رو در یک جدول با هم مقایسه کنیم:

    کلاینت / ویژگیروش انتقالUnaryاستریم سمت سروراستریم سمت کلاینت و دوطرفه
    ImprobableFetch/XHR✔️✔️❌ (با یک روش آزمایشی وب‌سوکت)
    Google (grpcwebtext)XHR✔️✔️
    Google (grpcweb)XHR✔️❌ (فقط در انتها نتیجه رو برمیگردونه)

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

    آینده و مسیر پیش رو

    در اکتبر ۲۰۱۸، پیاده‌سازی گوگل به نسخه ۱.۰ رسید و به صورت عمومی عرضه شد. تیم گوگل یک نقشه راه برای اهداف آینده منتشر کرده که شامل این موارد میشه:

    • یک فرمت کدگذاری پیام‌ها شبیه JSON ولی بهینه‌تر.
    • پراکسی‌های درون-فرایندی برای Node، پایتون، جاوا و غیره (تا نیاز به پراکسی جدا مثل Envoy کمتر بشه).
    • ادغام با فریمورک‌های محبوب مثل React، Angular و Vue.
    • استفاده از Fetch API برای استریمینگ بهینه‌تر از نظر حافظه.
    • پشتیبانی از استریمینگ دوطرفه.

    بعد از مذاکرات بین دو تیم، تصمیم بر این شد که کلاینت گوگل و پراکسی Envoy به عنوان راه حل‌های پیشنهادی برای کاربران جدید معرفی بشن. کلاینت و پراکسی Improbable به عنوان پیاده‌سازی‌های جایگزین و آزمایشی باقی میمونن.

    پس اگه امروز میخواید با gRPC-Web شروع کنید، بهترین گزینه کلاینت گوگل هست. این کلاینت تضمین‌های سازگاری API قوی‌ای داره و توسط یک تیم اختصاصی پشتیبانی میشه.

    مزایای استفاده از gRPC-Web

    حالا که با جزئیات فنی آشنا شدیم، بیایید یک بار دیگه مزایای معماری gRPC-Web رو مرور کنیم.

    • gRPC سرتاسری (End-to-end gRPC): به شما اجازه میده کل خط لوله RPC خودتون رو با استفاده از پروتکل بافرها طراحی کنید. دیگه لازم نیست یک لایه اضافه برای تبدیل درخواست‌های HTTP/JSON به gRPC در بک‌اند داشته باشید.
    • هماهنگی بیشتر بین تیم‌های فرانت‌اند و بک‌اند: وقتی کل ارتباط با پروتکل بافر تعریف میشه، دیگه مرز بین تیم «کلاینت» و تیم‌های «میکروسرویس‌ها» کمرنگ‌تر میشه. ارتباط کلاینت-بک‌اند فقط یک لایه gRPC دیگه در کنار بقیه لایه‌هاست.
    • تولید آسان کتابخانه‌های کلاینت: وقتی سروری که با دنیای بیرون در ارتباطه، یک سرور gRPC باشه، تولید کتابخانه‌های کلاینت برای زبان‌های مختلف (روبی، پایتون، جاوا و …) خیلی راحت‌تر میشه و دیگه نیازی به نوشتن کلاینت‌های HTTP جداگانه برای هر کدوم نیست.

    دیدگاه دنیای واقعی: gRPC-Web در مقابل REST

    جالبه بدونید که همیشه همه با یک تکنولوژی موافق نیستن. در یک بحث در وبسایت ردیت، یک مهندس ارشد پیشنهاد کرده بود که تیمشون از gRPC-Web به سمت استفاده از REST Handler‌های معمولی حرکت کنه. دلیل این پیشنهاد این بود که در یک استارتاپ که سرعت توسعه و رسیدن به بازار اولویت داره، این کار میتونه مفید باشه.

    نگرانی‌هایی که در مورد این تغییر مطرح شده بود اینها بودن:

    • از دست دادن یک تعریف نوع (type definition) یکپارچه که پروتوباف فراهم میکنه.
    • نیاز به ابداع مجدد چرخ و نوشتن کدهای تکراری.
    • نیاز به ارتباط و مستندسازی بیشتر بین تیم‌ها.

    در مقابل، تنها مزیت مسیر HTTP/REST این عنوان شده بود که درک و فهم اون برای بعضی‌ها ساده‌تره. این بحث نشون میده که انتخاب بین این تکنولوژی‌ها همیشه یک سری بده‌بستان (trade-off) داره و به شرایط پروژه بستگی داره. هر دو روش، چه استفاده از پروتوباف برای تولید کلاینت gRPC-Web و چه استفاده از OpenAPI برای تولید کلاینت REST، در سطح بالا یک هدف مشترک دارن: تولید خودکار کلاینت از روی یک تعریف مشخص.

    پرسش و پاسخ

    خب بچه‌ها، بحث ما تقریبا تموم شد. برای اینکه مطمئن بشیم همه چیز خوب جا افتاده، بیایید چند تا سوال مهم رو با هم مرور کنیم.

    1. سوال ۱: gRPC دقیقا چیه؟

    جواب: gRPC یک چارچوب RPC (Remote Procedure Call) مدرن، متن‌باز و با کارایی بالاست که توسط گوگل ساخته شده. به زبان ساده، یک روش خیلی سریع و بهینه برای اینه که سرویس‌های مختلف در یک سیستم کامپیوتری بتونن با هم صحبت کنن و از هم سرویس بگیرن، حتی اگه در کامپیوترهای مختلف و با زبان‌های برنامه‌نویسی متفاوتی نوشته شده باشن. این چارچوب از پروتکل HTTP/2 برای انتقال داده استفاده میکنه.

    1. سوال ۲: چرا نمیتونیم مستقیم از gRPC توی مرورگر استفاده کنیم و به gRPC-Web نیاز داریم؟

    جواب: چون gRPC روی ویژگی‌های سطح پایین پروتکل HTTP/2 ساخته شده. مرورگرهای وب امروزی به برنامه‌نویس‌ها اجازه دسترسی و کنترل مستقیم روی این ویژگی‌ها رو نمیدن. برای همین، یک «پل» یا «مترجم» به اسم gRPC-Web ساخته شده که یک پروتکل کمی متفاوت و سازگار با محدودیت‌های مرورگر داره. این پروتکل بعدا توسط یک پراکسی (مثل Envoy) به gRPC استاندارد ترجمه میشه.

    1. سوال ۳: فایل .proto چیه و چه نقشی داره؟

    جواب: فایل .proto که بهش فایل پروتکل بافر هم میگن، یک فایل متنیه که شما در اون ساختار داده‌ها و سرویس‌های خودتون رو تعریف میکنید. این فایل مثل یک «قرارداد» یا «نقشه» بین کلاینت و سرور عمل میکنه. شما پیام‌های درخواست، پیام‌های پاسخ و متدهای سرویس رو در این فایل تعریف میکنید. بعد با استفاده از کامپایلر پروتکل بافر (protoc)، میتونید از روی این فایل، کد مربوط به کلاینت و سرور رو به زبان‌های مختلف تولید کنید.

    1. سوال ۴: پراکسی Envoy چیه و چرا در معماری gRPC-Web مهمه؟

    جواب: Envoy یک پراکسی سرویس مدرن و با کارایی بالاست. در دنیای gRPC-Web، نقش یک مترجم رو بازی میکنه. درخواست‌هایی که از مرورگر با پروتکل gRPC-Web میان رو دریافت میکنه، اونها رو به پروتکل استاندارد gRPC (که روی HTTP/2 کار میکنه) تبدیل میکنه و به سرور بک‌اند میفرسته. پاسخ سرور رو هم به همین ترتیب برعکس ترجمه میکنه و برای مرورگر میفرسته. بدون وجود یک پراکسی مثل Envoy، ارتباط مستقیم بین مرورگر و سرور gRPC ممکن نیست. البته پراکسی‌های دیگه‌ای مثل پراکسی Go، Apache APISIX و Nginx هم این قابلیت رو دارن.

    1. سوال ۵: تفاوت اصلی بین دو حالت mode=grpcwebtext و mode=grpcweb چیه؟

    جواب: تفاوت اصلی در نحوه کدگذاری و انتقال داده‌هاست.

    • grpcwebtext داده‌ها رو به صورت متنی (Base64) کدگذاری میکنه و هم از درخواست‌های تکی (Unary) و هم از استریمینگ سمت سرور پشتیبانی میکنه.
    • grpcweb داده‌ها رو به صورت باینری و خام پروتوباف منتقل میکنه که بهینه‌تره، ولی فقط از درخواست‌های تکی (Unary) پشتیبانی میکنه.
    1. سوال ۶: آیا میتونم از gRPC-Web برای آپلود فایل یا چت دوطرفه استفاده کنم؟

    جواب: در حال حاضر، خیر. gRPC-Web از استریمینگ سمت کلاینت و استریمینگ دوطرفه پشتیبانی نمیکنه. این قابلیت‌ها در نقشه راه پروژه قرار دارن ولی هنوز پیاده‌سازی نشدن. پس برای کارهایی مثل آپلود فایل (که نیاز به استریم سمت کلاینت داره) یا یک اپلیکیشن چت زنده (که نیاز به استریم دوطرفه داره)، gRPC-Web فعلا راه حل کاملی نیست.

    منابع

    • [2] What Are gRPC & gRPC Web. Basics of Hacking Into gRPC-Web | by Amin Nasiri | Medium
    • [4] The state of gRPC in the browser | gRPC
    • [6] GitHub – grpc/grpc-web: gRPC for Web Clients
    • [8] My backfill Principal Engineer wants to move off of GRPC web and start using REST Handlers. Will this be a shit show? : r/golang
    • [10] gRPC vs. gRPC-Web: Key Differences Explained
    • [1] grpc-web – npm
    • [3] Use gRPC in browser apps | Microsoft Learn
    • [5] Go and gRPC is just so intuitive. Here’s a detailed full-stack flow with gRPC-Web, Go and React. Also, there is a medium story focused on explaining how such a setup might boost efficiency and the step-by-step implementation. : r/golang
    • [7] gRPC-Web is Generally Available | gRPC
    • [9] Basics tutorial | Web | gRPC
  • بلوتوث کم‌مصرف (BLE)؛ راهنمای تکنولوژی اینترنت اشیا

    تکنولوژی BLE که اولین بار سال ۲۰۱۲ معرفی شد، یک پروتکل خیلی انعطاف‌پذیره که برای خیلی از کاربردهای مهم اینترنت اشیا، ارتباط بی‌سیم فراهم میکنه. تمرکز اصلیش روی کار کردن با مصرف انرژی فوق‌العاده پایینه و همین باعث شده تو صنایع مختلفی مثل لوازم الکترونیکی مصرفی، بهداشت و درمان و حتی لجستیک و انبارداری ازش استفاده بشه. امروز میخوایم تمام نکات پایه‌ای BLE رو با هم یاد بگیریم تا شما هم بتونید برای پروژه‌های بعدیتون ازش استفاده کنید و سهمی از این بازار بزرگ ۳۸۴ میلیارد دلاری اینترنت اشیا داشته باشید.

    داستان بلوتوث از کجا شروع شد؟

    قبل از اینکه بریم تو دنیای BLE، بهتره یه نگاهی به پدرش یعنی همون بلوتوث معمولی بندازیم. مشخصات فنی بلوتوث از دهه ۹۰ میلادی وجود داشته. هدف اصلی از طراحی این پروتکل این بود که جای کابل‌ها رو برای انتقال داده بین دستگاه‌ها تو فاصله‌های کوتاه بگیره. جالبه که امروز هم اصلی‌ترین کاربردش همینه.

    بلوتوث یک تکنولوژی بی‌سیم با برد کوتاهه که تو باند فرکانسی ۲.۴ گیگاهرتز ISM کار میکنه. این باند فرکانسی برای استفاده عموم آزاده و نیازی به مجوز نداره. کارش هم انتقال داده و ساختن شبکه‌های شخصی کوچیک (PAN) هست.

    احتمالا همین الان دور و بر همه‌مون کلی دستگاه بلوتوثی هست: گوشی موبایل، لپ‌تاپ، هدفون و اسپیکر. جالبه بدونید که فقط تو سال ۲۰۲۱، بیشتر از ۴.۷ میلیارد دستگاه بلوتوثی تو کل دنیا تولید و عرضه شده. این نشون میده که بلوتوث یکی از پرکاربردترین تکنولوژی‌های دنیاست.

    اگه از مردم تو خیابون بپرسید بلوتوث چیه، اکثرشون یه شناخت کلی ازش دارن. اما پشت پرده، این یک استاندارد فنی نسبتا پیچیده‌ است که توسط یک گروه به اسم گروه علایق ویژه بلوتوث (Bluetooth Special Interest Group) یا به اختصار SIG مدیریت میشه. این گروه در طول سال‌ها، نسخه‌های مختلفی از مشخصات فنی بلوتوث رو منتشر کرده. دو تا از معروف‌ترین پروتکل‌های این استاندارد، «بلوتوث کلاسیک» و «بلوتوث کم‌مصرف» هستن.

    تا سال ۲۰۱۰، تمرکز اصلی روی بهتر کردن بلوتوث کلاسیک بود. اما تو همین سال، گروه SIG نسخه ۴.۰ بلوتوث رو منتشر کرد. این نسخه یک مسیر متفاوت رو در پیش گرفت و یک پروتکل جدید به اسم بلوتوث کم‌مصرف (BLE) رو به دنیا معرفی کرد.

    بلوتوث کم‌مصرف (BLE) دقیقا چیه؟

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

    ارتباط داده با رادیوی LE (که مخفف Low Energy هست) در بسته‌های کوچیک و کوتاه اتفاق میفته که لازم نیست خیلی پشت سر هم باشن. یک سناریوی معمولی برای BLE این شکلیه: دستگاه رادیوش رو برای مدت کوتاهی روشن میکنه، چند بایت یا چند کیلوبایت داده رو منتقل یا دریافت میکنه، و بعد دوباره رادیو رو خاموش میکنه و به حالت خواب (Sleep Mode) برمیگرده.

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

    مقایسه بلوتوث کلاسیک و بلوتوث کم‌مصرف (BLE)

    با اینکه این دو تا پروتکل شباهت‌های زیادی دارن، مثلا هر دو زیرمجموعه استاندارد بلوتوث هستن و هر دو تو باند فرکانسی ۲.۴ گیگاهرتز کار میکنن، اما دو تا پروتکل کاملا جدا و ناسازگار با هم هستن. یعنی یک دستگاه که فقط بلوتوث کلاسیک داره نمیتونه به یک دستگاه که فقط BLE داره وصل بشه.

    • بلوتوث کلاسیک برای انتقال حجم زیادی از داده طراحی شده، اما در عوض مصرف انرژیش هم بالاست. همون مثال گوش دادن به موسیقی با هدفون بی‌سیم رو در نظر بگیرید. این یک کاربرد کلاسیک برای بلوتوث کلاسیکه.
    • بلوتوث کم‌مصرف (BLE)، از طرف دیگه، برای کاربردهایی طراحی شده که نیازی به انتقال حجم بالای داده ندارن اما در عوض عمر باتری خیلی براشون مهمه. مثلا یک سنسور دما تو یک انبار بزرگ رو تصور کنید که میخواید نصبش کنید و برای ماه‌ها یا حتی سال‌ها دیگه بهش دست نزنید. برای چنین کاربردی، BLE انتخاب خیلی بهتریه.

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

    ویژگیبلوتوث کلاسیک (Classic Bluetooth)بلوتوث کم‌مصرف (BLE)
    هدف اصلیانتقال مداوم داده (مثل صدا)انتقال بسته‌های کوچک داده به صورت دوره‌ای
    مصرف انرژیبالابسیار پایین (تا ۱۰۰ برابر کمتر از کلاسیک)
    سرعت انتقال دادهبالاترپایین‌تر
    کاربرد اصلیهدفون، اسپیکر، انتقال فایلسنسورها، گجت‌های پوشیدنی، دستگاه‌های پزشکی
    حالت کاریهمیشه متصل و فعالبیشتر اوقات در حالت خواب، برای مدت کوتاه فعال

    چرا BLE اینقدر خوبه؟ (مزیت‌ها)

    تا اینجا فهمیدیم که BLE با فکر کردن به یک بازار خاص طراحی شده: بازار دستگاه‌هایی که نیاز به مصرف انرژی پایین و انتقال داده کم دارن. برای اینکه نیاز این بازار رو برآورده کنه، بلوتوث کم‌مصرف یک سری مزیت‌های مهم هم برای توسعه‌دهنده‌ها و هم برای مصرف‌کننده‌ها فراهم میکنه. بیایید چند تا از مهم‌ترین‌هاش رو ببینیم:

    • مصرف انرژی پایین: حتی وقتی با بقیه تکنولوژی‌های کم‌مصرف مقایسه‌اش میکنیم، BLE باز هم بهینه و کم‌مصرفه. راز این مصرف کم اینه که رادیوی دستگاه تا جای ممکن خاموش میمونه و فقط برای فرستادن مقدار کمی داده با سرعت پایین برای مدت کوتاهی روشن میشه.
    • هزینه پایین برای شروع توسعه: ماژول‌ها و چیپست‌های BLE در مقایسه با تکنولوژی‌های مشابه، قیمت پایین‌تری دارن. این به خاطر اینه که استفاده ازش خیلی زیاد شده و رقابت تو بازار بالا رفته.
    • دسترسی آزاد به مستندات فنی: برای بیشتر پروتکل‌ها و تکنولوژی‌های بی‌سیم دیگه، شما باید عضو رسمی اون گروه یا کنسرسیوم بشید تا بتونید به مشخصات فنیش دسترسی داشته باشید. عضویت تو این گروه‌ها میتونه خیلی گرون باشه (حتی تا هزاران دلار در سال). اما برای BLE، مستندات فنی نسخه‌های اصلی (مثل 4.0, 4.2, 5.0, 5.1, 5.2, 5.3 و غیره) رو میتونید به صورت رایگان از وب‌سایت Bluetooth.com دانلود کنید.
    • وجود گسترده در گوشی‌های هوشمند: این شاید بزرگترین مزیت BLE نسبت به رقباش مثل ZigBee، Z-Wave و Thread باشه. تقریبا همه مردم دنیا یک گوشی هوشمند دارن و تقریبا تمام این گوشی‌ها سخت‌افزار BLE رو داخلشون دارن. این به توسعه‌دهنده‌ها یک پایگاه کاربری بالقوه خیلی بزرگ برای اپلیکیشن‌هاشون میده.

    آیا BLE هیچ محدودیتی نداره؟

    به عنوان یک توسعه‌دهنده، فهمیدن محدودیت‌های یک تکنولوژی به اندازه فهمیدن مزیت‌هاش مهمه. اینطوری میتونید تصمیم بگیرید که آیا این تکنولوژی برای پروژه شما مناسبه یا نه. بیایید چند تا از مهم‌ترین محدودیت‌های BLE رو بررسی کنیم.

    • سرعت انتقال داده (Throughput): سرعت انتقال داده تو BLE توسط نرخ داده رادیوی فیزیکی محدود میشه. این نرخ به نسخه بلوتوثی که استفاده میشه بستگی داره.
      • برای نسخه‌های بلوتوث قبل از ۵.۰، این نرخ روی ۱ مگابیت بر ثانیه (Mbps) ثابته.
      • اما برای بلوتوث ۵.۰ و بالاتر، این نرخ بسته به حالت و لایه فیزیکی (PHY) که استفاده میشه، متغیره. میتونه مثل نسخه‌های قبلی ۱ مگابیت بر ثانیه باشه، یا وقتی از قابلیت سرعت بالا (high-speed) استفاده میشه به ۲ مگابیت بر ثانیه برسه.
      • وقتی هم از قابلیت برد بلند (long-range) استفاده میشه، این نرخ به ۵۰۰ یا ۱۲۵ کیلوبیت بر ثانیه (Kbps) کاهش پیدا میکنه.
      • نکته مهم: این نرخ‌ها مربوط به لایه رادیوییه. سرعتی که کاربر نهایی در سطح اپلیکیشن تجربه میکنه، خیلی کمتر از این حرف‌هاست.
    • برد (Range): تکنولوژی BLE برای کاربردهای با برد کوتاه طراحی شده، برای همین برد عملکردش محدوده. چند تا عامل روی برد BLE تاثیر میذارن:
      • فرکانس کاری: این تکنولوژی تو طیف فرکانسی ۲.۴ گیگاهرتز ISM کار میکنه که خیلی تحت تاثیر موانعی مثل اشیای فلزی، دیوارها و آب (مخصوصا بدن انسان) قرار میگیره.
      • طراحی آنتن: عملکرد و طراحی آنتن دستگاه BLE خیلی مهمه.
      • پوشش فیزیکی دستگاه: قاب و بدنه دستگاه روی عملکرد آنتن تاثیر میذاره، مخصوصا اگه آنتن داخلی باشه.
      • جهت‌گیری دستگاه: این مورد هم به موقعیت قرارگیری آنتن مربوط میشه (مثلا تو گوشی‌های هوشمند). به طور کلی برد BLE بین ۰ تا ۲۵ متر بهینه است و در شرایط ایده‌آل میتونه تا ۱۰۰ متر هم برسه.
    • نیاز به دروازه (Gateway) برای اتصال به اینترنت: برای اینکه داده رو از یک دستگاه که فقط BLE داره به اینترنت بفرستید، به یک دستگاه دیگه نیاز دارید که هم BLE داشته باشه و هم به اینترنت وصل باشه (مثلا یک گوشی هوشمند یا یک دستگاه مخصوص). این دستگاه واسط، داده رو از دستگاه BLE میگیره و بعد به اینترنت منتقل میکنه.

    BLE رو کجاها میبینیم؟ (کاربردهای واقعی)

    وقتی BLE تو سال ۲۰۱۰ معرفی شد، تمرکزش بیشتر روی کاربردهای اینترنت اشیا (IoT) بود که تو اونها حجم کمی از داده با سرعت پایین منتقل میشه. تو این ده سال اخیر، BLE تو کاربردهای خیلی متنوعی از دستگاه‌های مصرفی گرفته تا تولیدات صنعتی استفاده شده. بیایید چند تا از رایج‌ترین کاربردهاش رو ببینیم:

    • اتوماسیون خانگی: بخش بزرگی از بازار خانه هوشمند به لطف استفاده از بلوتوث LE ممکن شده. این تکنولوژی به دستگاه‌هایی مثل لامپ‌های هوشمند، ترموستات‌های هوشمند، قفل‌های هوشمند و سنسورهایی که دود یا باز بودن پنجره رو تشخیص میدن، اجازه میده با هم ارتباط برقرار کنن.
    • ردیاب‌های تناسب اندام: خیلی از ما ساعت‌های هوشمند یا مچ‌بندهای سلامتی داریم که ضربان قلب، تعداد قدم‌ها و چیزای دیگه رو ردیابی میکنن. این دستگاه‌های سلامتی و ردیاب فعالیت، با استفاده از BLE با اپلیکیشن‌های روی گوشیمون ارتباط برقرار میکنن. این انتقال‌های کوتاه و سریع داده در فاصله نزدیک، یک مثال عالی برای کاربرد BLE هست.
    • دستگاه‌های صوتی: همه ما با هدفون‌های بلوتوثی آشناییم، اما معمولا این دستگاه‌ها از بلوتوث کلاسیک استفاده میکنن. یکی از جدیدترین پیشرفت‌ها در زمینه بلوتوث کم‌مصرف، چیزی به اسم LE Audio هست. این استاندارد جدید چندین مزیت نسبت به بلوتوث سنتی داره، از جمله کیفیت صدای بهتر، مصرف انرژی کمتر و پشتیبانی از سمعک‌ها.
    • ردیابی تماس (Contact Tracing): سیستم‌های هوشمند ردیابی تماس دارن برای کمک به جلوگیری از شیوع بیماری‌های عفونی استفاده میشن. به جای گزارش‌دهی دستی، ردیابی تماس با استفاده از BLE به صورت مداوم «تگ»های BLE یا گوشی‌های هوشمند اطراف رو اسکن میکنه تا به صورت ناشناس تماس‌های نزدیک بین افراد رو ثبت کنه. مثلا در یک محیط کاری، به هر کارمند یک تگ BLE داده میشه و اگه یک نفر بیمار بشه، به راحتی میشه فهمید چه کسانی با اون در تماس نزدیک بودن.
    • تگ‌های پیدا کردن اشیا: با شلوغ شدن سفرها، بعضی‌ها تگ‌هایی مثل AirTag یا Tile رو به چمدونشون وصل میکنن تا اگه گم شد بتونن پیداش کنن. این دستگاه‌های ردیاب دقیق که با BLE کار میکنن، فقط برای چمدون نیستن. میتونید اونها رو به هر چیزی که فکر میکنید ممکنه گم بشه وصل کنید، مثل دوچرخه یا کلید ماشین، و موقعیتش رو از طریق یک اپلیکیشن روی گوشی پیدا کنید.
    • تبلیغات هدفمند: تصور کنید تو یک فروشگاه لباس هستید و یهو یک نوتیفیکیشن روی گوشیتون میاد که یک کوپن تخفیف برای همون فروشگاهی که توش هستید بهتون میده. این نوع تبلیغات شخصی‌سازی شده و مبتنی بر مکان، دقیقا کاریه که تبلیغ‌کننده‌ها و صاحبان فروشگاه‌ها میتونن انجام بدن. این کار به لطف پیشرفت‌های بلوتوث ۵.۰ و تکنولوژی پخش همگانی «بیکن»های بلوتوثی ممکنه.
    • مدیریت انبار: مدیران انبارها دارن از راهکارهای مبتنی بر BLE برای ردیابی دما و رطوبت محموله‌های حساس، تشخیص افتادن بسته‌های شکننده و حتی پیدا کردن بهینه‌ترین مکان برای نگهداری دارایی‌ها در انبار استفاده میکنن. پتانسیل زیادی وجود داره که هوش مصنوعی و BLE با هم ترکیب بشن و یک زنجیره لجستیک واقعا هوشمند ایجاد کنن.
    • ایمنی کارکنان: تگ‌های BLE میتونن به روش‌های مختلفی به حفظ ایمنی کارکنان کمک کنن. مثلا دکمه‌های وحشت (Panic buttons) برای کارمندان بانک یا هتل که در معرض خطر هستن. این افراد میتونن با فشار دادن تگ BLE به صورت نامحسوس درخواست کمک کنن. یا سیستم‌های تشخیص سقوط (Fall detection) در سایت‌های ساختمانی یا خانه‌های سالمندان که به محض تشخیص سقوط، به صورت خودکار هشدار ارسال میکنن.

    بیکن‌های BLE (BLE Beacons)

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

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

    خب، حالا بریم سراغ بخش فنی ماجرا: معماری BLE

    پروتکل بلوتوث کم‌مصرف، حتی برای توسعه‌دهنده‌های باتجربه هم ساده نیست. برای اینکه سفر شما برای یادگیری توسعه BLE رو شروع کنیم، میخوایم معماری پروتکل بلوتوث LE رو به صورت کلی و لایه‌های مختلفش رو با هم بررسی کنیم.

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

    پشته پروتکل بلوتوث به طور کلی به سه بخش یا زیرسیستم اصلی تقسیم میشه: اپلیکیشن (Application)، میزبان (Host) و کنترلر (Controller). داخل هر کدوم از این بلوک‌ها، لایه‌های مشخصی وجود داره.

    لایه‌های پروتکل BLE

    اگه شما توسعه‌دهنده‌ای هستید که میخواید اپلیکیشن‌های BLE بنویسید، لازم نیست خیلی نگران لایه‌هایی که پایین‌تر از لایه مدیر امنیت (Security Manager) و پروتکل ویژگی (Attribute Protocol) هستن باشید. اما دونستن کلیات این لایه‌ها میتونه مفید باشه. بیایید یه نگاهی بهشون بندازیم.

    • لایه فیزیکی (Physical Layer – PHY):
      این لایه به رادیوی فیزیکی اشاره داره که برای ارتباط و مدوله/دمدوله کردن داده استفاده میشه. این لایه تو همون باند فرکانسی ISM (طیف ۲.۴ گیگاهرتز) کار میکنه.
    • لایه پیوند (Link Layer):
      این لایه با لایه فیزیکی (رادیو) در ارتباطه و برای لایه‌های بالاتر یک راه برای تعامل با رادیو فراهم میکنه. این لایه مسئول مدیریت وضعیت رادیو و همچنین الزامات زمانی برای پایبندی به مشخصات فنی بلوتوث کم‌مصرفه.
    • رابط کنترلر میزبان (Host Controller Interface – HCI):
      لایه HCI یک پروتکل استاندارد هست که توسط مشخصات بلوتوtoh تعریف شده و به لایه میزبان (Host) اجازه میده با لایه کنترلر (Controller) ارتباط برقرار کنه. این لایه‌ها میتونن روی چیپ‌های جداگانه باشن یا هر دو روی یک چیپ باشن.
    • پروتکل کنترل و تطبیق پیوند منطقی (L2CAP):
      لایه L2CAP مثل یک لایه تقسیم‌کننده پروتکل عمل میکنه. این لایه چندین پروتکل رو از لایه‌های بالاتر میگیره و اونها رو تو بسته‌های استاندارد BLE قرار میده. بعد این بسته‌ها رو به لایه‌های پایین‌تر میفرسته.
    • پروتکل ویژگی (Attribute Protocol – ATT):
      پروتکل ATT تعریف میکنه که یک سرور چطور داده‌هاش رو در اختیار یک کلاینت قرار میده و این داده‌ها چطور ساختاردهی شدن.
    • پروفایل ویژگی عمومی (Generic Attribute Profile – GATT):
      این لایه یکی از مهم‌ترین لایه‌ها برای توسعه‌دهنده‌هاست. GATT فرمت داده‌ای که توسط یک دستگاه BLE ارائه میشه رو تعریف میکنه. همچنین رویه‌های لازم برای دسترسی به این داده‌ها رو مشخص میکنه.

      تو GATT دو تا نقش اصلی وجود داره: سرور (Server) و کلاینت (Client).

      • سرور: دستگاهیه که داده‌هایی که کنترل میکنه یا در اختیار داره رو به بقیه نشون میده.

      • کلاینت: دستگاهیه که با سرور ارتباط برقرار میکنه تا داده‌های سرور رو بخونه یا رفتارش رو کنترل کنه.

      یادتون باشه که یک دستگاه BLE میتونه همزمان هم سرور باشه و هم کلاینت.

      برای فهمیدن GATT، باید با دو مفهوم کلیدی آشنا بشید: سرویس‌ها (Services) و مشخصه‌ها (Characteristics).


      • سرویس (Service): یک گروه از یک یا چند «ویژگی» (Attribute) هست. هدفش اینه که ویژگی‌های مرتبط که یک کارکرد خاص رو روی سرور انجام میدن، کنار هم جمع کنه. مثلا، «سرویس باتری» که توسط خود گروه SIG تعریف شده، شامل یک مشخصه به اسم «سطح باتری» هست.

      • مشخصه (Characteristic): همیشه بخشی از یک سرویسه و یک تیکه از اطلاعات یا داده رو نشون میده که سرور میخواد در اختیار کلاینت بذاره. مثلا، «مشخصه سطح باتری» میزان شارژ باقی‌مونده باتری رو نشون میده که کلاینت میتونه اون رو بخونه.

      در BLE، شش نوع عملیات روی مشخصه‌ها وجود داره:

      • دستورها (Commands)
      • درخواست‌ها (Requests)
      • پاسخ‌ها (Responses)
      • اعلان‌ها (Notifications)
      • نشانه‌ها (Indications)
      • تاییدها (Confirmations)
    • پروفایل دسترسی عمومی (Generic Access Profile – GAP):
      این هم یکی دیگه از لایه‌های بسیار مهم برای توسعه‌دهنده‌هاست. GAP یک چارچوب تعریف میکنه که میگه دستگاه‌های BLE چطور با هم تعامل کنن. این شامل موارد زیر میشه:

      • نقش‌های دستگاه‌های BLE

      • تبلیغات (Advertising) – (پخش همگانی، کشف، پارامترهای تبلیغ، داده تبلیغ)

      • برقراری ارتباط (Connection) – (شروع ارتباط، پذیرش ارتباط، پارامترهای ارتباط)

      • امنیت


      نقش‌های مختلف یک دستگاه BLE اینها هستن:



      • پخش‌کننده (Broadcaster): دستگاهی که تبلیغات (Advertisements) میفرسته اما بسته‌ای دریافت نمیکنه و اجازه اتصال هم به کسی نمیده. مثل یک بیکن.

      • ناظر (Observer): دستگاهی که به بسته‌های تبلیغاتی که بقیه میفرستن گوش میده اما با دستگاه تبلیغ‌کننده ارتباط برقرار نمیکنه.

      • مرکزی (Central): دستگاهی که دستگاه‌های تبلیغ‌کننده دیگه رو کشف میکنه و بهشون گوش میده. یک دستگاه مرکزی این قابلیت رو هم داره که به یک دستگاه تبلیغ‌کننده وصل بشه. معمولا گوشی‌های هوشمند یا کامپیوترها این نقش رو دارن.

      • پیرامونی (Peripheral): دستگاهی که تبلیغ میکنه و اتصال از دستگاه‌های مرکزی رو قبول میکنه. معمولا سنسورها، ساعت‌های هوشمند و دستگاه‌های کوچیک این نقش رو دارن.


      یادتون باشه که یک دستگاه میتونه همزمان چند تا نقش داشته باشه. مثلا گوشی هوشمند شما میتونه در نقش مرکزی باشه وقتی به ساعت هوشمندتون وصله، و همزمان در نقش پیرامونی باشه وقتی به کامپیوترتون وصله.


    ردیابی موقعیت با BLE

    یکی از جذاب‌ترین کاربردهای BLE، استفاده از اون برای ردیابی موقعیت در فضاهای داخلیه، جایی که GPS کار نمیکنه. این کار معمولا با دو روش انجام میشه: استفاده از سنسورها یا استفاده از بیکن‌ها.

    • موقعیت‌یابی با سنسورها: در این روش، سنسورهای BLE در مکان‌های ثابتی در یک فضای داخلی نصب میشن. این سنسورها به صورت غیرفعال به سیگنال‌های ارسالی از دستگاه‌های بلوتوثی مثل گوشی‌های هوشمند، تگ‌های ردیابی دارایی، بیکن‌ها و گجت‌های پوشیدنی گوش میدن. با توجه به قدرت سیگنال دریافتی (RSSI) از دستگاه فرستنده، موقعیت اون دستگاه تخمین زده میشه. این داده به یک سیستم موقعیت‌یاب داخلی (IPS) فرستاده میشه و اون سیستم با استفاده از الگوریتم‌های چندجانبه‌سازی (multilateration) موقعیت دقیق دستگاه رو محاسبه میکنه.
    • موقعیت‌یابی با بیکن‌ها: در این روش، بیکن‌ها در مکان‌های ثابت نصب میشن و به طور مداوم سیگنال‌هایی حاوی یک شناسه منحصر به فرد رو پخش میکنن. یک دستگاه مثل گوشی هوشمند که یک اپلیکیشن مخصوص روش نصب شده، وقتی در محدوده بیکن قرار میگیره، سیگنال رو دریافت میکنه. اگه دستگاه سیگنال حداقل سه بیکن رو دریافت کنه، میتونه با مقایسه قدرت سیگنال اونها، موقعیت خودش رو تخمین بزنه.

    دقت موقعیت‌یابی با BLE معمولا در حد چند متر (کمتر از ۵ متر در شرایط بهینه) هست. این دقت به اندازه تکنولوژی‌هایی مثل UWB (که دقت در حد سانتی‌متر داره) بالا نیست، اما برای خیلی از کاربردها کاملا کافیه و مزیت‌هایی مثل هزینه پایین و مصرف انرژی کم داره.

    آینده موقعیت‌یابی با BLE: با معرفی بلوتوث ۵.۱ و قابلیت جدیدش به اسم جهت‌یابی (Direction Finding)، قراره دقت موقعیت‌یابی با BLE به سطح زیر یک متر و حتی سانتی‌متر برسه. این قابلیت جدید به دستگاه‌ها اجازه میده نه تنها قدرت سیگنال، بلکه زاویه رسیدن سیگنال (Angle of Arrival – AoA) رو هم محاسبه کنن که باعث میشه موقعیت‌یابی خیلی دقیق‌تر بشه.

    پرسش و پاسخ‌های رایج در مورد BLE

    • سوال ۱: پس BLE همون بلوتوث معمولیه؟
      نه. با اینکه هر دو زیرمجموعه استاندارد بلوتوث هستن، اما دو تا پروتکل جدا و ناسازگار با هم هستن. بلوتوث کلاسیک برای انتقال مداوم داده مثل صدا طراحی شده و مصرف انرژی بالایی داره. BLE برای انتقال‌های کوتاه و کم‌حجم داده طراحی شده و مصرف انرژیش فوق‌العاده پایینه.
    • سوال ۲: چرا BLE برای اینترنت اشیا (IoT) اینقدر مهمه؟
      دو دلیل اصلی وجود داره: اول، مصرف انرژی خیلی پایینش که باعث میشه دستگاه‌های باتری‌خور بتونن برای ماه‌ها یا سال‌ها کار کنن. دوم، برای اکثر کاربردهای IoT مثل سنسورها، فقط لازمه حجم کمی از داده (مثلا فقط دمای فعلی) به صورت دوره‌ای ارسال بشه که BLE برای این کار کاملا بهینه است.
    • سوال ۳: BLE به زبان ساده چطور کار میکنه؟
      سه مرحله اصلی داره:
      1. تبلیغ (Advertising): دستگاه‌های پیرامونی (مثل یک سنسور) بسته‌های کوچیک داده رو به صورت مداوم پخش میکنن تا حضور خودشون رو اعلام کنن.
      2. اسکن (Scanning): دستگاه‌های مرکزی (مثل یک گوشی) به این بسته‌های تبلیغاتی گوش میدن تا دستگاه‌های اطراف رو پیدا کنن.
      3. اتصال (Connection): وقتی دستگاه مرکزی یک دستگاه پیرامونی رو پیدا کرد، میتونه بهش درخواست اتصال بده و بعد از اون، دو دستگاه میتونن داده رو به صورت دوطرفه رد و بدل کنن.
    • سوال ۴: نقش‌های مختلف دستگاه‌های BLE چی هستن؟
      چهار نقش اصلی وجود داره:
      • پیرامونی (Peripheral): دستگاهی که تبلیغ میکنه و منتظر اتصال میمونه (مثل ساعت هوشمند).
      • مرکزی (Central): دستگاهی که اسکن میکنه و اتصال رو برقرار میکنه (مثل گوشی موبایل).
      • پخش‌کننده (Broadcaster): دستگاهی که فقط تبلیغ میکنه و قابل اتصال نیست (مثل بیکن‌ها).
      • ناظر (Observer): دستگاهی که فقط به تبلیغات گوش میده و وصل نمیشه.
    • سوال ۵: چند تا مثال واقعی از کاربرد BLE میزنید؟
      حتما. ردیاب‌های تناسب اندام (مثل فیت‌بیت)، ساعت‌های هوشمند، تجهیزات پزشکی بی‌سیم (مثل مانیتورهای قند خون)، قفل‌های هوشمند در خانه، لامپ‌های هوشمند، تگ‌های پیدا کردن وسایل (مثل ایرتگ)، و سیستم‌های موقعیت‌یاب داخلی در فروشگاه‌ها و فرودگاه‌ها، همگی از BLE استفاده میکنن.

    منابع

    • [2] Bluetooth Low Energy (BLE) – Cisco Meraki Documentation
    • [4] Bluetooth RTLS: BLE Location Tracking & Positioning | Inpixon
    • [6] What is Medical BLE? | AiRISTA Blog
    • [8] BLE Scanner 4.0 on the App Store
    • [10] BLE Scanner (Connect & Notify) – Apps on Google Play
    • [1] BLE vs Bluetooth : r/embedded
    • [3] Bluetooth Low Energy (BLE): A Complete Guide
    • [5] Can someone explain BLE to me? (Bluetooth Modules) : r/embedded
    • [7] BLE | Bluetooth Low Energy – Why Everyone Is Using It?
    • [9] BLE (Bluetooth Low Energy): What Is BLE? | 7SIGNAL
  • Oblivious DNS over HTTPS (ODoH)؛ حریم خصوصی بیشتر در DNS

    وقتی شما می‌خواید یه سایتی مثل cloudflare.com رو باز کنید، کامپیوتر شما که آدرس عددی یا همون IP اون سایت رو بلد نیست. پس یه سوال از یه سرور مخصوص به اسم DNS Resolver می‌پرسه. این سوال اینه: «هی، آدرس cloudflare.com چنده؟». اون سرور هم جواب میده و کامپیوتر شما با اون آدرس به سایت وصل میشه.

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

    برای حل این مشکل، پروتکل‌هایی مثل DNS over HTTPS (DoH) و DNS over TLS (DoT) به وجود اومدن. کار اینا اینه که همون سوال و جواب‌ها رو رمزنگاری می‌کنن. اینجوری دیگه کسی وسط راه نمی‌تونه بفهمه شما چی می‌پرسید. خیلی هم عالیه و الان مرورگرهایی مثل فایرفاکس و سیستم‌عامل iOS ازش پشتیبانی می‌کنن.

    اما هنوز یه مسئله‌ای هست. با اینکه سوال شما رمزنگاری شده، ولی بالاخره به دست اون سرور DNS Resolver (مثلا سرور 1.1.1.1 کلاودفلر) می‌رسه. اون سرور برای اینکه بهتون جواب بده، باید سوال شما رو باز کنه. پس اون سرور هم IP شما رو می‌بینه و هم سوال شما رو. یعنی یه نهاد واحد (همون شرکت صاحب DNS Resolver) هنوز می‌تونه بفهمه که یک IP مشخص، دنبال چه سایت‌هایی بوده. درسته که شرکت‌هایی مثل کلاودفلر سیاست‌های حفظ حریم خصوصی سفت و سختی دارن و میگن این اطلاعات رو نگه نمی‌دارن، ولی بعضی‌ها ترجیح میدن به جای اعتماد به سیاست‌نامه‌ها، یه راهکار فنی داشته باشن که این امکان رو از پایه بگیره.

    ورود ODoH: راهکاری برای جدا کردن سوال از هویت

    اینجاست که Oblivious DNS over HTTPS (ODoH) وارد میدون میشه. ODoH یه استاندارد جدیده که مهندس‌هایی از شرکت‌های کلاودفلر، اپل و فستلی (Cloudflare, Apple, and Fastly) روی اون کار کردن. ایده اصلیش خیلی ساده‌ست: جدا کردن آدرس IP شما از سوالی که می‌پرسید، طوری که هیچ نهاد واحدی نتونه هر دو رو با هم ببینه.

    این پروتکل از اواخر سال ۲۰۲۰ توسط سرویس 1.1.1.1 کلاودفلر پشتیبانی میشه. حتی سرویس iCloud Private Relay اپل هم بر پایه ODoH کار می‌کنه و کلاودفلر یکی از شرکای اون‌هاست.

    ODoH چطوری کار می‌کنه؟

    برای اینکه ODoH کار کنه، دو تا بازیگر جدید بین شما (کلاینت) و اون سرور اصلی DNS (که بهش میگیم Resolver) اضافه میشن: یه پراکسی (Proxy) و یه هدف (Target).

    بذارید نقش هر کدوم رو توضیح بدم:

    1. کلاینت (Client): این همون دستگاه شماست (کامپیوتر، موبایل). قبل از اینکه سوال DNS رو بفرسته، اون رو با استفاده از کلید عمومیِ «هدف» رمزنگاری می‌کنه.
    2. پراکسی (Proxy): کلاینت شما اون بسته رمزنگاری شده رو مستقیم برای سرور DNS نمی‌فرسته. اول می‌فرستدش برای پراکسی. پراکسی مثل یه واسطه عمل می‌کنه. بسته رو از شما می‌گیره و برای «هدف» می‌فرسته. نکته مهم اینه که پراکسی هیچ دیدی به محتوای بسته شما نداره، چون رمزنگاری شده. پس نمی‌تونه سوال شما رو بخونه یا تغییرش بده. پراکسی فقط IP شما رو می‌بینه.
    3. هدف (Target): این همون سروریه که قراره به سوال شما جواب بده. بسته رمزنگاری شده رو از پراکسی تحویل می‌گیره. چون کلید خصوصی رو داره، می‌تونه بسته رو باز کنه و سوال شما رو بخونه. اما نکته مهم اینه که «هدف» دیگه IP اصلی شما رو نمی‌بینه! فقط IP پراکسی رو می‌بینه. بعد از اینکه جواب رو پیدا کرد، جواب رو هم رمزنگاری می‌کنه و پس می‌فرسته برای پراکسی.
    4. بازگشت جواب: پراکسی جواب رمزنگاری شده رو می‌گیره و برای شما می‌فرسته. شما هم با کلیدی که دارید، جواب رو باز می‌کنید.

    پس نتیجه چی میشه؟

    • پراکسی می‌دونه شما (IP شما) یه درخواستی داشتید، ولی نمی‌دونه درخواستتون چی بوده.
    • هدف می‌دونه یه درخواستی برای یه سایت مشخص اومده، ولی نمی‌دونه این درخواست از طرف کی بوده (فقط IP پراکسی رو می‌بینه).

    تا زمانی که پراکسی و هدف با هم تبانی نکنن و اطلاعاتشون رو به هم ندن، هیچ‌کس به تنهایی نمی‌تونه هم به هویت شما (IP) و هم به سوال DNS شما دسترسی داشته باشه. این یعنی حریم خصوصی شما با یه تضمین فنی حفظ میشه.

    نکته جالب اینه که کلاینت‌ها کنترل کامل روی انتخاب پراکسی و هدف دارن. یعنی شما می‌تونید هر پراکسی و هدفی که دوست دارید رو انتخاب کنید و هر وقت خواستید تغییرشون بدید.

    رمزنگاری اضافه و کلیدها از کجا میان؟

    شاید بپرسید مگه DoH خودش رمزنگاری HTTPS/TLS نداشت؟ پس این رمزنگاری اضافه برای چیه؟ سوال خوبیه. ببینید، ما اینجا دو تا اتصال TLS جدا داریم: یکی بین شما و پراکسی، و یکی بین پراکسی و هدف. اگه فقط به همون TLS اکتفا می‌کردیم، پراکسی وقتی بسته رو از شما می‌گرفت و می‌خواست برای هدف بفرسته، محتوای DNS شما براش مشخص میشد.

    برای همین ODoH یه لایه رمزنگاری اضافه از نوع کلید عمومی هیبریدی (Hybrid Public Key Encryption – HPKE) روی خود پیام DNS می‌کشه. این رمزنگاری سرتاسری بین شما و «هدف» انجام میشه و پراکسی رو کاملا دور می‌زنه.

    حالا سوال بعدی: شما کلید عمومیِ «هدف» رو از کجا پیدا می‌کنید؟ این کلید از طریق خود DNS به دست میاد. در یک رکورد خاص به اسم HTTPS resource record قرار می‌گیره و با استفاده از DNSSEC هم امنیتش تضمین میشه که کسی نتونه یه کلید جعلی به شما بده.

    شرکای ODoH چه کسانی هستن؟

    کلاودفلر برای راه‌اندازی این سرویس با چند تا شرکت پیشرو که به حریم خصوصی اهمیت میدن همکاری کرده. چون یکی از اجزای اصلی ODoH، پراکسیه، این شرکت‌ها به عنوان شرکای پراکسی فعالیت می‌کنن. بعضی از این شرکا عبارتند از: PCCW، SURF و Equinix.

    بیانیه‌هایی هم از طرف این شرکت‌ها منتشر شده:

    مایکل گلین از PCCW Global گفته: «ODoH یه مفهوم انقلابی جدیده که برای قرار دادن حریم خصوصی کاربر در مرکز همه چیز طراحی شده… این مدل برای اولین بار پراکسی کلاینت رو به طور کامل از رزولورها جدا می‌کنه».

    جوست ون دایک از SURF گفته: «ما با کلاودفلر برای پیاده‌سازی حریم خصوصی بهتر کاربر از طریق ODoH همکاری می‌کنیم. حرکت به سمت ODoH یک تغییر پارادایم واقعیه، جایی که حریم خصوصی یا آدرس IP کاربر در معرض دید هیچ ارائه‌دهنده‌ای قرار نمی‌گیره و منجر به حریم خصوصی واقعی میشه».

    آیا ODoH سرعت اینترنت رو کم می‌کنه؟

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

    • هزینه رمزنگاری اضافه: بررسی‌ها نشون داده که خود فرآیند رمزنگاری و رمزگشایی اضافه با HPKE خیلی ناچیزه. برای ۱۰ هزار دامنه مختلف این تست انجام شده و هزینه اضافه در صدک ۹۹ کمتر از ۱ میلی‌ثانیه بوده.
    • تاثیر کلی روی سرعت: برای اینکه تاثیر کلی رو بسنجن، اومدن زمان پاسخ به کوئری‌های DNS رو در سه حالت مقایسه کردن:
    1. DoH معمولی و مستقیم
    2. ODoH (با پراکسی)
    3. DoH روی شبکه Tor (به عنوان یه راهکار دیگه برای حفظ حریم خصوصی)

    نتایج روی یه نمودار توزیع تجمعی نشون داده شد. اگه بخوایم ساده بگیم، نتایج این بود:

    نوع اتصالزمان پاسخ در ۵۰٪ مواقع (میانه)
    DoH معمولیکمتر از ۱۴۶ میلی‌ثانیه
    ODoHکمتر از ۲۲۸ میلی‌ثانیه
    DoH روی Torخیلی بیشتر (در نمودار مشخصه که کندتره)

    این اعداد میگن که در نصف مواقع، استفاده از ODoH باعث یه تاخیر کمتر از ۱۰۰ میلی‌ثانیه نسبت به DoH معمولی میشه. در مقایسه با راهکارهای حفظ حریم خصوصی دیگه مثل Tor، سرعت ODoH خیلی بهتره و زمان پاسخ رو تقریبا نصف می‌کنه. این خیلی نکته مهمیه، چون معمولا بین حریم خصوصی و سرعت یه بده‌بستان وجود داره، ولی اینجا بهبود قابل توجهی دیده میشه.

    یه نکته جالب دیگه توی این اندازه‌گیری‌ها این بود که انتخاب پراکسی و هدف با کمترین تاخیر (latency)، همیشه بهترین نتیجه رو نمیده. حتی در مواردی انتخاب پراکسی با کمترین تاخیر، عملکرد رو بدتر کرده! البته این اندازه‌گیری‌ها بیشتر در آمریکای شمالی انجام شده و باید دید در سطح جهانی عملکرد چطور خواهد بود.

    نظرات و بحث‌های مختلف در مورد ODoH

    مثل هر تکنولوژی جدید دیگه‌ای، در مورد ODoH هم بحث‌ها و نظرات متفاوتی وجود داره. بعضی از کاربرها و متخصص‌ها توی فروم‌ها و شبکه‌های اجتماعی مثل ردیت (Reddit) دیدگاه‌های جالبی مطرح کردن:

    • نگرانی در مورد اعتماد: یه عده میگن که قبلا باید به ISP خودمون اعتماد می‌کردیم، بعد با DoH باید به یه شرکت سوم مثل کلاودفلر یا گوگل اعتماد می‌کردیم، و حالا با ODoH باید هم به کلاودفلر (به عنوان هدف) و هم به یه شرکت پراکسی مثل PCCW یا Equinix اعتماد کنیم که با هم تبانی نمی‌کنن. سوال اصلی اینه که «چه کسی از نگهبانان، نگهبانی می‌کنه؟» و چطور می‌تونیم مطمئن باشیم این شرکت‌ها با هم همکاری نمی‌کنن. یه کاربری گفته: «فکر کنم بیشتر به Quad9 اعتماد دارم تا به کلاودفلر به اضافه یه پراکسی از شرکتی که اسمش رو هم نشنیدم».
    • مشاهده ترافیک توسط ISP: یه دیدگاه خیلی مهم دیگه اینه که حتی اگه شما از ODoH استفاده کنید و سوال DNS شما مخفی بمونه، ISP شما هنوز می‌تونه ببینه که شما به چه آدرس IP وصل میشید. یعنی بعد از اینکه آدرس سایت رو به صورت مخفیانه گرفتید، برای وصل شدن به اون سایت، باید یه درخواست به IP اون بفرستید. این درخواست دیگه مخفی نیست و ISP شما می‌تونه با دیدن IP مقصد بفهمه شما دارید به کدوم سایت سر می‌زنید. پس ODoH جلوی جمع‌آوری اطلاعات توسط وب‌سایت مقصد یا ISP رو به طور کامل نمی‌گیره.
    • راهکار جایگزین: بعضی‌ها معتقدن یه راهکار خصوصی‌تر اینه که کلا شرکت‌های سوم رو حذف کنیم و خودمون یه Recursive Resolver راه‌اندازی کنیم (مثلا با استفاده از نرم‌افزارهایی مثل Unbound یا BIND). اینطوری دیگه اطلاعات DNS ما دست هیچ شرکتی نمیفته.
    • آیا می‌تونم پراکسی خودم رو داشته باشم؟ یه سوال جالب این بود که «آیا می‌تونم پراکسی ODoH خودم رو راه‌اندازی کنم؟». جواب این بود که از نظر فنی بله، ولی اگه فقط شما از اون پراکسی استفاده کنید، هدف اصلی که مخفی شدن بین کلی کاربر دیگه هست از بین میره و باز هم قابل ردیابی میشید.
    • ODoH به عنوان یک استاندارد نوظهور: بعضی کاربرها هم از دیدن گزینه ODoH در تنظیمات روترهای جدید مثل Flint 2 خوشحال و متعجب شدن، چون ODoH هنوز یه استاندارد خیلی جدیده و هنوز به صورت گسترده پیاده‌سازی نشده.

    چطور می‌تونیم ODoH رو امتحان کنیم؟

    کلاودفلر کدهای مربوط به ODoH رو به صورت متن‌باز (Open Source) منتشر کرده. هم پیاده‌سازی سمت سرور و هم سمت کلاینت در زبان‌های برنامه‌نویسی راست (Rust) و گو (Go) موجوده. این یعنی هر کسی می‌تونه خودش یه سرویس ODoH راه‌اندازی کنه یا با کلاینت‌های موجود اون رو تست کنه.

    سرور 1.1.1.1 کلاودفلر هم آماده دریافت کوئری‌های ODoH روی آدرس odoh.cloudflare-dns.com هست.

    حتی می‌تونید با یه دستور ساده مثل dig مشخصات و کلید عمومی سرویس ODoH کلاودفلر رو ببینید:

    dig -t type65 +dnssec @ns1.cloudflare.com odoh.cloudflare-dns.com

    علاوه بر این، ابزارهایی مثل dnscrypt-proxy هم از ODoH پشتیبانی می‌کنن و میشه از اون‌ها برای ارسال کوئری‌های ODoH استفاده کرد.

    جزئیات فنی بیشتر برای کنجکاوها (بر اساس RFC 9230 و مستندات فنی)

    اگه دوست دارید یه کم عمیق‌تر بشیم، بیاید به جزئیات فنی پروتکل نگاهی بندازیم. این بخش بر اساس سند رسمی RFC 9230 که ODoH رو تعریف می‌کنه و مستندات فنی دیگه هست.

    ساختار پروتکل

    • سه بازیگر اصلی: همونطور که گفتیم، سه طرف داریم:
      • Oblivious Client: کلاینتی که کوئری‌ها رو به هدف می‌فرسته، اما از طریق یه پراکسی.
      • Oblivious Proxy: یه سرور HTTP که کوئری‌ها و جواب‌های رمزنگاری شده رو بین کلاینت و هدف رد و بدل می‌کنه.
      • Oblivious Target: یه سرور HTTP که کوئری‌های رمزنگاری شده رو از پراکسی می‌گیره، اون‌ها رو باز می‌کنه و جواب‌های رمزنگاری شده رو برمی‌گردونه.
    • تبادل HTTP:
      • درخواست (Request): کلاینت یه درخواست HTTP POST به آدرس پراکسی می‌فرسته. هدر Content-Type این درخواست باید application/oblivious-dns-message باشه. آدرس هدف هم توی URL درخواست به صورت متغیرهایی به اسم targethost و targetpath قرار می‌گیره.
      • پاسخ (Response): هدف هم جواب رو با همین Content-Type برای پراکسی می‌فرسته و پراکسی هم بدون تغییر اون رو به کلاینت تحویل میده.
    • قالب پیام‌ها:
      • پیام‌های ODoH (هم سوال و هم جواب) یه ساختار مشخص دارن. یه بخش اصلی به اسم dns_message دارن که خود پیام DNS توشه و یه بخش padding که برای سخت‌تر کردن تحلیل ترافیک استفاده میشه.
      • این پیام بعد از رمزنگاری داخل یه ساختار دیگه قرار می‌گیره که شامل message_type (نوع پیام: سوال یا جواب)، key_id (شناسه کلید استفاده شده) و خود encrypted_message (پیام رمزنگاری شده) هست.

    پیکربندی و مدیریت کلیدها در سیستم‌های پیشرفته (مثل BIG-IP)

    شرکت‌هایی مثل F5 که تجهیزات شبکه تولید می‌کنن، امکان پیکربندی ODoH رو روی دستگاه‌هاشون فراهم کردن. مراحل کلی این پیکربندی به این صورته:

    1. ساخت پروفایل HPKE: اول باید یه پروفایل برای رمزنگاری HPKE بسازید و الگوریتم‌های رمزنگاری (KEM, KDF, AEAD) رو مشخص کنید.
    2. ساخت کلید HPKE: بعد یه کلید بر اساس اون پروفایل ساخته میشه. این کلیدها می‌تونن به صورت خودکار در بازه‌های زمانی مشخص (مثلا هر ۳۰ روز) عوض بشن (Rollover).
    3. تعریف هدف ODoH: یه سرور مجازی به عنوان «هدف» تعریف میشه که به درخواست‌های ODoH گوش میده.
    4. پیکربندی Listener و Wide IP: در نهایت Listener ها و رکوردهای DNS مربوطه (مثل SVCB/HTTPS) تنظیم میشن تا کلاینت‌ها بتونن کلید عمومی هدف رو پیدا کنن و درخواست‌هاشون رو بفرستن.

    این سیستم‌ها حتی پیام‌های خطا و لاگ‌های مشخصی برای ODoH دارن. مثلا اگه کلیدها با هم نخونن، خطای HTTP 401 برگردونده میشه یا اگه پیام قابل رمزگشایی نباشه، خطای 400 اتفاق میفته.


    پرسش و پاسخ

    حالا بریم سراغ چند تا سوال که ممکنه براتون پیش اومده باشه.

    سوال ۱: پس ODoH همون DoH هست که فقط یه واسطه (پراکسی) بهش اضافه شده؟

    نه دقیقا. علاوه بر اضافه شدن پراکسی، یه لایه رمزنگاری اضافه هم روی خود پیام DNS کشیده میشه (با استفاده از HPKE). این رمزنگاری اضافه خیلی مهمه، چون باعث میشه خود پراکسی هم نتونه محتوای درخواست شما رو ببینه. اگه این لایه اضافه نبود، پراکسی می‌تونست هم IP شما رو ببینه و هم درخواست شما رو، و کل هدف پروتکل از بین می‌رفت.

    سوال ۲: اگه ISP من هنوز می‌تونه ببینه به چه IP وصل میشم، پس فایده ODoH چیه؟

    این نکته خیلی مهمیه. ODoH از این جلوگیری می‌کنه که یک نهاد واحد (مثل یه شرکت ارائه دهنده DNS) بتونه یه پروفایل کامل از تاریخچه وب‌گردی شما بر اساس درخواست‌های DNS بسازه. درسته که ISP شما هنوز می‌بینه به چه IP هایی وصل میشید، ولی دیگه نمی‌تونه به راحتی و با نگاه کردن به لاگ‌های DNS، لیست تمام سایت‌هایی که شما حتی فقط اسمشون رو چک کردید (ولی شاید بهشون سر نزدید) رو در بیاره. ODoH یه لایه مهم به حریم خصوصی اضافه می‌کنه، ولی یه راهکار کامل برای ناشناس بودن در اینترنت نیست.

    سوال ۳: آیا ODoH کند نیست؟

    طبق اندازه‌گیری‌های اولیه، ODoH یه مقدار کمی تاخیر نسبت به DoH معمولی داره (حدود ۸۰ تا ۱۰۰ میلی‌ثانیه در نصف مواقع). ولی در مقایسه با راهکارهای حفظ حریم خصوصی دیگه مثل استفاده از شبکه Tor برای ارسال کوئری‌های DNS، خیلی سریع‌تره. پس یه بده‌بستان منطقی بین افزایش حریم خصوصی و یه مقدار کاهش سرعت وجود داره.

    سوال ۴: من باید به کی اعتماد کنم؟ به ISP خودم یا به کلاودفلر و یه شرکت پراکسی که نمی‌شناسم؟

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

    سوال ۵: آیا من می‌تونم همین الان از ODoH استفاده کنم؟

    بله. شما می‌تونید از نرم‌افزارهایی مثل dnscrypt-proxy استفاده کنید که از ODoH پشتیبانی می‌کنن. همچنین اگه از سرویس iCloud Private Relay اپل استفاده می‌کنید، شما در حال حاضر دارید از یه تکنولوژی مبتنی بر ODoH بهره می‌برید. با گذشت زمان، انتظار میره پشتیبانی از این پروتکل در سیستم‌عامل‌ها و مرورگرهای بیشتری به صورت پیش‌فرض فعال بشه.

    منابع

    • [2] Oblivious DNS over HTTPS · Cloudflare 1.1.1.1 docs
    • [4] RFC 9230 – Oblivious DNS over HTTPS
    • [6] Oblivious DNS: Plugging the Internet’s Biggest Privacy Hole – CITP Blog
    • [8] Oblivious DoH : Enhanced DNS Privacy
    • [10] Oblivious HTTP (OHTTP) explained | Mozilla Support
    • [1] Improving DNS Privacy with Oblivious DoH in 1.1.1.1
    • [3] Configuring Oblivious DNS Over HTTP (ODoH) protocol
    • [5] Cloudflare and Apple design a new privacy-friendly DNS protocol – Oblivious DNS-over-HTTPS (ODoH) : r/pihole
    • [7] Oblivious DNS | Proceedings of the 2019 Applied Networking Research Workshop
    • [9] Oblivious DNS (ODoH) – does it work? – Routers / VPN, DNS, Leaks – GL.iNet
  • پست‌گرس‌کیوال PostgreSQL چیست؟ راهنمای استفاده اولیه

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

    • پایگاه داده (Database): فکر کنین یه دفترچه یادداشت خیلی خیلی بزرگ و هوشمند دارین که میتونین اطلاعات رو خیلی مرتب و منظم توش ذخیره کنین. مثلا اطلاعات دانشجوهای یه دانشگاه، محصولات یه فروشگاه آنلاین، یا لیست آهنگ‌های یه اپلیکیشن موسیقی. به این دفترچه هوشمند میگن پایگاه داده. کارش اینه که اطلاعات رو نگه داره، بهمون اجازه بده توش جستجو کنیم، اطلاعات جدید اضافه کنیم یا اطلاعات قبلی رو تغییر بدیم.
    • سیستم مدیریت پایگاه داده (Database System): حالا اون نرم‌افزاری که به ما اجازه میده اون دفترچه هوشمند (پایگاه داده) رو بسازیم و مدیریتش کنیم، میشه سیستم مدیریت پایگاه داده. پست‌گرس‌کیوال دقیقا همین کار رو میکنه. یه جورایی مثل اون برنامه دفترچه یادداشت توی کامپیوتر یا گوشیتونه، ولی هزاران بار قوی‌تر و پیشرفته‌تر.
    • رابطه‌ای (Relational): این کلمه یعنی اطلاعات توی جدول‌های مختلفی ذخیره میشن که به هم ربط دارن. مثلا یه جدول داریم برای دانشجوها، یه جدول دیگه برای درس‌ها. بعد میتونیم بین این دوتا جدول یه رابطه برقرار کنیم تا مشخص بشه هر دانشجویی چه درس‌هایی رو برداشته. اینجوری همه چیز خیلی منظم و دسته‌بندی شده باقی میمونه.
    • شی‌گرا (Object-Relational): این یه ویژگی پیشرفته‌تره. یعنی پست‌گرس‌کیوال فقط به مدل رابطه‌ای محدود نیست و میتونه ساختارهای داده پیچیده‌تری رو هم مدیریت کنه. فعلا خیلی درگیر این قسمتش نشین، همینقدر بدونین که این ویژگی دستش رو برای کارهای پیچیده‌تر باز میذاره.
    • متن‌باز (Open Source): این یعنی کد اصلی برنامه پست‌گرس‌کیوال در دسترس همه هست. هر کسی میتونه اون رو ببینه، تغییر بده و حتی در بهتر شدنش کمک کنه. این باعث میشه یه جامعه بزرگ از متخصص‌ها در سراسر دنیا روی توسعه‌ش کار کنن و همیشه در حال پیشرفت باشه.

    این سیستم بیشتر از ۳۵ ساله که داره به صورت فعال توسعه داده میشه. این زمان طولانی باعث شده که به عنوان یه ابزار خیلی قابل اعتماد، پر از امکانات و با عملکرد خوب شناخته بشه. به خاطر همین متن‌باز بودنش، کلی اطلاعات و راهنمای رسمی برای نصب و استفاده ازش وجود داره. جامعه کاربری خیلی بزرگی هم داره که همیشه آماده کمک کردن هستن و میتونین از طریق اونها با طرز کارش آشنا بشین یا حتی فرصت‌های شغلی پیدا کنین.

    بخش دوم: سرور، کلاینت، اس‌کیوال؛ مفاهیم پایه رو یاد بگیریم

    وقتی برای اولین بار با ابزارهایی مثل پست‌گرس‌کیوال کار میکنین، یه سری کلمه‌ها مثل «سرور» مدام به چشمتون میخوره. یکی از کاربرها توی ردیت دقیقا همین سوال رو پرسیده بود که «این سرورهایی که توی pgAdmin (یه ابزار برای مدیریت پست‌گرس) میبینیم چی هستن؟» این سوال خیلی خوبیه، چون به قلب ماجرا میزنه.

    سرور چیه و چه ربطی به پایگاه داده داره؟

    بیایم با تعریف اصلی شروع کنیم.
    یک سرور (Server) میتونه یه قطعه سخت‌افزاری باشه (مثلا یه کامپیوتر خیلی قوی) یا یه نرم‌افزار که به بقیه برنامه‌ها یا دستگاه‌ها سرویس میده. به اون برنامه‌هایی که سرویس میگیرن میگن کلاینت (Client).

    حالا، سرور پایگاه داده (Database Server) یه سروره که یه برنامه پایگاه داده (مثل پست‌گرس‌کیوال) روش نصبه و داره سرویس‌های مربوط به پایگاه داده رو به بقیه برنامه‌ها ارائه میده.

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

    پس وقتی توی ابزاری مثل pgAdmin یه چیزی به اسم «Servers» میبینین، منظور همون اتصال به یک سرور پایگاه داده هست. شما میتونین از کامپیوتر خودتون به چندین سرور پایگاه داده مختلف وصل بشین. مثلا یکی ممکنه روی کامپیوتر خودتون نصب باشه برای تمرین (که بهش میگن سرور محلی یا Local Server) و یکی دیگه ممکنه یه کامپیوتر اون سر دنیا باشه که اطلاعات واقعی یه سایت روشه (سرور راه دور یا Remote Server).

    گاهی هم ممکنه ببینین کنار اسم سرور یه عدد نوشته شده، مثلا «PostgreSQL 13». این عدد معمولا به نسخه اون نرم‌افزار پست‌گرس‌کیوال که روی سرور نصبه اشاره داره.

    پست‌گرس‌کیوال زبانه یا سرور؟ قصه SQL چیه؟

    اینم یه سوال خیلی رایجه. خیلیا گیج میشن که فرق بین SQL و PostgreSQL چیه.
    بذارین اینطوری بگم:

    • SQL (Structured Query Language): این اسم یک زبانه. یه زبان استاندارد برای حرف زدن با پایگاه داده‌های رابطه‌ای. شما با استفاده از دستورهای این زبان، از پایگاه داده میخواین که یه کاری براتون انجام بده. مثلا «این اطلاعات رو بهم نشون بده» یا «این کاربر جدید رو اضافه کن».
    • PostgreSQL: این اسم یک نرم‌افزاره. یک سیستم مدیریت پایگاه داده. این نرم‌افزار زبان SQL رو میفهمه. شما دستورهای SQL رو بهش میدین و اون براتون اجراشون میکنه.

    پس پست‌گرس‌کیوال هم یک سروره (نرم‌افزاری که سرویس میده) و هم میشه گفت یه جورایی یه «زبانه» چون نسخه مخصوص به خودش از SQL رو پیاده‌سازی کرده.

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

    • Oracle
    • MySQL (که الان مال اوراکله)
    • MariaDB
    • Microsoft SQL Server
    • و البته PostgreSQL

    همه اینها زبان استاندارد SQL رو به عنوان پایه قبول دارن، ولی هر کدوم یه سری دستورها و ویژگی‌های مخصوص به خودشون رو هم اضافه کردن. مثل لهجه‌های مختلف یه زبان میمونه. هسته اصلی یکیه، ولی تو جزئیات تفاوت دارن. اگه بخوایم با نمودار ون تصور کنیم، یه دایره بزرگ هست به اسم SQL که دستورهای اصلی توشه، و بعد دایره‌های کوچیکتری برای هر کدوم از این نرم‌افزارها (PostgreSQL, MySQL, …) وجود داره که بخش زیادی‌شون با هم همپوشانی داره.

    یه نکته دیگه هم اینکه حواستون باشه اسم «SQL Server» که مال مایکروسافته رو با مفهوم کلی «سرور SQL» اشتباه نگیرین. اولی اسم یه محصول خاصه، دومی یه مفهوم کلی.

    دو نوع دستور مهم در SQL

    وقتی با کد SQL سر و کار دارین، خوبه که بدونین دستورهاش معمولا به دو دسته اصلی تقسیم میشن:

    1. DML (Data Manipulation Language): زبان دستکاری داده‌ها. این دستورها کارشون با خود داده‌هاست. یعنی داده‌ها رو «تغییر» میدن. مثلا:
      • INSERT: یه ردیف داده جدید اضافه میکنه.
      • UPDATE: داده‌های موجود رو به‌روز میکنه.
      • DELETE: داده‌ها رو حذف میکنه.
    2. DDL (Data Definition Language): زبان تعریف داده‌ها. این دستورها با ساختار پایگاه داده کار دارن. یعنی اون جدول‌ها و روابط بینشون رو «تعریف» یا «تغیبر» میدن. مثلا:
      • CREATE TABLE: یه جدول جدید میسازه.
      • ALTER TABLE: ساختار یه جدول موجود رو تغییر میده.
      • DROP TABLE: یه جدول رو کلا حذف میکنه.

    درک این تفاوت بهتون کمک میکنه که بهتر بفهمین هر دستور داره چیکار میکنه.

    بخش سوم: چطوری پست‌گرس‌کیوال رو نصب و راه‌اندازی کنیم؟

    خب، حالا که با مفاهیم اولیه آشنا شدیم، ببینیم چطوری میشه این نرم‌افزار رو روی کامپیوترمون داشته باشیم. راه‌های مختلفی برای این کار وجود داره.

    راه‌های مختلف برای دریافت پست‌گرس‌کیوال

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

    • بسته‌های آماده (Ready-to-use packages) یا نصب‌کننده‌ها (Installers): این ساده‌ترین راهه. برای سیستم‌عامل‌های مختلف مثل ویندوز، مک و توزیع‌های مختلف لینوکس، فایل‌های نصب آماده‌ای وجود داره که شما فقط دانلود و اجراشون میکنین و مراحل رو دنبال میکنین.
    • سورس کد (Source code archive): اگه خیلی حرفه‌ای هستین و دوست دارین خودتون نرم‌افزار رو از پایه بسازین (کامپایل کنین)، میتونین سورس کدش رو دانلود کنین. دستورالعمل‌های ساختنش هم توی راهنمای رسمیش هست. مخزن سورس کدش هم روی git.postgresql.org قرار داره.
    • نسخه‌های آزمایشی (Beta and release candidates): اگه دوست دارین ویژگی‌های جدیدی که هنوز به طور رسمی منتشر نشدن رو تست کنین، میتونین نسخه‌های بتا یا کاندیدای انتشار رو دانلود کنین. خیلی مهمه که بدونین این نسخه‌ها فقط برای تست هستن و نباید روی سیستم‌های واقعی و کاری ازشون استفاده کنین.

    پشته‌های نرم‌افزاری آماده

    گاهی اوقات شما برای راه‌اندازی یه وبسایت یا برنامه، فقط به پایگاه داده نیاز ندارین. به یه وب سرور (مثل آپاچی) و یه زبان برنامه‌نویسی (مثل PHP) هم احتیاج دارین. به مجموعه این نرم‌افزارها که با هم کار میکنن میگن «پشته» یا Stack.

    شرکتی به اسم BitNami پشته‌های آماده‌ای رو درست کرده که کار رو خیلی راحت میکنه. این پشته‌ها شامل این موارد هستن:

    • LAPP: لینوکس + آپاچی + پی‌اچ‌پی + پست‌گرس‌کیوال
    • MAPP: مک + آپاچی + پی‌اچ‌پی + پست‌گرس‌کیوال
    • WAPP: ویندوز + آپاچی + پی‌اچ‌پی + پست‌گرس‌کیوال

    با نصب این پشته‌ها، همه ابزارهای لازم برای شروع کار به صورت یکجا و هماهنگ با هم نصب میشن.

    نرم‌افزارهای جانبی و کاتالوگ

    دنیای پست‌گرس‌کیوال خیلی بزرگه و کلی نرم‌افزار دیگه هم وجود داره که باهاش کار میکنن ولی به صورت پیش‌فرض همراهش نیستن. توی سایت رسمی پست‌گرس‌کیوال یه بخشی به اسم «کاتالوگ نرم‌افزار» (Software Catalogue) وجود داره که لیست بزرگی از برنامه‌های تجاری و متن‌باز، رابط‌ها و افزونه‌های مختلف رو میتونین توش پیدا کنین. اگه خودتون هم محصولی ساختین که با پست‌گرس‌کیوال کار میکنه، میتونین با پر کردن یه فرم، اون رو به این کاتالوگ اضافه کنین.

    یک راه ساده برای تمرین: Docker

    اگه تازه دارین یاد میگیرین، شاید نخواین کلی نرم‌افزار روی سیستم‌عامل اصلیتون نصب کنین. اینجا ابزاری به اسم داکر (Docker) خیلی به درد میخوره. داکر به شما اجازه میده برنامه‌ها رو توی محیط‌های ایزوله‌ای به اسم «کانتینر» اجرا کنین. اینجوری میتونین یه پایگاه داده پست‌گرس‌کیوال رو خیلی سریع راه بندازین، باهاش تمرین کنین و بعد با یه دستور ساده همه چیز رو پاک کنین، بدون اینکه کامپیوترتون شلوغ بشه.

    مثلا با دستور زیر میشه یه کانتینر پست‌گرس نسخه ۱۳.۳ رو راه انداخت:

    docker run --rm -p 5432:5432 --name some-postgres-container-name -e POSTGRES_PASSWORD=mysecretpassword postgres:13.3

    بیاین این دستور رو با هم بررسی کنیم:

    • docker run: به داکر میگه یه کانتینر جدید رو اجرا کن.
    • --rm: میگه وقتی کارم با کانتینر تموم شد و متوقفش کردم، خودکار حذفش کن. این برای تمرین عالیه.
    • -p 5432:5432: این بخش مربوط به پورت‌هاست. میگه پورت 5432 کامپیوتر من رو به پورت 5432 داخل کانتینر وصل کن. پورت 5432 پورت استاندارد پست‌گرس‌کیواله.
    • --name some-postgres-container-name: یه اسم برای کانتینرمون انتخاب میکنیم.
    • -e POSTGRES_PASSWORD=mysecretpassword: یه متغیر محیطی به اسم POSTGRES_PASSWORD رو تنظیم میکنه و مقدارش رو برابر با mysecretpassword قرار میده. این پسورد کاربر اصلی پایگاه داده میشه.
    • postgres:13.3: اسم و نسخه ایمیجی که میخوایم از روش کانتینر رو بسازیم. اینجا یعنی ایمیج رسمی پست‌گرس با نسخه 13.3.

    یه نکته مهم اینه که همیشه سعی کنین نسخه مشخصی از ایمیج رو استفاده کنین (مثلا 13.3) و از latest استفاده نکنین، چون ممکنه در آینده آپدیت بشه و رفتارش تغییر کنه.

    بخش چهارم: وقتی اوضاع خراب میشه؛ آموزش عیب‌یابی (Troubleshooting)

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

    سناریو اول: «بعد از آپدیت، سیستم بالا نمیاد و میگه سرور پست‌گرس استارت نشد!»

    این مشکل برای یه کاربر سیستم‌عامل مانجارو لینوکس پیش اومده بود. کامپیوترش که برای کار ازش استفاده میکرد، بعد از یه آپدیت دیگه بالا نمیومد و روی لوگوی ASRock (مارک مادربوردش) گیر میکرد. پیام خطای اصلی این بود: Failed to start PostgreSQL database server (سرور پایگاه داده پست‌گرس‌کیوال شروع به کار نکرد).

    اینجا کاربر با کمک بقیه، شروع به تحقیق میکنه. اولین قدم اینه که ببینیم سیستم دقیقا داره چه خطاهایی میده. برای این کار از یه دستور به اسم journalctl استفاده میشه. این دستور، گزارش‌ها و رویدادهای سیستم (که بهشون میگن log) رو نشون میده.

    دستوری که استفاده شد این بود: journalctl -xep 0..3

    • journalctl: خود برنامه.
    • -x: اطلاعات بیشتری در مورد هر خطا میده.
    • -e: مستقیم میره به آخر گزارش‌ها که جدیدترین خطاها اونجا هستن.
    • -p 0..3: میگه فقط پیام‌هایی با اولویت بالا رو نشون بده (از ۰ تا ۳ که شامل Emergency, Alert, Critical, Error میشه).

    حالا بیاین با هم لاگ‌هایی که این دستور نشون داده رو بررسی کنیم. این لاگ‌ها خیلی طولانی و ترسناک به نظر میرسن، ولی اگه با دقت و حوصله بخونیمشون، سرنخ‌های خوبی بهمون میدن.

    کالبدشکافی لاگ‌های سیستم

    من بخش‌های مهم و تکراری لاگ رو براتون جدا کردم تا تحلیلشون کنیم.

    سرنخ اول: مشکلات مربوط به Firmware و Microcode

    Jun 01 12:43:27 user-pc kernel: [Firmware Bug]: TSC_DEADLINE disabled due to Errata; please update microcode to version: 0x3a (or later)
    • kernel: هسته اصلی سیستم‌عامل. این پیام از پایین‌ترین سطح نرم‌افزاری سیستم میاد.
    • Firmware Bug: یعنی یه باگ توی سفت‌افزار (نرم‌افزار سطح پایینی که روی سخت‌افزارها مثل CPU یا مادربورد اجرا میشه) وجود داره.
    • please update microcode: سیستم داره پیشنهاد میده که میکروکد سی‌پی‌یو رو آپدیت کنیم. میکروکد یه جورایی مثل یه آپدیت برای خود سی‌پی‌یو هست که بعضی از باگ‌هاش رو برطرف میکنه.

    نتیجه‌گیری اولیه:

    همین اول کار، سیستم داره بهمون میگه که یه مشکل سطح پایین سخت‌افزاری/نرم‌افزاری وجود داره. این خودش یه زنگ خطره.

    سرنخ دوم: پیدا نشدن ماژول‌های کرنل

    این خطا بارها و بارها توی لاگ‌ها تکرار شده:

    Jun 01 12:43:27 user-pc systemd-modules-load[337]: Failed to find module 'vboxdrv'
    Jun 01 12:43:27 user-pc systemd-modules-load[337]: Failed to find module 'vboxnetadp'
    Jun 01 12:43:27 user-pc systemd-modules-load[337]: Failed to find module 'vboxnetflt'
    Jun 01 14:59:29 user-pc systemd-modules-load[319]: Failed to find module 'nvidia'
    Jun 01 14:59:29 user-pc systemd-modules-load[319]: Failed to find module 'nvidia-drm'
    Jun 01 14:59:29 user-pc systemd-modules-load[319]: Failed to find module 'zfs'
    • systemd-modules-load: یه بخشی از سیستم‌عامل که مسئول بارگذاری ماژول‌های کرنله.
    • ماژول کرنل چیه؟ فکر کنین کرنل سیستم‌عامل مثل یه موتور ماشینه. ماژول‌ها مثل قطعات اضافی هستن که به این موتور وصل میشن تا کارهای خاصی رو انجام بدن. مثلا درایور کارت گرافیک، درایور کارت شبکه و… .
    • Failed to find module: یعنی سیستم نتونسته این ماژول‌ها رو پیدا و بارگذاری کنه.
    • vboxdrv, vboxnetadp, vboxnetflt: اینها مربوط به نرم‌افزار VirtualBox هستن که برای ساخت ماشین‌های مجازی استفاده میشه.
    • nvidia, nvidia-drm: اینها مربوط به درایور کارت گرافیک Nvidia هستن.
    • zfs: این مربوط به یه نوع سیستم فایل پیشرفته به اسم ZFS هست.

    نتیجه‌گیری دوم:

    به نظر میاد بعد از اون آپدیت، درایورهای مهمی مثل درایور کارت گرافیک و ابزارهای مجازی‌سازی به درستی نصب نشدن یا با نسخه جدید کرنل سازگار نیستن. این میتونه باعث بی‌ثباتی کل سیستم بشه.

    سرنخ سوم: خطاهای مربوط به حافظه و سخت‌افزار

    این خطا هم خیلی زیاد تکرار شده:

    Jun 01 12:43:44 user-pc kernel: EDAC sbridge: CPU SrcID #0, Ha #0, Channel #0 has DIMMs, but ECC is disabled
    Jun 01 12:43:44 user-pc kernel: EDAC sbridge: Couldn't find mci handler
    Jun 01 12:43:44 user-pc kernel: EDAC sbridge: Failed to register device with error -19.
    • EDAC (Error Detection and Correction): یه قابلیتی توی سخت‌افزارها برای پیدا کردن و تصحیح خطاهای حافظه.
    • ECC is disabled: یعنی حافظه ECC (که نوع خاصی از رم برای سرورهاست و قابلیت تصحیح خطا داره) غیرفعاله. این ممکنه برای یه کامپیوتر شخصی عادی باشه، ولی خود پیام خطا نشون میده که سیستم در حال بررسی عمیق سخت‌افزاره.
    • Failed to register device with error -19: این پیام خیلی کلیه ولی نشون میده که کرنل نتونسته یه قطعه سخت‌افزاری رو به درستی شناسایی و راه‌اندازی کنه.

    نتیجه‌گیری سوم:

    علاوه بر مشکلات درایور، به نظر میاد سیستم در ارتباط با بعضی از قطعات سخت‌افزاری هم مشکل داره.

    سرنخ چهارم: خطای نهایی پست‌گرس

    و بالاخره میرسیم به خطایی که کاربر از اول دیده بود:

    Jun 01 12:43:46 user-pc systemd[1]: Failed to start PostgreSQL database server.

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

    جمع‌بندی کارآگاهی سناریو اول:

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


    سناریو دوم: «نمیتونم به سرور وصل بشم، میگه همچین فایلی وجود نداره!»

    این یکی مشکل رایج‌تریه و معمولا مستقیم به خود پست‌گرس ربط داره. یه کاربر روی اوبونتو ۱۸.۰۴ با این خطا مواجه شده:

    psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket “/var/run/postgresql/.s.PGSQL.5432”?

    این خطا یعنی برنامه psql (که ابزار خط فرمان برای وصل شدن به پست‌گرسه) نتونسته به سرور پست‌گرس وصل بشه. داره میپرسه که آیا سرور به صورت محلی (locally) روشنه و روی یه چیزی به اسم «سوکت دامنه یونیکس» داره گوش میده یا نه.

    بیاین مراحل عیب‌یابی این کاربر رو دنبال کنیم:

    قدم اول: وضعیت سرویس رو چک کنیم

    اولین کاری که باید بکنیم اینه که ببینیم آیا سرویس پست‌گرس‌کیوال اصلا روشنه یا نه.

    sudo systemctl status postgresql

    کاربر این دستور رو زده و دیده که سیستم میگه سرویس «فعاله». حتی با دستور restart هم سرویس رو دوباره راه‌اندازی کرده ولی مشکل حل نشده. این یکم عجیبه.

    قدم دوم: لیست کلاسترهای پست‌گرس رو ببینیم

    در سیستم‌عامل‌های مبتنی بر دبیان (مثل اوبونتو)، پست‌گرس با مفهومی به اسم «کلاستر» کار میکنه. هر کلاستر یه نمونه جدا از سرور پست‌گرسه که میتونه تنظیمات، پورت و مسیر داده‌های خودشو داشته باشه. با دستور زیر میشه لیست کلاسترها رو دید:

    pg_lsclusters

    وقتی کاربر این دستور رو میزنه، با این خروجی مواجه میشه:

    Ver Cluster Port Status Owner Data directory Log file
    10 main 5432 down postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
    11 main 5433 down postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log
    12 main 5434 down postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log

    این خروجی خیلی مهمه! ستون Status (وضعیت) برای همه کلاسترها down (خاموش) رو نشون میده. پس بر خلاف چیزی که systemctl میگفت، سرورهای پست‌گرس در واقع خاموش هستن!

    قدم سوم: تلاش برای روشن کردن دستی کلاستر

    حالا کاربر سعی میکنه یکی از کلاسترها رو دستی روشن کنه:

    sudo pg_ctlcluster 10 main start

    اما این دستور هم خطا میده و میگه سرویس نتونسته استارت بشه و برای جزئیات بیشتر لاگ‌ها رو چک کنین.

    قدم چهارم: خوندن فایل لاگ پست‌گرس

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

    sudo nano /var/log/postgresql/postgresql-10-main.log

    (nano یه ویرایشگر متن ساده در خط فرمانه)

    و بالاخره، سرنخ اصلی پیدا میشه. داخل فایل لاگ این خطا نوشته شده:

    2020-09-29 02:27:06.445 WAT [25041] FATAL: data directory "/var/lib/postgresql/10/main" has group or world access
    2020-09-29 02:27:06.445 WAT [25041] DETAIL: Permissions should be u=rwx (0700).
    • FATAL: یعنی یه خطای خیلی جدی که جلوی اجرای برنامه رو گرفته.
    • data directory ... has group or world access: میگه پوشه‌ای که داده‌های پست‌گرس توش ذخیره میشه (/var/lib/postgresql/10/main)، دسترسی‌های بیش از حدی داره. یعنی بقیه کاربرهای سیستم (group یا world) هم میتونن بهش دسترسی داشته باشن.
    • Permissions should be u=rwx (0700): خود پست‌گرس داره راه‌حل رو هم میگه. میگه سطح دسترسی (Permission) این پوشه باید 0700 باشه.

    سطح دسترسی یا Permission چیه؟

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

    • User (u): مالک فایل.
    • Group (g): گروهی که مالک فایل عضو اون هست.
    • Others/World (o): بقیه کاربران سیستم.

    کارها هم سه نوع هستن:

    • Read (r): خوندن
    • Write (w): نوشتن
    • Execute (x): اجرا کردن

    سطح دسترسی 0700 یعنی:

    • User: دسترسی کامل برای خوندن، نوشتن و اجرا کردن داره (rwx).
    • Group: هیچ دسترسی‌ای نداره.
    • Others: هیچ دسترسی‌ای نداره.

    چرا پست‌گرس اینقدر حساسه؟

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

    قدم پنجم: تصحیح سطح دسترسی و راه‌اندازی مجدد

    حالا که مشکل پیدا شد، راه‌حلش ساده‌ست. باید سطح دسترسی پوشه‌ها رو درست کنیم.

    sudo chmod -R 0700 /var/lib/postgresql/10/main
    sudo chmod -R 0700 /var/lib/postgresql/11/main
    sudo chmod -R 0700 /var/lib/postgresql/12/main
    • chmod: دستوری برای تغییر سطح دسترسی.
    • -R: یعنی این تغییر رو روی خود پوشه و تمام فایل‌ها و پوشه‌های داخلش هم اعمال کن (Recursive).

    بعد از اجرای این دستورها، کاربر دوباره سعی میکنه کلاسترها رو روشن کنه:

    sudo pg_ctlcluster 10 main start
    sudo pg_ctlcluster 11 main start
    sudo pg_ctlcluster 12 main start

    و این بار موفقیت‌آمیز بود. در نهایت با چک کردن دوباره وضعیت کلاسترها، میبینه که همه online شدن:

    Ver Cluster Port Status Owner Data directory Log file
    10 main 5432 online postgres /var/lib/postgresql/10/main /var/log/postgresql/postgresql-10-main.log
    11 main 5433 online postgres /var/lib/postgresql/11/main /var/log/postgresql/postgresql-11-main.log
    12 main 5434 online postgres /var/lib/postgresql/12/main /var/log/postgresql/postgresql-12-main.log

    و مشکل حل میشه.


    سناریو سوم: خطای «authentication failed» با داکر

    یه مشکل رایج دیگه وقتی پیش میاد که شما هم روی کامپیوتر خودتون (مثلا ویندوز ۱۱) پست‌گرس رو نصب کردین، و هم دارین سعی میکنین یه نسخه دیگه از پست‌گرس رو با داکر اجرا کنین.

    مشکل اینه: هر دوتاشون به صورت پیش‌فرض سعی میکنن از پورت 5432 استفاده کنن.

    پورت شبکه چیه؟

    فکر کنین آدرس آی‌پی کامپیوتر شما مثل آدرس یه ساختمون بزرگه. پورت‌ها مثل شماره واحد‌های توی اون ساختمون هستن. وقتی یه برنامه میخواد با یه برنامه دیگه روی شبکه حرف بزنه، باید هم آدرس ساختمون (IP) و هم شماره واحد (Port) رو بدونه.

    وقتی شما دو تا سرور پست‌گرس رو همزمان روشن میکنین که هر دو میخوان از پورت 5432 استفاده کنن، مثل این میمونه که دو نفر بخوان توی یه آپارتمان با شماره واحد یکسان زندگی کنن. سیستم قاطی میکنه و نمیدونه درخواست‌ها رو باید به کدوم یکی بفرسته.

    علامت مشکل چیه؟

    معمولا خطایی مثل p1000 authentication failed میگیرین. دلیلش اینه که ابزار شما (مثلا Prisma که یه ابزار برای کار با پایگاه داده‌ست) داره سعی میکنه با اطلاعات کاربری پست‌گرسِ داخل داکر، به پست‌گرسِ نصب شده روی کامپیوتر اصلیتون وصل بشه (چون اون پورت 5432 رو اشغال کرده). طبیعتا اطلاعات کاربری با هم نمیخونه و خطا میده.

    راه‌حل چیه؟

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

    دستور قبلی این بود:

    docker run ... -p 5432:5432 ...

    دستور جدید این میشه:

    docker run ... -p 5433:5432 ...

    این تغییر یعنی چی؟

    • -p 5433:5432: به داکر میگه «هر درخواستی به پورت 5433 کامپیوتر من اومد، اون رو بفرست به پورت 5432 داخل کانتینر».

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

    بخش پنجم: مدیریت روزمره پایگاه داده

    خب، حالا که سرورمون راه افتاده و مشکلات احتمالی رو هم بلدیم حل کنیم، بیاین یه نگاهی به کارهای روزمره بندازیم.

    پایگاه داده‌های پیش‌فرض: postgres, template1, template0

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

    • postgres: این پایگاه داده به عنوان نقطه اتصال پیش‌فرض برای ابزارها و کاربرها ساخته شده. وقتی شما برنامه‌ای مثل psql رو باز میکنین و مشخص نمیکنین به کدوم پایگاه داده میخواین وصل بشین، به صورت خودکار به postgres وصل میشه. یه جورایی مثل لابی یه هتله. شما اول وارد لابی میشین، بعد تصمیم میگیرین به کدوم اتاق برین. خود سرور پست‌گرس برای کار کردنش به این پایگاه داده نیازی نداره، ولی خیلی از ابزارهای جانبی فرض میکنن که این پایگاه داده وجود داره. پس بهتره حذفش نکنین.
    • template1: این یکی خیلی جالبه. اسمش یعنی «قالب شماره ۱». هر وقت شما یه پایگاه داده جدید میسازین، پست‌گرس در واقع یه کپی کامل از template1 درست میکنه. پس اگه شما یه جدول یا یه تنظیم خاصی رو توی template1 ایجاد کنین، تمام پایگاه داده‌های جدیدی که از اون به بعد میسازین، اون جدول یا تنظیم رو به ارث میبرن. این یه ابزار قدرتمند برای استانداردسازی پایگاه داده‌هاتونه.
    • template0: اینم یه قالبه، ولی یه قالب دست‌نخورده و تمیز. یه جورایی نسخه «تنظیمات کارخانه» محسوب میشه. گاهی اوقات ممکنه شما template1 رو خراب کنین (مثلا یه چیزی توش اضافه کنین که نباید میکردین). از اونجایی که برای ساختن یه کپی از یه قالب، نباید هیچ اتصال دیگه‌ای به اون قالب وجود داشته باشه، اگه template1 خراب بشه، درست کردنش سخته. اینجا template0 به کمکتون میاد. میتونین template1 رو حذف کنین و یه template1 جدید از روی template0 بسازین.

    پس به طور خلاصه:

    • postgres: برای اتصال اولیه.
    • template1: قالب پیش‌فرض برای ساخت پایگاه داده‌های جدید.
    • template0: نسخه پشتیبان و تمیز از قالب، برای روز مبادا.

    کپی کردن یک پایگاه داده از یه سرور به سرور دیگه

    یکی از کارهای خیلی رایج، کپی کردن یه پایگاه داده از یه محیط به محیط دیگه‌ست. مثلا از سرور اصلی (Production) به یه سرور تستی (Development) تا بتونین بدون ریسک، روی داده‌های واقعی کار کنین. راه‌های مختلفی برای این کار هست.

    روش اول: استفاده از pg_dump و psql (روش کلاسیک)

    این روش خیلی محبوبه و از دو تا ابزار خط فرمان استفاده میکنه: pg_dump برای گرفتن خروجی (بکاپ) و psql برای برگردوندن اون خروجی (ریستور).

    میشه این دوتا رو با هم ترکیب کرد تا بدون ساختن فایل واسطه، کار انجام بشه. به این کار میگن «پایپ کردن» (Piping) که با علامت | انجام میشه.

    pg_dump -C -h localhost -U localuser dbname | psql -h remotehost -U remoteuser dbname

    بیاین این دستور رو بشکافیم:

    • pg_dump: ابزار بکاپ‌گیری.
    • -C: به pg_dump میگه که دستور CREATE DATABASE رو هم توی خروجی بذاره. اینجوری لازم نیست پایگاه داده مقصد رو از قبل بسازیم.
    • -h localhost: میگه به سروری که روی همین کامپیوتر (localhost) هست وصل شو.
    • -U localuser: با کاربر localuser وصل شو.
    • dbname: اسم پایگاه داده‌ای که میخوایم ازش بکاپ بگیریم.
    • |: این علامت جادوییه. خروجی دستور سمت چپش رو به عنوان ورودی به دستور سمت راستش میده.
    • psql: ابزار کلاینت پست‌گرس که اینجا برای ریستور کردن استفاده میشه.
    • -h remotehost: میگه به سرور مقصد که آدرسش remotehost هست وصل شو.
    • -U remoteuser: با کاربر remoteuser به سرور مقصد وصل شو.

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

    # روی سرور مبدا
    pg_dump -C -Fp -f dump.sql -U postgres some_database_name
    scp dump.sql development:
    rm dump.sql
    
    # روی سرور مقصد
    ssh development
    psql -U postgres -f dump.sql

    روش دوم: استفاده از تونل فشرده با SSH

    اگه میخواین همزمان هم کار فشرده‌سازی و هم انتقال امن رو انجام بدین، میتونین از این روش استفاده کنین:

    pg_dump -C dbname | bzip2 | ssh remoteuser@remotehost "bunzip2 | psql dbname"

    اینجا خروجی pg_dump اول با bzip2 فشرده میشه، بعد از طریق یه اتصال امن ssh به سرور مقصد فرستاده میشه، اونجا از حالت فشرده خارج میشه (bunzip2) و در نهایت با psql ریستور میشه.

    روش سوم: pg_basebackup (برای حرفه‌ای‌ها و دیتابیس‌های بزرگ)

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

    برای استفاده از این روش باید یه سری تنظیمات روی سرور مبدا انجام بدین:

    1. در فایل postgresql.conf، گزینه listen_addresses رو روی '*' تنظیم کنین تا سرور از آی‌پی‌های دیگه هم اتصال قبول کنه.
    2. باز هم در همین فایل، wal_level رو حداقل روی replica بذارین.
    3. و max_wal_senders رو روی یه عددی بزرگتر از صفر (مثلا ۱ یا بیشتر) تنظیم کنین.
    4. در فایل pg_hba.conf، یه خط اضافه کنین که به سرور مقصد اجازه اتصال برای «replication» (همانندسازی) بده.
      host replication postgres DST_IP/32 trust
      (به جای DST_IP باید آی‌پی سرور مقصد رو بذارین).
    5. بعد از این تغییرات، سرور پست‌گرس رو ریستارت کنین.

    حالا روی سرور مقصد:

    1. سرویس پست‌گرس رو متوقف کنین (sudo service postgresql stop).
    2. تمام محتویات پوشه داده‌های پست‌گرس رو پاک کنین (مثلا /var/lib/postgresql/12/main/*). مواظب باشین این کار رو روی سرور اشتباهی انجام ندین!
    3. دستور pg_basebackup رو اجرا کنین:
    sudo -u postgres pg_basebackup -h SRC_IP -U postgres -D /var/lib/postgresql/12/main/ --progress

    (به جای SRC_IP آی‌پی سرور مبدا رو بذارین).

    1. بعد از اینکه کارش تموم شد، سرویس پست‌گرس رو روی سرور مقصد روشن کنین (sudo service postgresql start).

    حالا شما یه کپی دقیق از کل سرور مبدا روی سرور مقصد دارین.

    روش چهارم: استفاده از رابط گرافیکی (GUI) مثل pgAdmin

    اگه با خط فرمان راحت نیستین، همیشه میتونین از ابزارهای گرافیکی استفاده کنین. با pgAdmin مراحل خیلی ساده‌ست:

    1. به هر دو سرور مبدا و مقصد وصل بشین.
    2. روی پایگاه داده مبدا کلیک راست کنین و گزینه «Backup» رو بزنین. یه فایل بکاپ براتون میسازه.
    3. روی سرور مقصد کلیک راست کنین، «Create» و بعد «Database» رو بزنین و یه پایگاه داده جدید با همون مشخصات پایگاه داده مبدا بسازین.
    4. روی پایگاه داده جدیدی که ساختین کلیک راست کنین و «Restore» رو بزنین. فایل بکاپی که در مرحله ۲ ساختین رو بهش بدین تا اطلاعات رو برگردونه.

    بخش ششم: چطوری سرعت رو بالا نگه داریم؟ نگاهی به بهینه‌سازی عملکرد

    گاهی اوقات ممکنه پایگاه داده شما کند بشه، مخصوصا وقتی حجم داده‌ها زیاد میشه و تعداد کاربرها بالا میره. به این وضعیت میگن «بار بالا» (High Load). مدیریت این وضعیت یه بحث خیلی بزرگه، ولی بیاین چند تا نکته کلیدی رو با هم مرور کنیم.

    ۱. اول بفهمین دیتابیس داره چیکار میکنه.
    مشکلات عملکردی معمولا به خاطر چند تا «کوئری» (Query) یا همون پرس‌وجوی سنگین و پرهزینه‌ست که زیاد اجرا میشن. اولین قدم اینه که این کوئری‌ها رو پیدا کنین.

    ۲. از EXPLAIN ANALYZE استفاده کنین.
    این یکی از قدرتمندترین ابزارهای شماست. وقتی قبل از هر کوئری SELECT، عبارت EXPLAIN ANALYZE رو بنویسین، پست‌گرس به جای اجرای عادی کوئری، به شما یه گزارش کامل از «نقشه اجرا» (Execution Plan) اون کوئری میده. یعنی بهتون میگه که برای پیدا کردن جواب، دقیقا چه قدم‌هایی رو برداشته و هر قدم چقدر زمان برده.

    ۳. حواستون به «Sequential Scans» باشه.
    وقتی توی خروجی EXPLAIN دیدین که روی یه جدول بزرگ داره «Sequential Scan» انجام میشه، باید حواستون رو جمع کنین. این یعنی پست‌گرس داره کل جدول رو ردیف به ردیف از اول تا آخر میخونه تا داده مورد نظر شما رو پیدا کنه. این کار برای جدول‌های بزرگ خیلی خیلی کنده.

    ۴. از ایندکس (Index) استفاده کنین.
    راه‌حل Sequential Scan معمولا ساختن «ایندکس» هست. ایندکس مثل فهرست آخر یه کتاب قطوره. شما برای پیدا کردن یه مطلب، کل کتاب رو صفحه به صفحه نمیخونین، بلکه میرین سراغ فهرست و مستقیم به صفحه مورد نظر میرین. ایندکس هم برای پایگاه داده همین کار رو میکنه. شما روی ستون‌هایی که معمولا توی شرط WHERE کوئری‌هاتون استفاده میکنین، ایندکس میسازین. اینجوری پست‌گرس میتونه خیلی سریع‌تر ردیف‌های مورد نظر رو پیدا کنه.

    ۵. VACUUM و ANALYZE رو فراموش نکنین.
    وقتی شما داده‌ها رو توی پست‌گرس UPDATE یا DELETE میکنین، فضای اونها فورا آزاد نمیشه. به مرور زمان این فضاهای مرده جمع میشن و باعث میشن جدول‌ها بزرگتر از اندازه واقعی‌شون بشن (به این میگن Bloat). دستور VACUUM این فضاهای مرده رو تمیز و قابل استفاده مجدد میکنه.

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

    در خیلی از تنظیمات پیش‌فرض، سرویس «autovacuum» فعاله و این کارها رو خودکار انجام میده، ولی خوبه که بدونین این دستورها وجود دارن و گاهی اوقات لازمه به صورت دستی اجرا بشن.

    بخش هفتم: پرسش و پاسخ (سوالات متداول شما)

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

    سوال ۱: بالاخره پست‌گرس‌کیوال یه زبانه یا یه سرور؟
    پست‌گرس‌کیوال یک نرم‌افزار مدیریت پایگاه داده هست که به عنوان یک سرور عمل میکنه. این نرم‌افزار، زبان SQL (زبان استاندارد کوئری‌نویسی) رو میفهمه و اجرا میکنه. پس خودش زبان نیست، بلکه اجراکننده زبانه.

    سوال ۲: این «سرورهایی» که توی pgAdmin میبینم چی هستن؟ یعنی چند تا کامپیوتر مختلفن؟
    هر «سرور» توی pgAdmin نشون‌دهنده یک اتصال به یک نمونه (instance) از سرور پایگاه داده پست‌گرس‌کیواله. این سرور میتونه روی کامپیوتر خود شما باشه (localhost) یا روی یه کامپیوتر دیگه در شبکه یا اینترنت. شما میتونین به چندین سرور مختلف به صورت همزمان متصل باشین.

    سوال ۳: من پایگاه داده‌هایی به اسم postgres و template1 میبینم. اینها چی هستن و میتونم پاکشون کنم؟

    • postgres: پایگاه داده پیش‌فرض برای اتصال اولیه ابزارها و کاربران. بهتره پاکش نکنین چون خیلی از برنامه‌ها به وجودش تکیه میکنن.
    • template1: قالبی که تمام پایگاه داده‌های جدید از روی اون کپی میشن. پاک کردنش ایده خوبی نیست، مگه اینکه بخواین از روی template0 (قالب پشتیبان) یه نسخه جدید ازش بسازین.

    سوال ۴: ساده‌ترین راه برای کپی کردن یه پایگاه داده از کامپیوتر خودم به یه سرور دیگه چیه؟
    برای دیتابیس‌های کوچیک و متوسط، استفاده از ترکیب pg_dump و psql با پایپ کردن خیلی ساده و سریعه:
    pg_dump -C -h [آدرس مبدا] -U [کاربر مبدا] [اسم دیتابیس مبدا] | psql -h [آدرس مقصد] -U [کاربر مقصد] [اسم دیتابیس مقصد]

    سوال ۵: سرور پست‌گرس من بعد از آپدیت سیستم‌عامل روشن نمیشه و کلی خطای عجیب در مورد nvidia و vboxdrv میبینم. مشکل چیه؟
    به احتمال خیلی زیاد مشکل از خود پست‌گرس نیست. این خطاها نشون میدن که کل سیستم‌عامل شما بعد از آپدیت دچار بی‌ثباتی شده و درایورهای مهمی بارگذاری نشدن. در چنین شرایطی، سیستم نمیتونه محیط پایداری برای اجرای سرویس پست‌گرس فراهم کنه. شما باید اول مشکلات سیستم‌عامل و درایورهاتون رو حل کنین.

    سوال ۶: میخوام وصل بشم ولی خطای authentication failed یا could not connect to server میگیرم. اولین چیزایی که باید چک کنم چی هستن؟

    • آیا سرویس پست‌گرس اصلا روشنه؟ با دستورهایی مثل systemctl status postgresql یا pg_lsclusters وضعیتش رو چک کنین.
    • آیا سطح دسترسی پوشه داده‌ها درسته؟ همونطور که دیدیم، پست‌گرس به این موضوع خیلی حساسه. لاگ‌های پست‌گرس رو چک کنین تا ببینین خطایی در این مورد وجود نداره.
    • آیا تداخل پورت وجود نداره؟ مطمئن بشین که هیچ برنامه دیگه‌ای (مثلا یه نسخه دیگه از پست‌گرس) در حال استفاده از همون پورتی که شما میخواین بهش وصل بشین (معمولا 5432) نیست.
    • آیا اطلاعات اتصال (آدرس سرور، نام کاربری، پسورد) رو درست وارد میکنین؟ این مورد خیلی ساده به نظر میرسه ولی زیاد اتفاق میفته

    منابع

    • [2] After Upgrading, Can’t Boot “Failed to start PostgreSQL database server” – Computer Used for Work – Support – Manjaro Linux Forum
    • [4] Default database named postgres on Postgresql server – Stack Overflow
    • [6] linux – managing high load of a postgresql database – Server Fault
    • [8] PostgreSQL: Why psql can’t connect to server? – Stack Overflow
    • [10] p1000 authentication failed against database server · prisma/prisma · Discussion #8925 · GitHub
    • [1] Noob Question: What are “servers” in postgreSQL/pgAdmin? : r/PostgreSQL
    • [3] PostgreSQL: The world’s most advanced open source database
    • [5] sql – If I’m using PostgreSQL, do I need a server too? Like AWS RDS? – Stack Overflow
    • [7] PostgreSQL: Downloads
    • [9] Copying PostgreSQL database to another server – Stack Overflow
  • امنیت ایمیل؛ راهنمای محافظت از ارتباطات دیجیتال شما

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

    دشمنان نامرئی: با انواع تهدیدهای ایمیلی آشنا بشیم

    اول از همه، باید بدونیم که وقتی از «حمله ایمیلی» حرف می‌زنیم، دقیقا منظورمون چیه. این حمله‌ها شکل‌های مختلفی دارن و هر کدوم یه هدف خاص رو دنبال می‌کنن. مجرم‌های سایبری همیشه دنبال راه‌های جدیدی برای گول زدن ما هستن. بیایید چندتا از معروف‌ترین این روش‌ها رو با هم بررسی کنیم.

    فیشینگ (Phishing): طعمه‌ای برای شکار اطلاعات شما

    یکی از رایج‌ترین و شناخته‌شده‌ترین تهدیدها، فیشینگ هست. اسمش از کلمه انگلیسی «Fishing» به معنی ماهیگیری میاد، چون کاری که هکر می‌کنه دقیقا مثل ماهیگیریه. یه طعمه جذاب یا فوری جلوی شما می‌ندازه تا شما رو به دام بندازه و اطلاعات حساس‌تون رو بدزده. این اطلاعات می‌تونه هر چیزی باشه، از نام کاربری و رمز عبور گرفته تا اطلاعات حساب بانکی شما.

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

    مهاجم‌های فیشینگ خودشون رو جای یه منبع معتبر جا می‌زنن. مثلا ممکنه ایمیلی دریافت کنین که به نظر میاد از طرف بانک شما، یه فروشگاه آنلاین معروف یا حتی شبکه اجتماعی که توش عضو هستین، فرستاده شده. این ایمیل‌ها معمولا با یه درخواست وسوسه‌انگیز یا یه هشدار فوری، شما رو ترغیب می‌کنن که کاری رو انجام بدین. مثلا ممکنه بگن: «حساب شما در خطر است، برای تایید هویت فورا روی این لینک کلیک کنید».

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

    فیشینگ خودش انواع مختلفی داره که روز به روز هم پیچیده‌تر می‌شن:

    • فیشینگ نیزه‌ای (Spear Phishing): این نوع فیشینگ مثل یه حمله تک‌تیراندازه. به جای اینکه یه ایمیل عمومی برای هزاران نفر فرستاده بشه، مهاجم یه فرد یا یه سازمان خاص رو هدف قرار می‌ده. اونها قبل از حمله، حسابی در مورد هدف تحقیق می‌کنن و ایمیل رو طوری طراحی می‌کنن که کاملا شخصی و معتبر به نظر برسه. مثلا ممکنه به اسم یکی از همکاران یا مدیر شما ایمیل بزنن و درخواستی بکنن که خیلی عادی به نظر میاد.
    • نهنگ‌گیری (Whaling): این مدل، نسخه سنگین‌تر فیشینگ نیزه‌ایه. اینجا هدف، افراد خیلی مهم و رده‌بالای یه سازمانه، مثل مدیرعامل (CEO) یا مدیر مالی. چون این افراد دسترسی‌های خیلی مهمی دارن، موفقیت تو این نوع حمله می‌تونه خسارت‌های وحشتناکی به بار بیاره.
    • ویشینگ (Vishing): این کلمه ترکیبی از «Voice» و «Phishing» هست و به فیشینگ از طریق تماس صوتی اشاره داره.
    • کوئیشینگ (Quishing): این یکی از روش‌های جدیدتره که از کدهای QR استفاده می‌کنه. ایمیل حاوی یه تصویر از کد QR هست. مهاجم از شما می‌خواد که این کد رو با دوربین موبایل‌تون اسکن کنین. به محض اسکن کردن، شما به یه سایت فیشینگ هدایت می‌شین. نکته خطرناک اینجاست که این کار معمولا با گوشی شخصی انجام می‌شه که احتمالا مثل کامپیوترهای شرکت، تحت نظارت امنیتی نیست و اینطوری مهاجم می‌تونه کنترل‌های امنیتی سازمان رو دور بزنه.

    جعل دامنه ایمیل (Email Domain Spoofing): وقتی ایمیل از یه آدرس آشنا میاد، اما فرستنده غریبه است

    یکی از تکنیک‌های کلیدی که به موفقیت حمله‌های فیشینگ و بقیه کلاهبرداری‌ها کمک می‌کنه، جعل دامنه ایمیل هست. این تکنیک به مهاجم اجازه می‌ده یه ایمیل با آدرس فرستنده جعلی بفرسته. یعنی ایمیلی که شما دریافت می‌کنین، به نظر میاد از یه منبع معتبر و قانونی فرستاده شده، در حالی که اینطور نیست.

    بذارین یه مثال بزنم. فرض کنین یه هکر به اسم «چاک» می‌خواد دوستش «باب» رو گول بزنه. چاک می‌تونه یه ایمیل از طرف دامنه «trustworthy-bank.com@» برای باب بفرسته، در حالی که چاک اصلا صاحب این دامنه نیست و هیچ ربطی به اون بانک نداره. این کار باعث می‌شه باب به ایمیل اعتماد کنه و کاری که ازش خواسته شده رو انجام بده.

    بدافزار (Malware): مهمان ناخوانده‌ای در پیوست ایمیل

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

    یکی از راه‌های ساده اینه که مهاجم یه فایل اجرایی با پسوند «.exe» رو مستقیما پیوست کنه و گیرنده رو گول بزنه که اون رو باز کنه. اما یه روش خیلی رایج‌تر و موذیانه‌تر، مخفی کردن کدهای مخرب داخل فایل‌های به ظاهر بی‌خطره. مثلا یه فایل PDF یا یه سند Word. هر دوی این فایل‌ها می‌تونن حاوی کدهایی مثل ماکرو (Macro) باشن. مهاجم‌ها از این قابلیت برای اجرای یه دستور مخرب روی کامپیوتر قربانی استفاده می‌کنن. مثلا به محض باز شدن فایل، یه بدافزار دیگه دانلود و اجرا می‌شه.

    جالبه بدونین که ۹۴ درصد از بدافزارها از طریق ایمیل منتقل می‌شن. خیلی از آلودگی‌های باج‌افزار (Ransomware) در سال‌های اخیر با یه پیوست ایمیل شروع شدن. باج‌افزار نوعی بدافزاره که فایل‌های شما رو قفل (رمزگذاری) می‌کنه و برای باز کردنشون از شما باج می‌خواد.

    • باج‌افزار Ryuk: معمولا از طریق یه پیوست Word که حاوی ماکروی مخربه، پخش می‌شه.
    • باج‌افزار Petya: این یکی از طریق یه ایمیل فیشینگ که خودش رو یه متقاضی کار جا می‌زنه، منتشر می‌شه و یه لینک به یه فایل Dropbox آلوده می‌ده.
    • بدافزار Emotet: این بدافزار که اولش یه تروجان بانکی بود، تکامل پیدا کرد و حالا از طریق پیوست‌های ایمیل آلوده، بدافزارهای دیگه‌ای رو هم پخش می‌کنه.

    اسپم (Spam): پیام‌های ناخواسته و مزاحم

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

    فرستنده‌های اسپم (Spammers) به مرور زمان «اعتبار فرستنده ایمیل» بدی پیدا می‌کنن. یعنی اگه درصد زیادی از ایمیل‌های یه فرستنده باز نشه یا توسط گیرنده‌ها به عنوان اسپم علامت‌گذاری بشه، یا اگه ایمیل‌هاش زیاد برگشت بخوره، سرویس‌های ایمیل اعتبار اون فرستنده رو کم می‌کنن. به همین دلیله که اسپمرها همیشه انگیزه دارن که کنترل حساب‌های کاربری دیگه رو به دست بگیرن، فضای آدرس IP بدزدن یا دامنه‌ها رو جعل کنن تا بتونن اسپم‌هایی بفرستن که به راحتی شناسایی نشن.

    تسخیر حساب کاربری (Account Takeover): وقتی خونه شما دست دزد می‌افته

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

    مهاجم‌ها برای نفوذ به یه حساب ایمیل از روش‌های مختلفی استفاده می‌کنن:

    • حملات بروت فورس (Brute force): ابزارهای خودکار به طور سیستماتیک رمزهای عبور مختلف رو امتحان می‌کنن تا بالاخره رمز درست رو پیدا کنن. این روش روی حساب‌هایی با رمزهای ضعیف یا رایج بهتر جواب می‌ده.
    • اسپری کردن رمز عبور (Password spraying): این روش شبیه بروت فورسه، اما برعکس عمل می‌کنه. به جای امتحان کردن هزاران رمز روی یک حساب، مهاجم تعداد کمی از رمزهای عبور خیلی رایج (مثلا Password123) رو روی تعداد زیادی از حساب‌ها امتحان می‌کنه تا شناسایی نشه.
    • پر کردن اعتبارنامه (Credential stuffing): مهاجم‌ها از نام‌های کاربری و رمزهای عبوری که قبلا از نشت اطلاعاتی سایت‌های دیگه به دست آوردن، استفاده می‌کنن. اونها روی این حساب می‌کنن که خیلی از کاربرها از یه رمز عبور برای چندتا سایت مختلف استفاده می‌کنن.
    • بدافزار مبتنی بر سرقت اعتبارنامه: نرم‌افزارهای مخربی که اطلاعات ذخیره شده از مرورگرها یا مدیران رمز عبور رو می‌دزدن یا کلیدهایی که شما موقع تایپ رمزتون فشار می‌دین رو ضبط می‌کنن (Keylogger).
    • فیشینگ و مهندسی اجتماعی: همونطور که گفتیم، کاربر رو گول می‌زنن تا خودش اطلاعاتش رو لو بده.

    مهندسی اجتماعی (Social Engineering): بازی با روان شما

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

    و چند تهدید دیگر…

    • حمله مرد میانی (Man-in-the-Middle): تصور کنین یه نفر یواشکی داره به مکالمه شما گوش می‌ده. تو این حمله، مهاجم ارتباط بین دو نفر رو قطع می‌کنه و می‌تونه پیام‌ها رو بخونه، تغییر بده یا پیام‌های جدیدی به مکالمه تزریق کنه.
    • نشت داده (Data Exfiltration): دزدهای حرفه‌ای به سیستم ایمیل یه سازمان نفوذ می‌کنن و داده‌های حساس مثل اسرار تجاری، اطلاعات مالی یا اطلاعات شخصی کارمندان و مشتریان رو می‌دزدن.
    • حمله منع سرویس (Denial of Service): مهاجم‌ها با فرستادن حجم عظیمی از ایمیل‌ها، سرورهای ایمیل رو غرق می‌کنن. سرورها زیر این فشار از کار می‌افتن و ارتباطات ایمیلی مختل می‌شه.

    سپر دفاعی ما: چطور از ایمیل‌هامون محافظت کنیم؟

    خب، تا اینجا با انواع و اقسام خطرات آشنا شدیم. حالا وقتشه که یاد بگیریم چطوری قلعه دفاعی خودمون رو بسازیم و از خودمون محافظت کنیم. امنیت ایمیل یه کار تیمی بین کاربرها و تکنولوژیه. بیایید ببینیم چه ابزارها و روش‌هایی برای این کار وجود داره.

    رمزگذاری (Encryption): نامه شما در یک پاکت مهر و موم شده

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

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

    اکثر روش‌های رمزگذاری ایمیل از رمزنگاری کلید عمومی استفاده می‌کنن. بعضی از این روش‌ها حتی سر به سر (end-to-end) هستن، یعنی حتی خود شرکت سرویس‌دهنده ایمیل هم نمی‌تونه محتوای پیام‌های شما رو بخونه.

    انواع مختلفی از پروتکل‌های رمزگذاری وجود داره:

    • PGP (Pretty Good Privacy): این یه پروتکل رمزگذاریه که به طور خاص برای ایمیل طراحی شده و چون یه استاندارد بازه، هر کسی می‌تونه ازش استفاده کنه.
    • S/MIME (Secure Multi-purpose Internet Mail Extension): این هم مثل PGP برای امن کردن محتوای ایمیل طراحی شده، اما بیشتر در محیط‌های سازمانی و شرکتی استفاده می‌شه.
    • TLS (Transport Layer Security): این پروتکل برای امن کردن کل ارتباطات شبکه استفاده می‌شه، نه فقط ایمیل. وب‌گردی، انتقال فایل و ایمیل همگی می‌تونن از TLS برای محافظت از داده‌ها در حین انتقال بین دو دستگاه استفاده کنن.

    نگهبانان دامنه: SPF، DKIM و DMARC

    یادتونه در مورد جعل دامنه صحبت کردیم؟ خب، برای مقابله با این مشکل، سه تا رکورد DNS خاص وجود داره که مثل سه تا نگهبان برای دامنه شما عمل می‌کنن و مطمئن می‌شن ایمیل‌ها واقعا از جایی که ادعا می‌کنن، اومدن. DNS یا «سیستم نام دامنه» مثل دفترچه تلفن اینترنته و رکوردهای عمومی یه دامنه رو ذخیره می‌کنه.

    این سه نگهبان عبارتند از:

    • SPF (Sender Policy Framework): این رکورد مثل یه لیست مهمان‌ها عمل می‌کنه. صاحب دامنه یه لیست از آدرس‌های IP مجاز که حق دارن از طرف اون دامنه ایمیل بفرستن رو تو رکورد DNS خودش اعلام می‌کنه. وقتی یه ایمیل دریافت می‌شه، سرور گیرنده چک می‌کنه که آیا IP فرستنده تو این لیست مجاز هست یا نه.
    • DKIM (DomainKeys Identified Mail): این رکورد از امضای دیجیتال برای تایید اعتبار ایمیل استفاده می‌کنه. صاحب دامنه کلیدهای عمومی DKIM رو تو رکورد DNS خودش قرار می‌ده و ایمیل‌های خروجی رو به صورت دیجیتالی امضا می‌کنه. گیرنده می‌تونه با استفاده از اون کلید عمومی، امضا رو تایید کنه و مطمئن بشه که ایمیل در مسیر دستکاری نشده.
    • DMARC (Domain-based Message Authentication, Reporting, and Conformance): این رکورد مثل یه مدیر یا ناظر عمل می‌کنه. DMARC به صاحب دامنه اجازه می‌ده که مشخص کنه اگه یه ایمیل در آزمون‌های SPF یا DKIM مردود شد، سرور گیرنده باید باهاش چیکار کنه (مثلا ردش کنه، قرینه‌اش کنه یا فقط گزارش بده). این پروتکل از دو پروتکل قبلی استفاده می‌کنه تا از جعل آدرس ایمیل جلوگیری کنه.

    سرویس‌های ایمیل معتبر، ایمیل‌های دریافتی رو با این سه رکورد چک می‌کنن تا ببینن آیا قانونی هستن یا نه.

    ابزارها و راهکارهای فنی: ارتش دیجیتال شما

    علاوه بر موارد بالا، سازمان‌ها از مجموعه‌ای از ابزارها و خدمات برای تقویت امنیت ایمیل‌شون استفاده می‌کنن:

    • دروازه‌های امن ایمیل (Secure Email Gateways – SEG): اینها مثل یه گارد امنیتی در ورودی شبکه شرکت مستقر می‌شن و ایمیل‌های ورودی و خروجی رو بازرسی و فیلتر می‌کنن. اونها از معیارهای مختلفی مثل امضای بدافزارها، فیلتر کردن URLهای مشکوک و الگوهای فیشینگ برای شناسایی و مسدود کردن ایمیل‌های مخرب استفاده می‌کنن.
    • امنیت ایمیل ابری (Cloud Email Security): سرویس‌های ایمیل ابری مثل Google Workspace یا Microsoft 365 معمولا ویژگی‌های امنیتی داخلی دارن. مثلا ممکنه حفاظت در برابر تهدید، فیلتر اسپم و رمزگذاری ارائه بدن. اما با توجه به اینکه آفیس ۳۶۵ به یه هدف جذاب برای مجرم‌های سایبری تبدیل شده، خیلی از شرکت‌ها دنبال لایه‌های امنیتی اضافی هستن.
    • محافظت از داده‌های ایمیل (Email Data Protection – EDP): این راهکارها برای جلوگیری از نشت داده‌های حساس و اطمینان از رعایت قوانین حفاظت از داده طراحی شدن. EDP معمولا از ترکیب رمزگذاری، DLP و SEG استفاده می‌کنه.
    • جلوگیری از از دست رفتن داده (Data Loss Prevention – DLP): این سیستم‌ها محتوای ایمیل‌های خروجی رو بررسی می‌کنن و اگه اطلاعات حساسی (مثل شماره کارت اعتباری یا اطلاعات شخصی) پیدا کنن، جلوی ارسال اون رو می‌گیرن یا اون بخش از متن رو حذف می‌کنن.
    • راهکارهای مبتنی بر API: این راهکارها به جای اینکه در مسیر ایمیل قرار بگیرن، از طریق API به سرویس ایمیل شما متصل می‌شن و ایمیل‌ها رو برای محتوای مخرب بازرسی می‌کنن.
    • هوش مصنوعی (AI) در امنیت ایمیل: هوش مصنوعی داره به یه ابزار قدرتمند در این زمینه تبدیل می‌شه. مدل‌های زبان بزرگ (LLM) می‌تونن محتوای یه ایمیل رو بخونن و تحلیل کنن و علائم هشداردهنده فیشینگ مثل تلاش برای ایجاد حس فوریت یا دستکاری روانشناسی رو تشخیص بدن. همچنین AI می‌تونه الگوهای ترافیک ایمیل رو تحلیل کنه و هرگونه رفتار غیرعادی که ممکنه نشونه یه حمله باشه رو شناسایی کنه.

    شما، اولین خط دفاع: بهترین روش‌های امنیتی برای کاربران

    تکنولوژی به تنهایی کافی نیست. در نهایت، این شما هستین که روی لینک کلیک می‌کنین یا پیوست رو باز می‌کنین. شما مهم‌ترین بخش از سیستم دفاعی هستین. به همین خاطر به کارمندها میگن «دیوار آتش انسانی». بیایید ببینیم چه کارهایی رو باید به یه عادت روزمره تبدیل کنیم.

    • یک رمز عبور قوی بسازید: رمز عبور ضعیف، تکراری یا لو رفته، شایع‌ترین دلیل هک شدن حساب‌های ایمیله. یه رمز عبور قوی باید حداقل ۱۲ کاراکتر طول داشته باشه و ترکیبی از حروف بزرگ و کوچک، اعداد و کاراکترهای خاص (مثل @، #، $) باشه.
    • احراز هویت دو عاملی (MFA) را فعال کنید: این کار یه لایه امنیتی اضافه به حساب شما اضافه می‌کنه. حتی اگه یه هکر رمز عبور شما رو به دست بیاره، برای ورود به حساب به یه عامل دوم هم احتیاج داره، مثلا یه کدی که به گوشی شما فرستاده می‌شه.
    • مراقب کلاهبرداری‌های فیشینگ باشید: همیشه به ایمیل‌هایی که اطلاعات شخصی از شما می‌خوان یا لینک‌های مشکوک دارن، با دیده شک نگاه کنین. قبل از کلیک کردن، ماوس رو روی لینک نگه دارین تا ببینین واقعا شما رو به کجا می‌بره.
    • نرم‌افزارهای خود را به‌روز نگه دارید: همیشه مطمئن بشین که سیستم عامل و برنامه ایمیل شما آخرین آپدیت‌های امنیتی رو دریافت کرده. هکرها از آسیب‌پذیری‌های نرم‌افزارهای قدیمی سوءاستفاده می‌کنن.
    • یک ارائه‌دهنده خدمات ایمیل معتبر انتخاب کنید: دنبال سرویسی باشین که از رمزگذاری و اقدامات امنیتی دیگه برای محافظت از داده‌های شما استفاده می‌کنه.
    • در آموزش‌های آگاهی‌بخشی امنیتی شرکت کنید: خیلی از سازمان‌ها برای کارمندانشون دوره‌های آموزشی برگزار می‌کنن تا یاد بگیرن چطور تهدیدها رو شناسایی کنن. این آموزش‌ها خیلی مهمن و به شما کمک می‌کنن که به جای اینکه یه نقطه ضعف باشین، به یه نقطه قوت در امنیت سازمان تبدیل بشین.
    • از VPN استفاده کنید: استفاده از VPN می‌تونه با رمزگذاری اتصال اینترنت شما و مخفی کردن آدرس IP، به محافظت از ایمیل‌هاتون کمک کنه و کار رو برای هکرها سخت‌تر کنه.
    • از حساب‌های خود خارج شوید (Log out): وقتی کارتون تموم شد، مخصوصا روی دستگاه‌های اشتراکی، از حساب ایمیل‌تون خارج بشین. فعال کردن خروج خودکار بعد از یه مدت بی‌فعالیتی هم ایده خوبیه.

    سیاست‌های امنیتی ایمیل: قوانین بازی در یک سازمان

    برای اینکه همه این موارد به درستی اجرا بشن، سازمان‌ها باید یه سری قوانین و استانداردها به اسم «سیاست امنیتی ایمیل» داشته باشن. این سیاست مثل یه دفترچه راهنماست که به همه میگه چطور باید از ایمیل به صورت امن استفاده کنن. یه سیاست خوب باید شامل این موارد باشه:

    • استفاده مناسب: مشخص می‌کنه چه کسانی، برای چه اهدافی و چطور می‌تونن از ایمیل سازمانی استفاده کنن.
    • رمز عبور و احراز هویت: قوانین مربوط به پیچیدگی رمز عبور و اجباری بودن MFA رو تعیین می‌کنه.
    • رمزگذاری: مشخص می‌کنه چه نوع اطلاعات حساسی باید حتما قبل از ارسال، رمزگذاری بشن.
    • محافظت در برابر ویروس: رویه‌های مربوط به اسکن ایمیل‌ها و پیوست‌ها رو مشخص می‌کنه.
    • نگهداری و حذف: تعیین می‌کنه ایمیل‌ها و پیوست‌هاشون تا چه مدتی باید نگهداری بشن و کی باید حذف بشن.
    • آموزش: همه کارمندان رو ملزم به گذروندن دوره‌های آموزشی امنیت ایمیل می‌کنه.
    • گزارش‌دهی حوادث: رویه‌های مربوط به گزارش و بررسی مشکلات امنیتی ایمیل رو مشخص می‌کنه.
    • نظارت: رویه‌های نظارت بر ارتباطات ایمیلی برای اطمینان از رعایت سیاست‌ها رو تعیین می‌کنه.
    • انطباق با مقررات: اطمینان می‌ده که سازمان با قوانین حفاظت از داده مثل GDPR و HIPAA مطابقت داره.
    • اجرا: عواقب نقض سیاست امنیتی ایمیل، از اقدامات انضباطی تا پیگردهای قانونی رو مشخص می‌کنه.

    یه مثال کاربردی: حالت محرمانه در جیمیل

    برای اینکه این مفاهیم رو بهتر درک کنین، بیایید یه نگاهی به یکی از ویژگی‌های امنیتی جیمیل به اسم «حالت محرمانه» (Confidential Mode) بندازیم. این ویژگی به شما اجازه می‌ده ایمیل‌هایی بفرستین که امنیت بیشتری دارن.

    • قدم اول: وقتی دارین یه ایمیل جدید می‌نویسین، در پایین پنجره روی آیکون قفل و ساعت کلیک کنین تا حالت محرمانه فعال بشه.
    • قدم دوم: حالا می‌تونین یه تاریخ انقضا برای ایمیل‌تون تعیین کنین. بعد از این تاریخ، گیرنده دیگه نمی‌تونه ایمیل رو ببینه. همچنین می‌تونین یه رمز عبور هم براش بذارین.
      • اگه گزینه «بدون رمز پیامکی» رو انتخاب کنین، کسانی که از اپ جیمیل استفاده می‌کنن، می‌تونن مستقیم ایمیل رو باز کنن و بقیه یه ایمیل حاوی رمز عبور دریافت می‌کنن.
      • اگه گزینه «رمز پیامکی» رو انتخاب کنین، گیرنده یه رمز عبور از طریق پیامک دریافت می‌کنه و شما باید شماره تلفن گیرنده رو وارد کنین.
    • قدم سوم: روی دکمه ذخیره کلیک کنین.
    • قدم چهارم: ایمیل‌تون رو بنویسین و ارسال کنین.

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


    جلسه پرسش و پاسخ پروفسور

    خب، حالا که یه دور کامل با دنیای امنیت ایمیل آشنا شدیم، وقتشه که به چندتا از سوال‌های رایج شما جواب بدم.

    سوال: چرا امنیت ایمیل اینقدر مهمه؟

    پاسخ: چون ایمیل یکی از اصلی‌ترین ابزارهای ارتباطی ماست و اغلب حاوی اطلاعات حساسه. از طرفی، ایمیل یکی از محبوب‌ترین اهداف برای مجرم‌های سایبریه. طبق گزارش‌ها، ۹۴ درصد حمله‌های فیشینگ از ایمیل شروع می‌شن و همینطور ۹۴ درصد بدافزارها از طریق ایمیل منتقل می‌شن. یه حمله ایمیلی موفق می‌تونه منجر به خسارت‌های مالی سنگین (مثل حملات BEC که بین سال‌های ۲۰۱۳ تا ۲۰۲۲ حدود ۵۰ میلیارد دلار خسارت زدن)، از دست رفتن داده‌های حیاتی، آسیب به اعتبار برند و مشکلات قانونی بشه. پس محافظت از ایمیل، یعنی محافظت از کل کسب و کار و زندگی دیجیتال ما.

    سوال: رایج‌ترین تهدیدهای ایمیلی چی هستن؟

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

    سوال: «ایمیل رمزگذاری شده» یعنی چی؟

    پاسخ: یعنی محتوای ایمیل شما از متن ساده و قابل خوندن، به یه متن به هم ریخته و کد شده تبدیل می‌شه. فقط گیرنده‌ای که «کلید» درست رو داشته باشه، می‌تونه این کد رو باز کنه و متن اصلی رو بخونه. این کار مثل گذاشتن نامه توی یه پاکت مهر و موم شده است و جلوی خوندن اطلاعات شما توسط افراد غیرمجاز در مسیر انتقال رو می‌گیره.

    سوال: چطوری می‌تونم امنیت ایمیلم رو بیشتر کنم؟ پنج تا راهکار اصلی بگین.

    پاسخ: حتما. این پنج کار رو همیشه انجام بدین:

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

    منابع

    • [2] What is Email Security? – GeeksforGeeks
    • [4] What Is Email Security? Definition & Best Practices | Proofpoint US
    • [6] Just a moment…
    • [8] What is Email Security? | Why Email Security is Important
    • [10] Gmail Email Security & Privacy Settings – Google Safety Center
    • [1] What is email security? | Cloudflare
    • [3] What Is Email Security? | Microsoft Security
    • [5] What is Email Security? Types of Services and Solutions – Check Point Software
    • [7] What is Email Security? Types, Tactics and Best Practices | Fortinet
    • [9] What Is Email Security? – Protect Against Email Threats – Cisco
  • وی‌پی‌ان چیست؟ چطور امنیت وب را افزایش می‌دهد؟

    بذارید از اسمش شروع کنیم. VPN مخفف عبارت Virtual Private Network هست. اگه بخوایم این سه کلمه رو از هم جدا کنیم و معنی کنیم، فهمیدنش خیلی ساده‌تر میشه:

    • Virtual (مجازی): یعنی فیزیکی نیست. شما برای وصل شدن بهش نیاز به هیچ سیم یا کابل خاصی ندارید. همه چیز دیجیتالی و روی هوا اتفاق میفته.
    • Private (خصوصی): این مهمترین بخششه. یعنی این شبکه مال شماست و کسی نمیتونه سرک بکشه ببینه دارید چیکار میکنید. اطلاعاتتون در امان هست.
    • Network (شبکه): چون چند تا دستگاه رو به هم وصل میکنه. حداقلش دستگاه شما (لپ‌تاپ، گوشی، تبلت) و سرور وی‌پی‌ان. این دوتا با هم کار میکنن تا یک ارتباط برقرار کنن.

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

    وی‌پی‌ان چطوری کار میکنه؟ یک نگاه به پشت صحنه

    خب، حالا که فهمیدیم وی‌پی‌ان چیه، بیاید یکم فنی‌تر به ماجرا نگاه کنیم ولی بازم به زبون ساده. وقتی شما دکمه «اتصال» یا Connect رو توی برنامه وی‌پی‌ان میزنید، چند تا اتفاق جالب پشت سر هم میفته:

    1. احراز هویت (Authentication): اول از همه، برنامه وی‌پی‌ان شما با سرور وی‌پی‌ان ارتباط برقرار میکنه. مثل یک دست دادن یا معرفی کردنه. سرور چک میکنه که شما واقعا همون کسی هستید که اجازه استفاده از سرویس رو دارید. این پروسه که بهش «هندشیک» یا handshake هم میگن، خیلی سریع اتفاق میفته و کلیدهای رمزنگاری بین دستگاه شما و سرور رد و بدل میشه.
    2. ساخت تونل (Tunneling): بعد از اینکه هویت شما تایید شد، وی‌پی‌ان یک «تونل» رمزنگاری شده روی بستر اینترنت ایجاد میکنه. این تونل امن، مسیر حرکت اطلاعات شما بین دستگاهتون و سرور وی‌پی‌ان هست.
    3. رمزنگاری (Encryption): حالا هر اطلاعاتی که شما میفرستید یا دریافت میکنید، قبل از اینکه از دستگاهتون خارج بشه، توسط برنامه وی‌پی‌ان رمزنگاری میشه. یعنی چی؟ یعنی تبدیل میشه به یک سری کدها و حروف درهم و برهم که اگه کسی وسط راه بهش دسترسی پیدا کنه، هیچی ازش نمیفهمه. مثل اینکه دارید به یک زبون رمزی حرف میزنید که فقط شما و سرور وی‌پی‌ان بلدید. فقط سرور وی‌پی‌ان کلید باز کردن این قفل و خوندن اطلاعات رو داره.
    4. کپسوله‌سازی (Encapsulation): برای اینکه امنیت بسته‌های اطلاعاتی شما بیشتر هم بشه، وی‌پی‌ان هر بسته اطلاعاتی رو داخل یک بسته دیگه قرار میده و اون بسته بیرونی رو رمزنگاری میکنه. مثل اینه که نامه‌تون رو بذارید توی یک پاکت، بعد اون پاکت رو هم بذارید توی یک صندوقچه قفل‌دار. این کار هسته اصلی تونل وی‌پی‌ان رو تشکیل میده و باعث میشه اطلاعات موقع جابجایی امن بمونن.
    5. ارسال و رمزگشایی (Decryption): اطلاعات رمزنگاری شده شما از طریق اون تونل امن به سرور وی‌پی‌ان میرسه. سرور با استفاده از کلید خصوصی خودش، قفل رو باز میکنه، اطلاعات رو از حالت رمز خارج میکنه (رمزگشایی) و به شکل قابل فهم درمیاره.
    6. ارسال به مقصد نهایی: حالا سرور وی‌پی‌ان، درخواست شما رو (مثلا باز کردن یک سایت) به اینترنت میفرسته. اما با یک تفاوت بزرگ: این درخواست دیگه با آدرس IP شما فرستاده نمیشه، بلکه با آدرس IP خود سرور وی‌پی‌ان فرستاده میشه. اینجاست که هویت شما مخفی میمونه.

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

    به طور خلاصه، سه تا کار اصلی و مهم انجام میده:

    • رمزنگاری: ترافیک اینترنت شما رو به کد تبدیل میکنه تا خوندنش برای دیگران خیلی سخت بشه.
    • امنیت انتقال داده: حتی وقتی از وای‌فای‌های عمومی و ناامن استفاده میکنید، وی‌پی‌ان یک لایه امنیتی اضافه میکنه تا اطلاعاتتون راحت دزدیده نشن.
    • پنهان کردن آدرس IP (IP Address Masking): وقتی به وی‌پی‌ان وصل میشید، آدرس IP واقعی شما مخفی میشه و آدرس IP سرور وی‌پی‌ان جایگزینش میشه. اینطوری به نظر میرسه که شما از یک شهر یا کشور دیگه به اینترنت وصل شدید و این کار حریم خصوصی شما رو موقع وب‌گردی خیلی بیشتر میکنه.

    چرا اصلا باید از وی‌پی‌ان استفاده کنیم؟ (کاربردها و مزایا)

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

    ۱. حفظ حریم خصوصی

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

    ۲. امنیت در شبکه‌های وای‌فای عمومی

    وای‌فای‌های عمومی مثل وای‌فای کافه، فرودگاه یا کتابخونه خیلی وسوسه‌انگیزن، اما به همون اندازه هم میتونن خطرناک باشن. این شبکه‌ها معمولا امنیت پایینی دارن و پسورد ندارن. این یعنی هکرها و افراد سودجو میتونن راحت به این شبکه وصل بشن و اطلاعاتی که بین دستگاه شما و اینترنت رد و بدل میشه رو شنود کنن. به این کار میگن «داده‌ربایی» یا data sniffing. اگه شما توی یک شبکه عمومی به حساب بانکی‌تون سر بزنید یا یک خرید آنلاین انجام بدید، اطلاعات حساس شما مثل رمز عبور یا شماره کارت بانکی در معرض خطر جدی قرار میگیره.

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

    ۳. دور زدن محدودیت‌های جغرافیایی (Geo-restriction)

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

    وی‌پی‌ان با تغییر دادن آدرس IP شما این مشکل رو حل میکنه. شما میتونید به یک سرور در کشور مورد نظرتون وصل بشید و اون سایت فکر میکنه شما واقعا در همون کشور هستید. اینطوری میتونید به محتوایی که قبلا براتون قفل بود دسترسی پیدا کنید.

    ۴. جلوگیری از سرقت هویت

    سرقت هویت یک مشکل رو به رشده که هکرها اطلاعات شخصی شما رو میدزدن تا از کارت‌های بانکی شما استفاده کنن، به حساب‌هاتون دسترسی پیدا کنن یا حتی به اسم شما کارهای غیرقانونی انجام بدن. وی‌پی‌ان با رمزنگاری اطلاعات شما در تونل امن، کار رو برای کلاهبردارها سخت میکنه که به اطلاعات شما دسترسی پیدا کنن، مخصوصا در شبکه‌های ناامن. همینطور با مخفی کردن IP، شما رو در برابر حملات سایبری مثل حملات DDoS (Distributed Denial of Service) محافظت میکنه. اگه کسی IP واقعی شما رو ندونه، نمیتونه علیه شما حمله‌ای رو شروع کنه.

    ۵. دسترسی به اطلاعات حساس

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

    ۶. جلوگیری از محدودیت سرعت اینترنت (Bandwidth Throttling)

    گاهی وقت‌ها، ارائه‌دهنده اینترنت (ISP) شما ممکنه سرعت اینترنتتون رو بسته به فعالیت‌هایی که انجام میدید، عمدا کم کنه. مثلا وقتی دارید فیلم استریم میکنید یا فایل‌های حجیم دانلود میکنید، چون این کارها پهنای باند زیادی مصرف میکنه، ISP ممکنه سرعت شما رو محدود کنه تا فشار روی شبکه کمتر بشه. به این کار میگن Throttling.

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

    ۷. کار از راه دور (Remote Work)

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

    انواع مختلف وی‌پی‌ان‌ها: هر کدوم به چه دردی میخورن؟

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

    اسمنوعروش اتصالکاربرد
    وی‌پی‌ان دسترسی از راه دور (Remote Access VPN)خانگی/شخصیاتصال به یک شبکه خصوصی یا سرور شخص ثالث از طریق SSL/TLSبرای کارمندهای دورکار و کاربران عادی که دنبال حریم خصوصی هستن
    وی‌پی‌ان سایت به سایت (Site-to-site VPN)خصوصییک شبکه از طریق LAN یا WAN به شبکه دیگری وصل میشهبرای اتصال دفترهای مختلف یک شرکت بزرگ به هم
    اپلیکیشن‌های وی‌پی‌ان (VPN Applications)موبایلاتصال به شبکه خصوصی از طریق اپلیکیشن روی گوشی هوشمندبرای کاربرانی که در حال حرکت هستن و امنیت روی موبایل براشون مهمه

    حالا بیاید هر کدوم از اینها رو یکم بیشتر باز کنیم:

    ۱. وی‌پی‌ان دسترسی از راه دور (Remote Access VPN)

    این مدل که بهش Client-to-Site یا Host-to-Network هم میگن، رایج‌ترین نوع وی‌پی‌انه که اکثر ماها باهاش سر و کار داریم. در این حالت، یک کاربر (یا یک دستگاه) از راه دور به یک شبکه خصوصی وصل میشه. این میتونه شبکه شرکت شما باشه یا سرورهای یک شرکت ارائه‌دهنده وی‌پی‌ان تجاری.

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

    ۲. وی‌پی‌ان سایت به سایت (Site-to-site VPN)

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

    این کار از طریق دستگاه‌های خاصی به اسم «دروازه» یا Gateway در هر دو طرف انجام میشه. در واقع این یک تونل دائمی و پایدار بین دو تا شبکه ایجاد میکنه. به این مدل، Network-to-Network هم میگن. وی‌پی‌ان‌های سایت به سایت خودشون دو نوع دارن:

    • اینترانت (Intranet): وقتی شعبه‌های مختلف یک سازمان به هم وصل میشن. مثلا دفترهای مختلف یک شرکت در شهرهای مختلف با هم در ارتباط هستن.
    • اکسترانت (Extranet): وقتی شبکه‌های چند سازمان مختلف به هم وصل میشن. مثلا یک شرکت برای همکاری با شرکای تجاری یا تامین‌کننده‌هاش، یک شبکه امن مشترک درست میکنه. در این حالت میشه سطح دسترسی‌ها رو هم مدیریت کرد تا هر سازمان فقط به منابع مشخصی دسترسی داشته باشه.

    ۳. وی‌پی‌ان موبایل (Mobile VPN)

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

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

    پروتکل‌های وی‌پی‌ان: موتورهای پشت پرده

    تا اینجا فهمیدیم وی‌پی‌ان چیه و چیکار میکنه. اما چیزی که قدرت و امنیت یک وی‌پی‌ان رو تعیین میکنه، «پروتکل» اونه. پروتکل مثل یک مجموعه از قوانین و دستورالعمل‌هاست که مشخص میکنه تونل امن چطوری ساخته بشه و اطلاعات چطوری رمزنگاری بشن. یک وی‌پی‌ان فقط وقتی میتونه امنیت شما رو تضمین کنه که از یک پروتکل قوی استفاده کنه. بیاید با چند تا از معروف‌ترین پروتکل‌ها آشنا بشیم:

    اسم پروتکلرمزنگاریمسیریابیبهترین کاربرد
    OpenVPN256-bit AES با OpenSSLTCP و UDP, SSL/TLSبهترین گزینه برای استفاده عمومی (ترکیب خوب سرعت و امنیت)
    SSTP256-bit AESTCP, SSL/TLSبهترین گزینه برای ویندوز (چون مایکروسافت ساختتش)
    IKEv2 / IPSec256-bit AESUDPبهترین گزینه برای موبایل (به خاطر پایداری در جابجایی)
    L2TP / IPSec256-bit AESUDPگزینه خوب برای راه‌اندازی‌های اولیه و ساده
    PPTP128-bitTCPهیچ؛ منسوخ شده و ناامن
    WireGuard256-bit AESUDPبهترین گزینه برای کسانی که دنبال تکنولوژی جدید و سرعت بالا هستن

    یک توضیح کوتاه در مورد هر پروتکل:

    • OpenVPN: این پروتکل به نوعی استاندارد صنعتی حساب میشه. منبع باز (Open-source) هست، یعنی کدهاش در دسترس همه قرار داره تا کارشناس‌های امنیتی اون رو بررسی کنن و ایرادهاش رو پیدا کنن. این شفافیت باعث میشه خیلی قابل اعتماد باشه. هم امنه، هم سریع و هم خیلی انعطاف‌پذیر.
    • SSTP (Secure Socket Tunneling Protocol): این پروتکل توسط مایکروسافت ساخته شده و به صورت پیش‌فرض روی سیستم‌عامل ویندوز وجود داره. امنیت خوبی داره و چون مایکروسافت ازش پشتیبانی میکنه، برای کاربرهای ویندوز گزینه خیلی خوبیه.
    • IKEv2/IPsec: اسم کاملش هست Internet Key Exchange version 2. این پروتکل معمولا با IPsec (Internet Protocol Security) ترکیب میشه تا امنیت و سرعت بهینه‌ای داشته باشه. بزرگترین مزیتش اینه که در شرایط اینترنت ناپایدار خیلی خوب کار میکنه و برای موبایل ایده‌آله. مثلا وقتی از وای‌فای به اینترنت 4G سوییچ میکنید، اتصالش قطع نمیشه.
    • L2TP/IPsec: این پروتکل هم مثل قبلی، با IPsec ترکیب میشه تا امن‌تر بشه. راه‌اندازیش نسبتا ساده است اما امروزه خیلی از ارائه‌دهنده‌ها دیگه ازش پشتیبانی نمیکنن چون گزینه‌های بهتری مثل OpenVPN و WireGuard وجود داره.
    • PPTP (Point-to-Point Tunneling Protocol): این یکی از قدیمی‌ترین پروتکل‌هاست و امروزه دیگه منسوخ شده حساب میشه. مشکلات امنیتی زیادی داره و دیگه به عنوان یک گزینه امن شناخته نمیشه. بعضی از وی‌پی‌ان‌های رایگان ممکنه هنوز ازش استفاده کنن که باید خیلی مراقب بود.
    • WireGuard: این یک پروتکل نسبتا جدیده که خیلی سر و صدا کرده. کدنویسیش خیلی سبک‌تر و مدرن‌تره، سرعتش خیلی بالاست و با موبایل هم سازگاری عالی داره. مثل OpenVPN، این هم یک پروژه منبع بازه. در سال ۲۰۲۰، پشتیبانی از وایرگارد به هسته لینوکس و اندروید اضافه شد که این موضوع راه رو برای استفاده گسترده‌تر ازش باز کرد.

    علاوه بر اینها، پروتکل‌های دیگه‌ای هم وجود دارن که کمتر رایج هستن مثل:

    • DTLS (Datagram Transport Layer Security): در وی‌پی‌ان‌هایی مثل Cisco AnyConnect و OpenConnect استفاده میشه تا مشکلاتی که TLS با تونل‌زنی روی TCP داره رو حل کنه.
    • MPPE (Microsoft Point-to-Point Encryption): با پروتکل PPTP کار میکنه.
    • SSH VPN: ابزار OpenSSH قابلیت تونل‌زنی وی‌پی‌ان رو فراهم میکنه اما بیشتر برای اتصال از راه دور به ماشین‌ها استفاده میشه تا یک اتصال سایت به سایت.

    موقع انتخاب یک وی‌پی‌ان خوب، به چه چیزهایی دقت کنیم؟

    حالا که اطلاعاتتون کامل شد، اگه تصمیم گرفتید از یک وی‌پی‌ان استفاده کنید، باید بدونید که چطور یک سرویس خوب رو انتخاب کنید. بازار پر از گزینه‌های مختلفه، اما شما باید دنبال یک شرکت معتبر با سابقه خوب و ارزش‌های قابل اعتماد باشید. این ویژگی‌ها رو در نظر بگیرید:

    1. پروتکل‌های قوی: مهمترین ویژگی یک وی‌پی‌ان، امنیته. پس دنبال سرویسی باشید که از پروتکل‌های استاندارد صنعتی با رمزنگاری 256-bit AES استفاده میکنه. این همون سطح از رمزنگاریه که بانک‌ها و ارتش ازش استفاده میکنن. امروزه این یعنی باید سراغ سرویس‌هایی برید که از OpenVPN، IKEv2/IPsec یا WireGuard پشتیبانی میکنن و از پروتکل‌های منسوخ شده مثل PPTP دوری میکنن. بهترین ارائه‌دهنده‌ها به شما اجازه میدن بین چند پروتکل مختلف انتخاب کنید.
    2. سیاست عدم ثبت گزارش (Zero-log Policy): شما از وی‌پی‌ان استفاده میکنید تا از چشم دیگران مخفی بمونید، اما خود شرکت وی‌پی‌ان از نظر تئوری میتونه تمام کارهای شما رو ببینه. برای همین خیلی مهمه شرکتی رو انتخاب کنید که در مورد سیاست ثبت گزارش‌هاش شفاف باشه. یک وی‌پی‌ان no-log یا zero-log یعنی اون شرکت هیچ‌کدوم از فعالیت‌های شما رو ثبت و ذخیره نمیکنه. این شامل گزارش‌های استفاده، گزارش‌های اتصال، داده‌های جلسات یا حتی آدرس IP واقعی شما میشه. اونها فقط اطلاعات اولیه مثل ایمیل و اطلاعات پرداخت شما رو نگه میدارن.
    3. تعداد و پراکندگی سرورها: اگه یک ارائه‌دهنده فقط تعداد کمی سرور در چند جای محدود داشته باشه، ممکنه با کاهش سرعت مواجه بشید. هر چی تعداد سرورها در سراسر جهان بیشتر باشه، هم کاربران بین سرورها پخش میشن و عملکرد بهتر میشه، و هم شما گزینه‌های بیشتری برای انتخاب موقعیت جغرافیایی دارید. اگه سرورها به شما نزدیک‌تر باشن، داده‌های شما مسافت کمتری رو طی میکنن و سرعت بهتر میشه.
    4. کیل سوییچ (Kill Switch): این یک ویژگی امنیتی خیلی مهمه. اگه به هر دلیلی اتصال وی‌پی‌ان شما قطع بشه، دستگاه شما به صورت خودکار به آدرس IP واقعی‌تون برمیگرده و هویت شما لو میره. کیل سوییچ جلوی این اتفاق رو میگیره. به محض اینکه اتصال وی‌پی‌ان قطع بشه، کیل سوییچ کل اتصال اینترنت شما رو قطع میکنه تا هیچ داده‌ای بدون محافظت ارسال نشه.
    5. محافظت از آدرس IP: یک ارائه‌دهنده خوب باید به شما گزینه‌هایی برای مسیریابی مجدد IP بده. مثلا IP اشتراکی (Shared IP) که چندین کاربر رو زیر یک IP گروه‌بندی میکنه و باعث میشه تشخیص فعالیت یک فرد خاص سخت‌تر بشه. همچنین قابلیت تعویض سریع و راحت سرورها به شما این امکان رو میده که موقعیت خودتون رو به راحتی تغییر بدید.
    6. سازگاری با موبایل: اگه امنیت روی موبایل براتون مهمه، دنبال سرویسی باشید که اپلیکیشن‌های موبایل خوبی داشته باشه و از پروتکل IKEv2/IPsec برای پایداری در جابجایی پشتیبانی کنه.
    7. قیمت (پولی در برابر رایگان): به طور کلی، بهتره از وی‌پی‌ان‌های رایگان دوری کنید. یک شرکت پولی، یک شرکت معتبر و واقعیه که از تکنولوژی و زیرساخت باکیفیت پشتیبانی میکنه. یک ارائه‌دهنده پولی احتمال خیلی کمتری داره که فعالیت‌های شما رو ثبت کنه و به شرکت‌های تبلیغاتی بفروشه. درسته که وی‌پی‌ان‌های پرمیوم هزینه ماهانه دارن، اما ارزش امنیت و آرامش خیالی که به دست میارید، خیلی بیشتر از اون هزینه است.
    8. پشتیبانی مشتری: مثل هر شرکت نرم‌افزاری دیگه‌ای، یک ارائه‌دهنده وی‌پی‌ان باید یک تیم پشتیبانی قابل اعتماد داشته باشه که در صورت بروز مشکل، بتونید باهاشون تماس بگیرید.

    محدودیت‌ها و تصورات اشتباه در مورد وی‌پی‌ان

    وی‌پی‌ان یک ابزار فوق‌العاده برای حفظ حریم خصوصی و امنیته، اما جادو نمیکنه. مهمه که بدونیم یک وی‌پی‌ان چه کارهایی رو نمیتونه انجام بده تا یک حس امنیت کاذب بهمون دست نده.

    • وی‌پی‌ان شما رو ۱۰۰ درصد ناشناس نمیکنه: رسیدن به ناشناس بودن کامل در اینترنت تقریبا غیرممکنه. وی‌پی‌ان یک ابزار عالی برای محافظت از حریم خصوصیه، اما ردپای دیجیتالی که شما موقع استفاده از اینترنت به جا میذارید رو نمیشه به طور کامل پاک کرد.
    • وی‌پی‌ان جلوی ویروس‌ها و بدافزارها رو نمیگیره: اگه شما روی یک لینک فیشینگ کلیک کنید یا یک فایل آلوده رو دانلود کنید، دستگاه شما ممکنه آلوده بشه، حتی اگه به وی‌پی‌ان وصل باشید. برای این کار شما به یک برنامه آنتی‌ویروس خوب نیاز دارید. بعضی وی‌پی‌ان‌ها قابلیت‌های اولیه بلاک کردن بدافزار رو دارن اما جایگزین آنتی‌ویروس نیستن.
    • وی‌پی‌ان جلوی کوکی‌ها (Cookies) رو نمیگیره: وی‌پی‌ان میتونه جلوی تبلیغ‌کننده‌ها رو بگیره که از کوکی‌ها برای هدف قرار دادن شما بر اساس IP استفاده کنن، اما خود کوکی‌ها همچنان روی مرورگر شما ذخیره میشن.
    • هنوز هم ممکنه هک بشید: اگه شما اصول اولیه امنیت سایبری رو رعایت نکنید، حتی با وجود وی‌پی‌ان هم در خطر هستید. وی‌پی‌ان از شما در برابر بی‌احتیاطی خودتون محافظت نمیکنه.
    • وی‌پی‌ان معمولا سرعت اینترنت رو کم میکنه: فرایند رمزنگاری و فرستادن اطلاعات به یک سرور دور، زمان‌بره و به طور طبیعی مقداری از سرعت شما رو کم میکنه. این یک نتیجه اجتناب‌ناپذیره. البته اگه از یک وی‌پی‌ان باکیفیت استفاده کنید، این کاهش سرعت به سختی قابل تشخیصه.

    آیا استفاده از وی‌پی‌ان قانونیه؟

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

    نکته مهم اینه که انجام فعالیت‌های غیرقانونی آنلاین، چه با وی‌پی‌ان و چه بدون اون، همچنان غیرقانونیه.

    پرسش و پاسخ‌های متداول

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

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

    سوال: آیا وی‌پی‌ان من رو از ردیابی ISP محافظت میکنه؟
    بله. وی‌پی‌ان با مسیریابی اتصال شما به یک سرور وی‌پی‌ان از راه دور، آدرس IP شما رو مخفی میکنه و موقعیت مکانی شما رو پنهان میکنه. با مخفی شدن این اطلاعات، هویت شما خصوصی باقی میمونه و ارائه‌دهنده اینترنت (ISP)، شرکت‌های تبلیغاتی و مجرمان سایبری نمیتونن شما رو ردیابی کنن.

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

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

    سوال: چطوری یک وی‌پی‌ان نصب کنم؟
    برای نصب یک وی‌پی‌ان، اپلیکیشن ارائه‌دهنده مورد نظرتون رو دانلود کنید، اجراش کنید و وارد حساب کاربری‌تون بشید. بعد از اون، میتونید به سرور دلخواهتون وصل بشید تا اتصال اینترنتتون امن بشه.

    منابع

    • [2] Virtual private network – Wikipedia
    • [4] What is a VPN – Meaning and all you need to know – Surfshark
    • [6] Everything You Need to Know About VPNs and How They Work – CNET
    • [8] What is a VPN and what does it do? – Norton
    • [1] What is a VPN and why it’s important : r/VPN
    • [3] What is a VPN? Why Should I Use a VPN? | Microsoft Azure
    • [5] What is a VPN? Virtual private network meaning | NordVPN
    • [7] Is a VPN actually worth it? : r/VPN
    • [9] What Is a Virtual Private Network (VPN)? – Cisco
  • اعتماد صفر یا Zero Trust، رویکرد نوین به امنیت سایبری

    بذارین اول از یه روش قدیمی شروع کنیم که بفهمیم چرا اصلا به یه چیز جدید مثل اعتماد صفر نیاز پیدا کردیم. تا همین چند سال پیش، شرکت‌ها و سازمان‌ها به امنیت شبکه مثل یه قلعه نگاه می‌کردن. یه قلعه محکم با دیوارهای بلند و یه خندق دورش. هر چیزی که بیرون این قلعه بود، «غیرقابل اعتماد» و «بد» حساب میشد و هر کسی یا هر چیزی که داخل قلعه بود، «قابل اعتماد» و «خوب» بود.

    فکر کنین شما کارمند یه شرکتین. وقتی وارد ساختمون شرکت میشین و به شبکه داخلی وصل میشین، انگار از پل متحرک قلعه رد شدین و وارد شدین. از اون لحظه به بعد، سیستم امنیتی شرکت به شما اعتماد کامل داشت. میگفت: «خب، این دیگه خودیه! بذار هر کاری میخواد بکنه.» شما میتونستین به همه فایل‌ها، پرینترها و سرورهای داخلی راحت دسترسی داشته باشین. این روش بهش میگن امنیت مبتنی بر محیط (Perimeter-based security).

    چرا دیگه مدل قلعه و خندق جواب نمیده؟

    این مدل تا وقتی خوب بود که همه کارمندها توی یه ساختمون بودن و همه اطلاعات شرکت روی سرورهای همون ساختمون بود. اما دنیای امروز خیلی فرق کرده:

    • دورکاری و کار هیبریدی: الان خیلی‌ها از خونه کار میکنن. دیگه کسی داخل قلعه نیست.
    • سرویس‌های ابری (Cloud): اطلاعات شرکت‌ها دیگه فقط روی سرورهای خودشون نیست. کلی از اطلاعات و نرم‌افزارها روی سرویس‌های ابری مثل مایکروسافت، آمازون و گوگل پخش شدن.
    • دستگاه‌های شخصی (BYOD): خیلی‌ها با لپ‌تاپ یا گوشی شخصی خودشون به شبکه شرکت وصل میشن.
    • اینترنت اشیا (IoT): کلی دستگاه مثل پرینترهای هوشمند، دوربین‌ها و سنسورها به شبکه وصلن که امنیت‌شون همیشه عالی نیست.

    با این همه تغییر، دیگه چیزی به اسم «محیط شبکه» یا همون دیوار قلعه وجود نداره. همه چیز پخش و پلاست. حالا اگه یه هکر بتونه یه جوری خودش رو برسونه داخل این شبکه گسترده (مثلا با دزدیدن رمز عبور یه کارمند دورکار)، اون وقت چی میشه؟ سیستم امنیتی قدیمی میگه: «اینم خودیه!» و هکر مثل شما میتونه به همه جا سرک بکشه. این حرکت هکر در داخل شبکه رو بهش میگن حرکت جانبی (Lateral Movement). اینجاست که فاجعه اتفاق می‌افته.

    تولد یک ایده جدید: اعتماد صفر (Zero Trust)

    حدود سال ۲۰۱۰، یه تحلیل‌گر از شرکت تحقیقاتی فارستر (Forrester Research) به اسم جان کیندرواگ (John Kindervag) اومد و گفت این مدل قلعه و خندق دیگه فایده نداره. اون یه ایده جدید مطرح کرد که اسمش رو گذاشت «اعتماد صفر».

    فلسفه اعتماد صفر خیلی ساده‌ست. میگه: «هرگز اعتماد نکن، همیشه بررسی کن» (Never trust, always verify).

    این یعنی چی؟ یعنی دیگه فرقی نمیکنه شما داخل شبکه شرکت باشین یا بیرونش. روی مبل خونه‌تون نشستین یا پشت میزتون توی اداره. هر بار که بخواین به یه فایل، یه نرم‌افزار یا هر منبع دیگه‌ای دسترسی پیدا کنین، سیستم باید هویت شما و سلامت دستگاه شما رو از اول بررسی کنه. انگار که یه نگهبان فوق‌العاده وسواسی دم در هر اتاق شرکت ایستاده و هر بار که میخواین وارد یه اتاق جدید بشین، کارت شناسایی شما رو چک میکنه، حتی اگه ده ثانیه پیش شما رو دیده باشه!

    پس اعتماد صفر یه محصول یا یه سرویس خاص نیست که بریم بخریم و نصب کنیم. این یه استراتژی و یه مدل فکری برای طراحی سیستم‌های امنیتیه. این مدل فرض میکنه که هکرها هم داخل شبکه هستن هم بیرونش. پس به هیچ‌کس و هیچ‌چیز به طور پیش‌فرض اعتماد نمیکنه.

    سه اصل اساسی در دنیای اعتماد صفر

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

    اصلتوضیح ساده و خودمونی
    بررسی صریح (Verify explicitly)همیشه هویت و مجوز دسترسی رو بر اساس تمام اطلاعات موجود چک کن. یعنی فقط به یه رمز عبور قانع نشو. ببین این کاربر کیه، از کجا وصل شده، دستگاهش چیه، وضعیت سلامت دستگاهش چطوره و… بعد اجازه بده.
    استفاده از دسترسی با حداقل امتیاز (Use least privilege access)به هر کاربر فقط و فقط به اندازه‌ای که برای انجام کارش نیاز داره دسترسی بده، نه بیشتر. مثل ارتش که به هر سرباز اطلاعات رو بر اساس نیاز به دانستن (need-to-know) میدن. وقتی هم کارش تموم شد، دسترسی رو ازش بگیر.
    فرض کردن رخنه امنیتی (Assume breach)همیشه فرض کن که هکرها همین الان داخل شبکه هستن. با این فرض، باید کاری کنی که اگه یه بخش از شبکه هک شد، هکر نتونه به بخش‌های دیگه بره و کل سیستم رو نابود کنه. باید محدوده خسارت یا اون «شعاع انفجار» (Blast Radius) رو به حداقل برسونی.

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

    اعتماد صفر چطوری کار میکنه؟ ستون‌های اصلی

    خب، حالا که با فلسفه‌اش آشنا شدیم، ببینیم در عمل چطوری پیاده‌سازی میشه. سازمان‌های مختلفی مثل موسسه ملی استاندارد و فناوری آمریکا (NIST) و آژانس امنیت سایبری و زیرساخت آمریکا (CISA) اومدن و مدل‌هایی برای پیاده‌سازی اعتماد صفر ارائه دادن. یکی از معروف‌ترین مدل‌ها، مدل CISA هست که پنج تا ستون اصلی داره. بیاید این ستون‌ها رو بشناسیم:

    ۱. هویت (Identity)

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

    • احراز هویت چندعاملی (MFA): دیگه وارد کردن یه رمز عبور کافی نیست. سیستم باید حداقل دو تا مدرک از شما بخواد تا مطمئن بشه خودتون هستین. مثلا بعد از وارد کردن رمز، یه کد هم به گوشی شما میفرسته. این روش باید در مقابل حملات فیشینگ هم مقاوم باشه.
    • کنترل مداوم: فقط اول کار هویت رو چک نمیکنیم. در تمام مدتی که به سیستم وصل هستین، رفتار شما زیر نظر گرفته میشه.
    • حداقل امتیاز: همونطور که گفتیم، هر کاربر فقط به منابعی که برای کارش ضروریه دسترسی داره.

    ۲. دستگاه (Device)

    هر دستگاهی که به شبکه وصل میشه (لپ‌تاپ، گوشی، سرور، پرینتر و…) یه نقطه ضعف بالقوه‌ست. پس باید حواس‌مون به دستگاه‌ها هم باشه.

    • لیست موجودی: سازمان باید یه لیست کامل و به‌روز از تمام دستگاه‌های مجاز داشته باشه. هر دستگاهی که تو این لیست نیست، حق ورود نداره.
    • بررسی سلامت دستگاه: قبل از اینکه به یه دستگاه اجازه اتصال داده بشه، سیستم باید سلامت اون رو چک کنه. مثلا ببینه آنتی‌ویروسش آپدیته؟ سیستم‌عاملش نسخه جدیده؟ برنامه مشکوکی روش نصب نیست؟
    • نظارت دائمی: وضعیت دستگاه‌ها به طور مداوم کنترل میشه تا اگه مشکلی پیش اومد، سریعا دسترسی اون دستگاه قطع بشه.

    ۳. شبکه/محیط (Network/Environment)

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

    • میکروسگمنتیشن (Microsegmentation): به جای تقسیم‌بندی سنتی شبکه، از این روش استفاده میشه که شبکه‌ها رو به بخش‌های خیلی ریزتر و امن‌تر تقسیم میکنه. اینطوری جلوی حرکت جانبی هکرها گرفته میشه. حتی منابعی که یه کاربر بهشون دسترسی نداره، اصلا براش قابل دیدن نیستن.
    • رمزنگاری ترافیک: تمام اطلاعاتی که در شبکه جابجا میشن، باید رمزنگاری بشن تا اگه کسی تونست اونها رو شنود کنه، چیزی ازشون نفهمه.
    • کنترل جریان داده: باید روی تمام داده‌هایی که وارد و خارج میشن نظارت دقیق وجود داشته باشه.

    ۴. اپلیکیشن و بار کاری (Application and Workload)

    نرم‌افزارها و سرویس‌هایی که روی سرورها (چه داخلی و چه ابری) اجرا میشن هم باید طبق اصول اعتماد صفر کنترل بشن.

    • مجوزدهی پویا: به جای اینکه یه بار به یه نرم‌افزار دسترسی بدیم و خلاص، دسترسی‌ها به صورت پویا و مداوم چک میشن.
    • نظارت بر ارتباطات: ارتباط بین نرم‌افزارهای مختلف هم زیر نظر گرفته میشه تا اگه رفتار غیرعادی دیده شد، سریعا جلوی اون گرفته بشه.
    • امنیت در فرآیند توسعه: اصول امنیتی باید از همون اول در فرآیند ساخت و توسعه نرم‌افزارها لحاظ بشه.

    ۵. داده (Data)

    و در نهایت، مهم‌ترین دارایی هر سازمانی، یعنی داده‌ها. هدف نهایی همه این کارها، محافظت از داده‌هاست.

    • دسته‌بندی و برچسب‌گذاری: داده‌ها باید بر اساس میزان حساسیت‌شون دسته‌بندی و برچسب‌گذاری بشن تا بشه سیاست‌های امنیتی مناسب رو براشون اعمال کرد.
    • رمزنگاری داده‌ها: همه داده‌ها، چه اونایی که روی هارد ذخیره شدن (at rest)، چه اونایی که در حال انتقال در شبکه هستن (in transit) و چه اونایی که دارن پردازش میشن (in use)، باید رمزنگاری بشن.
    • جلوگیری از نشت داده (Data Exfiltration): باید مکانیزم‌هایی وجود داشته باشه که جلوی خروج غیرمجاز داده‌های حساس از سازمان رو بگیره.

    دو ستون اضافه برای حرفه‌ای‌ها

    بعضی مدل‌های پیشرفته‌تر مثل مدل وزارت دفاع آمریکا (DoD)، دو تا ستون دیگه هم به این پنج تا اضافه میکنن:

    • مشاهده و تحلیل (Visibility and Analytics): باید ابزارهایی داشته باشیم که به طور مداوم همه اتفاقات شبکه رو ثبت و تحلیل کنن. اینطوری میشه رفتارهای مشکوک رو شناسایی کرد و به صورت هوشمندانه تصمیم‌های امنیتی گرفت.
    • اتوماسیون و هماهنگی (Automation and Orchestration): خیلی از این فرآیندها باید به صورت خودکار انجام بشن. سیستم باید بتونه به صورت اتوماتیک به تهدیدها واکنش نشون بده و سیاست‌های امنیتی رو بین سیستم‌های مختلف هماهنگ کنه.

    پیاده‌سازی اعتماد صفر: از کجا شروع کنیم؟

    پیاده‌سازی این مدل یه پروژه بزرگ و طولانیه و نمیشه یه شبه انجامش داد. اما سازمان‌ها میتونن قدم به قدم این مسیر رو طی کنن. این چند تا مرحله میتونه یه نقشه راه خوب باشه:

    • شناسایی و ارزیابی دارایی‌ها: اول از همه باید بدونیم چه چیزهای باارزشی داریم که باید ازشون محافظت کنیم. داده‌های حساس، نرم‌افزارهای مهم و…
    • تایید هویت کاربر و دستگاه: باید مطمئن بشیم هر کسی و هر دستگاهی همونیه که ادعا میکنه. استفاده از احراز هویت چندعاملی برای کاربرها و روش‌های تایید هویت برای دستگاه‌ها در این مرحله ضروریه.
    • تعریف سیاست‌های دسترسی: باید مشخص کنیم چه کسی، کی، چرا و چطور باید به منابع مختلف دسترسی داشته باشه. این سیاست‌ها باید خیلی دقیق و جزئی باشن.
    • نظارت و تست مداوم: بعد از پیاده‌سازی، باید به طور مداوم همه چیز رو زیر نظر داشته باشیم تا رفتارهای غیرعادی رو پیدا کنیم و سیاست‌هامون رو بر اساس تهدیدهای جدید به‌روز کنیم.

    یه فناوری کلیدی که برای پیاده‌سازی این مدل استفاده میشه ZTNA (Zero Trust Network Access) هست. ZTNA یه جور جایگزین مدرن برای VPN های قدیمیه. VPN شما رو به کل شبکه وصل میکرد، اما ZTNA فقط و فقط شما رو به همون نرم‌افزار یا منبعی که بهش نیاز دارین وصل میکنه و بقیه شبکه رو از شما مخفی نگه میداره.

    چرا دولت‌ها و شرکت‌های بزرگ به سمت اعتماد صفر میرن؟

    این موضوع انقدر جدی شده که حتی دولت‌ها هم وارد عمل شدن.

    • در سال ۲۰۲۱، رئیس جمهور آمریکا، جو بایدن، با فرمان اجرایی ۱۴۰۲۸، همه آژانس‌های فدرال دولت آمریکا رو موظف کرد که معماری اعتماد صفر رو پیاده‌سازی کنن. بعد از اون در ژانویه ۲۰۲۲، دفتر مدیریت و بودجه (OMB) هم استراتژی فدرال اعتماد صفر رو در یادداشت ۲۲-۰۹ منتشر کرد.
    • شرکت مایکروسافت هم در نوامبر ۲۰۲۳ ابتکاری به اسم Secure Future Initiative (SFI) رو شروع کرد که تعهدی چند ساله برای امن‌تر کردن محصولاتش هست. بخش بزرگی از این ابتکار، پیاده‌سازی سفت و سخت مدل اعتماد صفر در زیرساخت‌های خود مایکروسافته.

    این نشون میده که اعتماد صفر دیگه یه ایده تئوری نیست و به یه استاندارد مهم در دنیای امنیت تبدیل شده.

    مزایای اعتماد صفر چیه؟

    خب این همه دردسر برای چی؟ پیاده‌سازی این مدل چه فایده‌هایی داره؟

    • کاهش سطح حمله (Attack Surface): چون دسترسی‌ها خیلی محدود میشن و خیلی از منابع از دید کاربرهای غیرمجاز مخفی هستن، هکرها نقاط کمتری برای نفوذ پیدا میکنن.
    • جلوگیری از حرکت جانبی: حتی اگه یه هکر بتونه یه حساب کاربری یا یه دستگاه رو هک کنه، به خاطر میکروسگمنتیشن نمیتونه به راحتی در شبکه حرکت کنه و خسارت زیادی بزنه.
    • محافظت بهتر از داده‌ها: با رمزنگاری و کنترل دسترسی دقیق، داده‌ها در هر حالتی امن‌تر هستن.
    • پشتیبانی امن از دورکاری: این مدل برای دنیای امروز که پر از کارمندهای دورکار و سرویس‌های ابریه، کاملا طراحی شده و امنیت رو در این محیط‌های پراکنده فراهم میکنه.
    • افزایش دید و کنترل: چون همه چیز به طور مداوم ثبت و تحلیل میشه، مدیران شبکه دید خیلی بهتری روی اتفاقات دارن و میتونن سریع‌تر به تهدیدها واکنش نشون بدن.
    • ساده‌سازی زیرساخت: در بلندمدت، این مدل میتونه با حذف ابزارهای امنیتی قدیمی و پیچیده مثل VPN های سنتی، به ساده‌تر شدن زیرساخت IT کمک کنه.

    چالش‌های مسیر اعتماد صفر

    البته این مسیر گل و بلبل هم نیست و چالش‌هایی داره:

    • پیچیدگی و زمان‌بر بودن: تعریف و پیاده‌سازی سیاست‌های دقیق برای هر کاربر، دستگاه و منبع، کار فنی و مدیریتی خیلی زیادی میطلبه و ممکنه سال‌ها طول بکشه.
    • نیاز به تعهد سازمانی: این یه پروژه بزرگه که نیاز به هماهنگی بین بخش‌های مختلف IT و تعهد مدیران ارشد داره.
    • تجربه کاربری: اگه احراز هویت‌های مداوم خیلی اذیت‌کننده باشن، ممکنه کارمندها رو کلافه کنه. برای همین باید یه تعادل بین امنیت و راحتی کاربر برقرار کرد.
    • وابستگی به فروشنده‌ها: چون اعتماد صفر یه استاندارد صنعتی دقیق نیست، ممکنه سازمان‌ها به راه‌حل‌های اختصاصی یه شرکت خاص وابسته بشن و این در آینده مشکل‌ساز بشه.

    پرسش و پاسخ‌های متداول (یه جورایی امتحان آخر ترم!)

    خب، حالا که کل درس رو با هم مرور کردیم، بذارین چند تا سوال کلیدی که ممکنه تو ذهن‌تون باشه رو جواب بدیم.

    سوال ۱: پس اعتماد صفر یه نرم‌افزاره که باید بخریم؟

    نه دقیقا. اعتماد صفر یه استراتژی و یه چارچوب فکریه. البته برای پیاده‌سازی این استراتژی، شما به ابزارها و فناوری‌های مختلفی مثل ZTNA، سیستم‌های مدیریت هویت (IAM)، احراز هویت چندعاملی (MFA) و ابزارهای نظارتی نیاز دارین. اما نمیتونین برین تو مغازه و بگین «یه اعتماد صفر بدین»!

    سوال ۲: فرق اصلی اعتماد صفر با VPN چیه؟

    یه VPN سنتی شما رو به کل شبکه شرکت وصل میکنه و بهتون یه آدرس IP داخلی میده. از اون به بعد، انگار شما داخل «قلعه» هستین و به خیلی چیزها دسترسی دارین. اما ZTNA که بر اساس مدل اعتماد صفر کار میکنه، شما رو به شبکه وصل نمیکنه. بلکه یه تونل امن و مستقیم فقط بین شما و همون نرم‌افزاری که لازمش دارین ایجاد میکنه. اینطوری هم امنیت بالاتره و هم تجربه کاربری معمولا بهتر و سریع‌تره.

    سوال ۳: این مدل فقط برای شرکت‌های خیلی بزرگه؟

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

    سوال ۴: آیا اعتماد صفر امنیت رو صد در صد تضمین میکنه؟

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

    سوال ۵: SASE که این روزها زیاد میشنویم، چه ربطی به اعتماد صفر داره؟

    سوال خوبیه! SASE (Secure Access Service Edge) یه مدل معماری دیگه‌ست که خدمات شبکه (مثل SD-WAN) و خدمات امنیتی (مثل ZTNA، فایروال ابری و…) رو در قالب یه سرویس یکپارچه ابری ارائه میده. اعتماد صفر، فلسفه و چارچوب اصلی دسترسی در مدل SASE هست. به عبارت دیگه، SASE زیرساخت و سرویس‌ها رو فراهم میکنه و اعتماد صفر قوانین و مدل فکری حاکم بر اون زیرساخت رو تعیین میکنه. این دوتا مفهوم مکمل همدیگه هستن.

    منابع

    • [2] What Is Zero Trust? Zero Trust Security Model | Akamai
    • [4] Zero Trust security model – ITSAP.10.008 – Canadian Centre for Cyber Security
    • [6] What is Zero Trust Architecture? – Palo Alto Networks
    • [8] What is Zero-Trust outside of the marketing bs? : r/AskNetsec
    • [10] What Is Zero Trust? | Benefits & Core Principles – Zscaler
    • [1] What is Zero Trust? | Microsoft Learn
    • [3] Zero Trust security | What is a Zero Trust network? | Cloudflare
    • [5] What is Zero Trust? – Guide to Zero Trust Security | CrowdStrike
    • [7] What Is Zero Trust? | IBM
    • [9] What Is Zero-Trust Networking? – Cisco
  • DNS چیست؟ راهنمای کامل سیستم نام دامنه در اینترنت

    میخوایم در مورد DNS حرف بزنیم. فکر کن اینترنت یه شهر خیلی بزرگه و تو میخوای بری خونه دوستت. آدرس خونه دوستت رو بلدی، مثلا «خیابون آزادی، کوچه شماره ۵، پلاک ۱۰». این میشه اسم دامنه، مثل www.example.com. ولی پستچی برای رسوندن نامه به این آدرس نوشتاری یه چیزی کم داره، اون به یه کد پستی دقیق احتیاج داره، یه سری عدد مثل 192.168.1.1. این عددها همون آدرس‌های IP هستن.

    حالا DNS دقیقا کار همون اداره پستی رو میکنه که آدرس‌های نوشتاری رو به کد پستی‌های عددی تبدیل میکنه. DNS مخفف Domain Name System یا سیستم نام دامنه است. به زبان ساده، دفترچه تلفن کل اینترنته. ما آدم‌ها با اسم‌ها راحت‌تریم، مثل nytimes.com یا espn.com، ولی کامپیوترها و مرورگرها با عددها، یعنی آدرس‌های IP، کار میکنن. DNS میاد این وسط و اسم‌ها رو به عددها ترجمه میکنه تا مرورگر بتونه بفهمه باید به کجا وصل بشه و صفحه مورد نظر ما رو بیاره بالا.

    هر دستگاهی که به اینترنت وصل میشه، از گوشی هوشمندت گرفته تا لپ‌تاپ و سرورهای غول‌پیکر سایت‌های فروشگاهی، یه آدرس IP منحصر به فرد داره. این آدرس برای پیدا کردن اون دستگاه تو شبکه جهانی لازمه. بدون DNS، ما مجبور بودیم یه عالمه عدد مثل 192.168.1.1 (که مربوط به پروتکل IPv4 هست) یا حتی رشته‌های پیچیده‌تر جدید مثل 2400:cb00:2048:1::c629:d7a2 (مربوط به IPv6) رو حفظ کنیم. واقعا کار سختی میشد، نه؟ پس DNS این زحمت رو از دوش ما برداشته.

    وقتی تو آدرس یه سایت رو توی مرورگرت تایپ میکنی، یه فرایندی به اسم «تفکیک DNS» یا DNS resolution اتفاق میفته. این فرایند، اسم میزبان (hostname) مثل www.example.com رو به یه آدرس IP قابل فهم برای کامپیوتر، مثل 192.168.1.1، تبدیل میکنه. کل این ماجرا پشت صحنه اتفاق میفته و تو به عنوان کاربر، به جز وارد کردن آدرس سایت، کار دیگه‌ای انجام نمیدی.

    سفر یک درخواست DNS: از کامپیوتر تو تا قلب اینترنت

    برای اینکه بفهمیم این ترجمه چطوری انجام میشه، باید با بازیگرای اصلی این صحنه آشنا بشیم. چند نوع سرور مختلف دست به دست هم میدن تا این کار انجام بشه. بیا با هم سفر یه درخواست DNS رو مرحله به مرحله دنبال کنیم. فرض میکنیم که هیچ اطلاعاتی از قبل روی کامپیوتر یا توی شبکه ذخیره نشده (کش نشده) تا تمام مراحل رو ببینیم. معمولا این فرایند ۸ مرحله داره:

    1. شروع ماجرا از مرورگر تو: تو آدرس example.com رو توی مرورگرت میزنی و اینتر رو فشار میدی. این درخواست اول از همه به سمت یه سرور خاص به اسم DNS Recursive Resolver میره. این ریزالور معمولا توسط شرکت خدمات اینترنتی تو (ISP) فراهم میشه.
    2. صحبت ریزالور با سرور ریشه (Root Server): ریزالور مثل یه کارآگاه عمل میکنه. اول از همه میره سراغ سرور ریشه یا Root Nameserver. این سرورهای ریشه، پدر بزرگ‌های کل سیستم DNS هستن و بالای هرم قرار دارن. سرور ریشه آدرس کامل example.com رو نمیدونه، ولی میتونه کارآگاه ما رو راهنمایی کنه. بهش میگه: «من نمیدونم example.com کجاست، ولی میدونم سرورهایی که دامنه‌های .com رو مدیریت میکنن کجان. برو از اونا بپرس». و آدرس سرور TLD مربوط به .com رو بهش میده.
    3. مراجعه به سرور دامنه سطح بالا (TLD Server): حالا ریزالور میره سراغ سرور دامنه سطح بالا یا Top-Level Domain (TLD) Nameserver. این سرورها مسئول دامنه‌هایی مثل .com، .org، .net و غیره هستن. ریزالور از سرور .com میپرسه: «آدرس example.com رو داری؟» سرور TLD هم جواب میده: «نه دقیقا، ولی میدونم کدوم سرور مسئول اصلی دامنه‌های example.com هست. این آدرسش، برو از خودش بپرس». این سرور مسئول، همون سرور نام معتبر یا Authoritative Nameserver هست.
    4. رسیدن به منبع اصلی؛ سرور نام معتبر (Authoritative Nameserver): بالاخره ریزالور به آخرین ایستگاه میرسه. سرور نام معتبر، سروریه که تمام اطلاعات و رکوردهای مربوط به دامنه example.com رو توی خودش ذخیره کرده. این سرور دیگه کسی رو پاس نمیده و جواب نهایی رو داره. ریزالور ازش آدرس IP دامنه example.com رو میپرسه و این سرور، آدرس IP دقیق، مثلا 93.184.216.34، رو به ریزالور میده.
    5. بازگشت پاسخ به ریزالور: حالا که ریزالور جواب رو پیدا کرده، یعنی آدرس IP رو به دست آورده، اون رو به کامپیوتر تو برمیگردونه.
    6. تحویل آدرس IP به مرورگر: کامپیوتر تو (به طور دقیق‌تر، سیستم عاملت) این آدرس IP رو از ریزالور میگیره و به مرورگری که درخواست رو شروع کرده بود، تحویل میده.
    7. ارسال درخواست HTTP به سرور سایت: حالا مرورگر دیگه اسم دامنه رو بیخیال شده و آدرس IP رو داره. یه درخواست HTTP مستقیم به اون آدرس IP میفرسته و میگه: «سلام، لطفا محتوای صفحه example.com رو برای من بفرست».
    8. دریافت محتوای سایت: سروری که سایت example.com روی اون قرار داره (و حالا ما با آدرس IP بهش وصلیم)، محتوای صفحه وب رو برای مرورگر تو میفرسته و تو میتونی سایت رو ببینی.

    این هشت مرحله در کسری از ثانیه اتفاق میفته. البته اگه اطلاعات کش شده باشن، خیلی از این مراحل حذف میشن و سرعت کار بالاتر میره که در ادامه در موردش حرف میزنیم.

    بازیگران اصلی صحنه DNS چه کسانی هستن؟

    توی سفر بالا با چند تا اسم آشنا شدیم. بیا یه بار دیگه دقیق‌تر ببینیم هر کدوم چیکار میکنن. چهار نوع سرور اصلی توی این فرایند دخیل هستن:

    • DNS Recursive Resolver (تفکیک کننده بازگشتی): این اولین ایستگاه درخواست توئه. کارش اینه که درخواست رو از کلاینت (کامپیوتر تو) بگیره و مثل یه کارآگاه سمج، اینقدر بگرده تا جواب نهایی (آدرس IP) رو پیدا کنه. این سرور خودش جواب رو نمیدونه، ولی بلده از کی بپرسه. معمولا ISP تو این سرور رو در اختیارت میذاره.
    • Root Nameserver (سرور نام ریشه): این سرورها در راس هرم DNS قرار دارن. کارشون اینه که درخواست‌ها رو به سمت سرور TLD درست هدایت کنن. در کل دنیا ۱۳ گروه سرور ریشه وجود داره که برای پایداری اینترنت حیاتی هستن.
    • TLD Nameserver (سرور نام دامنه سطح بالا): این سرورها مسئول یه بخش خاص از دامنه‌ها هستن. مثلا یه سرور TLD برای همه دامنه‌های .com وجود داره، یکی برای همه دامنه‌های .org و همینطور الی آخر. کار این سرورها اینه که درخواست رو به سمت سرور نام معتبر (Authoritative) دامنه مورد نظر هدایت کنن.
    • Authoritative Nameserver (سرور نام معتبر): این آخرین حلقه زنجیره است. این سرور اطلاعات کامل و نهایی رکوردهای DNS یه دامنه خاص رو داره. وقتی درخواست به اینجا میرسه، جواب قطعی پیدا میشه. این سرور دیگه نیاز نداره از کس دیگه‌ای سوال بپرسه و خودش «منبع حقیقت» برای اون دامنه است.

    یه نکته مهم: گاهی اوقات ما دنبال آدرس یه زیر دامنه هستیم، مثلا blog.cloudflare.com. در این حالت، یه سرور نام دیگه هم به این زنجیره اضافه میشه که بعد از سرور نام معتبر اصلی قرار میگیره و مسئول ذخیره رکوردهای اون زیر دامنه خاص (مثلا رکورد CNAME) هست.

    تفاوت بین سرویس‌های DNS

    شاید اسم‌هایی مثل Google DNS یا OpenDNS به گوشت خورده باشه. این‌ها سرویس‌های DNS Recursive Resolver عمومی هستن. یعنی شرکت‌هایی مثل گوگل یا سیسکو (صاحب OpenDNS) یه سری سرور ریزالور قدرتمند و سریع در سراسر دنیا راه انداختن که هر کسی میتونه ازشون استفاده کنه. مثلا آدرس DNS گوگل 8.8.8.8 هست. تو میتونی تنظیمات شبکه کامپیوترت رو طوری تغییر بدی که به جای استفاده از ریزالور ISP، از این سرویس‌ها استفاده کنی.

    اما این سرویس‌ها با کاری که شرکتی مثل Cloudflare انجام میده، یه فرق اساسی دارن. کلادفلر علاوه بر ارائه ریزالور عمومی، خودش میزبان بخشی از زیرساخت‌های اصلی اینترنت هم هست. مثلا کلادفلر در میزبانی شبکه F-root که یکی از همون سرورهای ریشه اصلی اینترنه، نقش داره. این سرورهای ریشه روزانه میلیاردها درخواست اینترنتی رو مدیریت میکنن.

    انواع درخواست‌ها (Query) در دنیای DNS

    توی فرایند پیدا کردن آدرس IP، سه نوع درخواست مختلف ممکنه رد و بدل بشه:

    1. Recursive Query (درخواست بازگشتی): این همون درخواستیه که کامپیوتر تو به ریزالور میفرسته. معنیش اینه: «لطفا این آدرس رو برام پیدا کن و جواب کامل رو بهم بده. یا بگو همچین آدرسی وجود نداره. خودت همه کارها رو بکن و من منتظر جواب نهایی میمونم».
    2. Iterative Query (درخواست تکراری): این نوع درخواست بین سرورهای DNS رد و بدل میشه. مثلا وقتی ریزالور از سرور ریشه سوال میپرسه، یه درخواست تکراری میفرسته. سرور ریشه با بهترین جوابی که داره (آدرس سرور TLD) پاسخ میده و میگه: «من جواب کامل رو ندارم، ولی برو از این یکی بپرس». ریزالور این فرایند رو اینقدر تکرار میکنه تا به جواب برسه.
    3. Non-Recursive Query (درخواست غیر بازگشتی): این درخواست زمانی اتفاق میفته که سرور DNS جواب رو از قبل توی حافظه خودش (کش) داشته باشه. در این حالت دیگه نیازی به پرس و جو از بقیه سرورها نیست و مستقیم جواب رو میده.

    کش کردن (Caching): راز سرعت بالای DNS

    همونطور که گفتیم، اگه قرار بود برای هر بار باز کردن یه سایت، تمام اون ۸ مرحله طی بشه، سرعت اینترنت خیلی پایین میومد. اینجا مفهومی به اسم کش کردن وارد بازی میشه. کش کردن یعنی ذخیره موقت داده‌ها در یه جای نزدیک‌تر به کاربر تا دفعه بعدی که به اون داده‌ها نیاز بود، سریع‌تر بهشون دسترسی پیدا کنیم. اطلاعات DNS در چند جا میتونن کش بشن:

    • کش مرورگر (Browser Caching): مرورگرهای مدرن، خودشون یه حافظه پنهان برای رکوردهای DNS دارن. وقتی یه آدرس رو وارد میکنی، مرورگر اول کش خودش رو نگاه میکنه. اگه آدرس IP اونجا بود، دیگه هیچ درخواستی به بیرون نمیفرسته و مستقیم به همون IP وصل میشه. این سریع‌ترین حالت ممکنه. مثلا در مرورگر کروم میتونی با رفتن به آدرس chrome://net-internals/#dns وضعیت کش DNS مرورگرت رو ببینی.
    • کش سیستم عامل (Operating System Caching): اگه جواب توی کش مرورگر نبود، درخواست به سیستم عامل (مثلا ویندوز یا مک) میرسه. سیستم عامل هم برای خودش یه کش DNS داره که بهش میگن Stub Resolver یا DNS Client. اونجا رو هم چک میکنه. اگه جواب بود، به مرورگر برمیگردونه.
    • کش ریزالور (Recursive Resolver Caching): اگه توی کامپیوتر تو هم جوابی پیدا نشد، درخواست به سرور Recursive Resolver (همونی که معمولا مال ISP هست) فرستاده میشه. این سرور هم یه کش خیلی بزرگ و قدرتمند داره. وقتی یه بار آدرس example.com رو پیدا میکنه، اون رو توی کش خودش ذخیره میکنه. دفعه بعدی که تو یا هر کس دیگه‌ای که از همون ISP سرویس میگیره، این آدرس رو درخواست کنه، ریزالور جواب رو از کش خودش میده و دیگه نیازی به پرس و جو از سرورهای ریشه و TLD نیست.

    مدت زمان اعتبار کش چقدره؟

    هر رکورد DNS یه مقداری به اسم TTL یا Time-to-Live داره. این مقدار که به ثانیه است، مشخص میکنه که اطلاعات اون رکورد تا چه مدت میتونه توی کش بمونه. مثلا اگه TTL یه رکورد ۳۶۰۰ ثانیه باشه، یعنی بعد از یک ساعت، کش منقضی میشه و دفعه بعدی که اون آدرس درخواست بشه، سرورها باید دوباره کل فرایند پرس و جو رو از اول انجام بدن تا اطلاعات به‌روز رو بگیرن. این TTL توسط مدیر اون دامنه تنظیم میشه.

    نگاهی عمیق‌تر به تاریخچه و ساختار DNS

    ایده استفاده از یه اسم ساده به جای آدرس عددی، به دوران آرپانت (ARPANET)، یعنی جد بزرگ اینترنت امروزی، برمیگرده. اون موقع موسسه تحقیقاتی استنفورد (SRI) یه فایل متنی به اسم HOSTS.TXT داشت که اسم‌ها رو به آدرس‌های عددی کامپیوترهای شبکه نگاشت میکرد. این کار به صورت دستی انجام میشد. یعنی هر وقت یه کامپیوتر جدید به شبکه اضافه میشد، باید با مرکز اطلاعات شبکه (NIC) که توسط الیزابت فینلر مدیریت میشد، تماس میگرفتن تا اسم و آدرسش رو به صورت دستی به این فایل اضافه کنن.

    با بزرگ شدن شبکه در اوایل دهه ۱۹۸۰، مدیریت این فایل متمرکز خیلی کند و سخت شد. اینجا بود که نیاز به یه سیستم خودکار احساس شد. پل موکاپتریس (Paul Mockapetris) در سال ۱۹۸۳ در دانشگاه کالیفرниای جنوبی، سیستم نام دامنه یا DNS رو ابداع کرد. مشخصات اولیه این سیستم در نوامبر ۱۹۸۳ در مستندهایی به اسم RFC 882 و RFC 883 منتشر شد و بعدا در نوامبر ۱۹۸۷ با RFC 1034 و RFC 1035 جایگزین و تکمیل شد. این سیستم از همون ابتدا یعنی سال ۱۹۸۵، یکی از اجزای حیاتی اینترنت بوده.

    اولین پیاده‌سازی سرور نام روی سیستم عامل یونیکس هم توسط چهار تا دانشجو از دانشگاه برکلی در سال ۱۹۸۴ نوشته شد که به BIND (Berkeley Internet Name Domain) معروف شد. BIND هنوز هم یکی از پراستفاده‌ترین نرم‌افزارهای سرور DNS در دنیاست.

    ساختار درختی و سلسله مراتبی DNS

    فضای نام دامنه یه ساختار درختی داره. هر گره یا برگ توی این درخت یه «برچسب» (Label) و صفر یا چند «رکورد منبع» (Resource Record) داره. اسم کامل دامنه از به هم چسبیدن این برچسب‌ها با نقطه به دست میاد.

    • ریشه (Root): بالای این درخت یه ریشه نامرئی وجود داره که با یه نقطه خالی «.» نشون داده میشه.
    • دامنه‌های سطح بالا (TLDs): اولین سطح زیر ریشه، TLD ها هستن مثل com، org، ir و… .
    • دامنه‌های سطح دوم: این‌ها دامنه‌هایی هستن که ما ثبت میکنیم، مثل example در example.com.
    • زیردامنه‌ها (Subdomains): هر چیزی که سمت چپ دامنه سطح دوم بیاد، زیردامنه حساب میشه. مثلا www در www.example.com یه زیردامنه از example.com هست. این ساختار درختی میتونه تا ۱۲۷ سطح عمق داشته باشه.

    قوانین نامگذاری دامنه‌ها:

    • هر برچسب (قسمت بین دو نقطه) میتونه بین ۰ تا ۶۳ کاراکتر داشته باشه.
    • اسم کامل دامنه نباید از ۲۵۳ کاراکتر بیشتر بشه.
    • کاراکترهای مجاز در اسم دامنه‌ها زیرمجموعه‌ای از کاراکترهای ASCII هستن: حروف a تا z (کوچک و بزرگ)، اعداد ۰ تا ۹ و خط تیره (-). به این قانون LDH (Letters, Digits, Hyphen) هم میگن.
    • اسم دامنه‌ها به حروف کوچک و بزرگ حساس نیستن (case-insensitive).
    • برچسب‌ها نمیتونن با خط تیره شروع یا تموم بشن.
    • برای پشتیبانی از زبان‌های دیگه مثل فارسی، سیستمی به اسم IDNA (Internationalizing Domain Names in Applications) به وجود اومد که رشته‌های یونیکد رو با استفاده از الگوریتمی به اسم Punycode به کاراکترهای مجاز DNS تبدیل میکنه.

    انواع رکوردهای DNS

    پایگاه داده DNS انواع مختلفی از رکوردها رو ذخیره میکنه که هر کدوم کاربرد خاص خودشون رو دارن. مهم‌ترین‌هاشون این‌ها هستن:

    نوع رکوردنام کاملکاربرد
    AAddress Recordیه اسم دامنه رو به یه آدرس IPv4 وصل میکنه.
    AAAAIPv6 Address Recordیه اسم دامنه رو به یه آدرس IPv6 وصل میکنه.
    CNAMECanonical Name Recordیه اسم دامنه رو به یه اسم دامنه دیگه ارجاع میده (مثل یه اسم مستعار).
    MXMail Exchange Recordمشخص میکنه کدوم سرور ایمیل مسئول دریافت ایمیل‌های یه دامنه است.
    NSName Server Recordسرورهای نام معتبر (Authoritative) یه دامنه رو مشخص میکنه.
    TXTText Recordاجازه میده یه متن دلخواه رو به دامنه مرتبط کنی. برای کارهای تاییدی و امنیتی زیاد استفاده میشه.
    SOAStart of Authority Recordاطلاعات مهم مدیریتی در مورد یه ناحیه (Zone) DNS رو نگهداری میکنه.
    SRVService Recordاطلاعات مربوط به یه سرویس خاص (مثل پروتکل‌های چت) رو در یه دامنه مشخص میکنه.
    PTRPointer Recordبرعکس رکورد A کار میکنه. یه آدرس IP رو به یه اسم دامنه وصل میکنه. برای Reverse DNS Lookup استفاده میشه.
    CAACertification Authority Authorizationمشخص میکنه کدوم مرکز صدور گواهی (CA) مجازه برای یه دامنه گواهی SSL صادر کنه.

    وقتی توی یه فایل تنظیمات DNS (که بهش Zone File میگن) علامتی مثل @ میبینی، معمولا به معنی خود دامنه اصلی (Origin) هست. مثلا اگه فایل برای mydomain.com باشه، @ همون mydomain.com رو نمایندگی میکنه.

    DNS Propagation یا انتشار DNS چیست؟

    این اصطلاحیه که وقتی تغییراتی توی رکوردهای DNS دامنه خودت میدی، زیاد میشنوی. DNS Propagation به زمانی گفته میشه که طول میکشه تا تغییرات جدیدی که اعمال کردی، در تمام سرورهای DNS در سراسر جهان منتشر و به‌روز بشه.

    در واقع از نظر فنی، DNS «منتشر» نمیشه. چیزی که اتفاق میفته اینه که سرورهای DNS در سراسر دنیا، اطلاعات قدیمی رو تا زمانی که TTL اون‌ها تموم نشده، توی کش خودشون نگه میدارن. پس وقتی تو یه تغییری میدی، باید صبر کنی تا کش سرورهای مختلف در سراسر دنیا منقضی بشه و اطلاعات جدید رو از سرور معتبر تو دریافت کنن. این فرایند میتونه از چند دقیقه تا ۴۸ یا حتی ۷۲ ساعت طول بکشه.

    چرا انتشار DNS اینقدر طول میکشه؟

    • تنظیمات TTL: اگه TTL رکوردهات رو بالا تنظیم کرده باشی (مثلا ۲۴ ساعت)، سرورها تا ۲۴ ساعت اطلاعات قدیمی رو نگه میدارن و تغییراتت دیرتر دیده میشه. یه راه برای سریع‌تر کردن این فرایند اینه که چند روز قبل از اعمال تغییرات مهم، TTL رو به یه مقدار خیلی کم (مثلا ۵ دقیقه) کاهش بدی.
    • کش کردن ISP ها: شرکت‌های اینترنتی (ISP) هم برای افزایش سرعت، نتایج DNS رو به شدت کش میکنن. گاهی اوقات بعضی از ISP ها حتی به TTL تعیین شده توسط تو هم احترام نمیذارن و اطلاعات رو بیشتر از زمان مشخص شده نگه میدارن.
    • ثبت‌کننده دامنه (Registrar): اگه بخوای سرورهای نام (NS) دامنه خودت رو عوض کنی (مثلا وقتی هاستت رو عوض میکنی)، این تغییر باید در سطح سرور TLD (مثلا سرور .com) هم اعمال بشه که این خودش میتونه باعث تاخیر بشه.

    برای چک کردن وضعیت انتشار DNS دامنه خودت، میتونی از ابزارهای آنلاینی مثل whatsmydns.net استفاده کنی. این سایت‌ها از سرورهای مختلفی در سراسر دنیا به دامنه تو درخواست میفرستن و نشون میدن که هر منطقه جغرافیایی، کدوم آدرس IP رو برای دامنه تو میبینه.

    امنیت و حریم خصوصی در DNS

    سیستم DNS در ابتدا بدون در نظر گرفتن مسائل امنیتی طراحی شده بود. چون اینترنت اولیه یه شبکه کوچیک و قابل اعتماد بود. اما با عمومی شدن اینترنت، مشکلات امنیتی هم خودشون رو نشون دادن.

    حملات رایج در DNS

    • DNS Cache Poisoning (مسموم کردن کش DNS): در این حمله، هکر داده‌های جعلی رو به کش یه سرور Recursive Resolver تزریق میکنه. مثلا آدرس IP سایت بانک رو با آدرس IP سرور خودش عوض میکنه. در نتیجه، کاربرانی که از اون ریزالور استفاده میکنن، وقتی آدرس سایت بانک رو وارد میکنن، به یه سایت جعلی هدایت میشن.
    • DNS Hijacking (ربودن DNS): در این حمله، هکر تنظیمات DNS کاربر رو تغییر میده تا درخواست‌های DNS به جای سرورهای معتبر، به سرورهای مخرب تحت کنترل هکر ارسال بشن.
    • DNS Tunneling (تونل‌زنی DNS): این یه تکنیک پیشرفته است که در اون، هکرها از پروتکل DNS برای انتقال داده‌های دیگه (که ربطی به DNS ندارن) استفاده میکنن. چون ترافیک DNS معمولا توسط فایروال‌ها و سیستم‌های امنیتی به عنوان ترافیک مجاز شناخته میشه، هکرها میتونن از این کانال برای فرمان دادن به بدافزارها در یه شبکه داخلی یا خارج کردن اطلاعات حساس (Data Exfiltration) استفاده کنن.


    راهکارهای افزایش امنیت و حریم خصوصی

    برای مقابله با این تهدیدات، راهکارهای مختلفی توسعه داده شده:

    • DNSSEC (Domain Name System Security Extensions): این یه افزونه برای DNS هست که با استفاده از امضای دیجیتال، از صحت و تمامیت داده‌های DNS محافظت میکنه. DNSSEC مطمئن میشه که جوابی که از سرور DNS میگیری، در مسیر دستکاری نشده و واقعا از طرف منبع معتبر ارسال شده.
    • DNS over TLS (DoT): در این روش، ارتباط بین کامپیوتر تو و سرور DNS با استفاده از پروتکل TLS (همون پروتکلی که برای HTTPS استفاده میشه) رمزنگاری میشه. این کار جلوی شنود و دستکاری درخواست‌ها و پاسخ‌های DNS رو میگیره. سرورهای DoT معمولا روی پورت ۸۵۳ کار میکنن.
    • DNS over HTTPS (DoH): این روش هم مثل DoT، ترافیک DNS رو رمزنگاری میکنه، با این تفاوت که درخواست‌های DNS رو در قالب ترافیک HTTPS قرار میده و از پورت ۴۴۳ استفاده میکنه. چون ترافیک HTTPS خیلی رایجه، تشخیص و مسدود کردن ترافیک DoH برای مدیران شبکه سخت‌تره.
    • DNSCrypt: این هم یه پروتکل دیگه برای رمزنگاری ترافیک DNS هست که قبل از DoT و DoH وجود داشت.

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

    یه نکته جالب: وقتی DNS معنی دیگه‌ای میده!

    حواست باشه که مخفف DNS فقط برای سیستم نام دامنه استفاده نمیشه. در دنیای پزشکی و توانبخشی، DNS مخفف Dynamic Neuromuscular Stabilization یا تثبیت دینامیک عصبی-عضلانی هم هست. این یه رویکرد درمانی و توانبخشیه که بر اساس حرکت‌شناسی تکاملی، یعنی جنبه‌های عصبی و فیزیولوژیکی رشد کودک، بنا شده. هدفش اینه که الگوهای حرکتی بهینه و تکاملی رو در بدن بازسازی کنه تا فشار روی بافت‌ها کم و عملکرد به حداکثر برسه. پس اگه جایی این مخفف رو دیدی، حواست باشه که ممکنه منظورشون اینترنت و دامنه نباشه!

    پرسش و پاسخ‌های متداول

    اینجا به چند تا سوال رایج که ممکنه برات پیش اومده باشه جواب میدیم.

    سوال: DNS دقیقا چیه و چیکار میکنه؟ اگه DNS من روی ISP تنظیم شده باشه، یعنی ISP میتونه ببینه من به چه سایت‌هایی میرم؟

    جواب: همونطور که گفتیم، DNS مثل دفترچه تلفن اینترنته و اسم سایت‌ها رو به آدرس عددی (IP) تبدیل میکنه. بله، وقتی از سرور DNS پیش‌فرض ISP خودت استفاده میکنی، اون‌ها میتونن تمام درخواست‌های DNS تو رو ببینن. این یعنی میدونن که تو تلاش کردی به چه دامنه‌هایی دسترسی پیدا کنی.

    سوال: اگه DNS رو به چیزی غیر از ISP تغییر بدم، آیا ISP دیگه نمیتونه فعالیت‌های من رو ببینه؟

    جواب: اگه DNS خودت رو مثلا به Google DNS (8.8.8.8) یا Cloudflare DNS (1.1.1.1) تغییر بدی، ISP تو دیگه نمیتونه لیست درخواست‌های DNS تو رو ببینه. به جای ISP، حالا اون شرکت ارائه‌دهنده DNS (مثلا گوگل یا کلادفلر) میتونه این درخواست‌ها رو ببینه. البته این کار باعث نمیشه کل فعالیت اینترنتی تو از دید ISP مخفی بشه. اون‌ها هنوز هم میتونن ببینن که تو به کدوم آدرس‌های IP متصل میشی، حتی اگه ندونن اون IP ها مال چه دامنه‌ای هستن (البته فهمیدنش کار سختی نیست). برای رمزنگاری کامل ترافیک، باید از سرویس‌هایی مثل VPN استفاده کنی.

    سوال: بهترین DNS برای حفظ حریم خصوصی و ناشناس بودن کدومه؟

    جواب: این سوال جواب قطعی نداره و به تعریف تو از «بهترین» بستگی داره. سرویس‌هایی وجود دارن که تمرکزشون روی حریم خصوصیه و ادعا میکنن که هیچ لاگی از درخواست‌های تو ذخیره نمیکنن. خیلی از این سرویس‌ها از پروتکل‌های رمزنگاری شده مثل DoH و DoT هم پشتیبانی میکنن. موقع انتخاب، باید به سیاست‌های حفظ حریم خصوصی (Privacy Policy) اون سرویس دقت کنی. سرویس‌هایی مثل کلادفلر (1.1.1.1) و Quad9 (9.9.9.9) به عنوان گزینه‌های متمرکز بر حریم خصوصی شناخته میشن.

    سوال: آیا تغییر دادن DNS خطرناکه؟

    جواب: نه، تغییر دادن DNS به خودی خود هیچ خطر ذاتی نداره. فقط باید مطمئن بشی که از یه ارائه‌دهنده DNS معتبر و قابل اعتماد استفاده میکنی. استفاده از یه سرور DNS نامعتبر میتونه تو رو در معرض حملاتی مثل هدایت شدن به سایت‌های مخرب قرار بده.

    سوال: DNS خصوصی (Private DNS) امنیت بیشتری داره؟

    جواب: بله، DNS خصوصی میتونه امنیت بیشتری نسبت به گزینه‌های دیگه ارائه بده. گزینه‌هایی مثل DNS over TLS یا DNS over HTTPS که در تنظیمات گوشی‌های اندرویدی جدید به اسم «Private DNS» وجود دارن، با رمزنگاری کردن درخواست‌های تو، امنیت و حریم خصوصی رو افزایش میدن.

    سوال: سرویس DNS روی گوشی من (مثلا آیفون) حجم زیادی از اینترنت مصرف کرده، چرا؟

    جواب: مصرف بالای داده توسط DNS Services میتونه دلایل مختلفی داشته باشه. ممکنه یکی از اپلیکیشن‌های روی گوشیت در پس‌زمینه به طور مداوم در حال ارسال تعداد زیادی درخواست DNS باشه. این میتونه نشانه فعالیت یه برنامه مخرب، یه برنامه با تنظیمات اشتباه یا حتی یه باگ باشه. بررسی برنامه‌هایی که اخیرا نصب کردی و کنترل دسترسی اون‌ها به اینترنت در پس‌زمینه میتونه کمک‌کننده باشه.

    سوال: چطوری میتونم DNS کامپیوتر خودم رو پیدا کنم؟

    جواب: روی ویندوز، میتونی Command Prompt رو باز کنی، دستور ipconfig /all رو تایپ کنی و اینتر بزنی. در خروجی، جلوی عبارت DNS Servers میتونی آدرس سرور یا سرورهایی که کامپیوترت ازشون استفاده میکنه رو ببینی.

    منابع

    • [2] DNS Propagation Checker – Global DNS Testing Tool
    • [4] domain name system – What’s the meaning of ‘@’ in a DNS zone file? – Server Fault
    • [6] What is DNS Services and why does it use … – Apple Community
    • [8] What Is DNS Tunneling? [+ Examples & Protection Tips] – Palo Alto Networks
    • [10] What is DNS? – Columbus Chiropractor & Rehabilitation Center
    • [1] What is DNS? | How DNS works | Cloudflare
    • [3] Understanding what is DNS : r/dns
    • [5] What is DNS? – Introduction to DNS – AWS
    • [7] Domain Name System – Wikipedia
    • [9] What Is Domain Name System (DNS)? | Fortinet
  • پلی‌رایت Playwright، راهنمای اتوماسیون و تست مرورگرها

    پلی‌رایت (Playwright). احتمالا اسمش رو شنیدید یا دیدید که توی شرکت‌ها و تیم‌های مختلف، بحث بین استفاده از این ابزار و ابزارهای قدیمی‌تر مثل سلنیوم (Selenium) یا حتی رقبای جدیدترش مثل سایپرس (Cypress) داغه. مثلا یه جا ممکنه یه توسعه‌دهنده جوون و تازه‌نفس بیاد و بگه «بیاید فریم‌ورک Robot Framework رو با پلی‌رایت جایگزین کنیم» و کل تیم رو به چالش بکشه. هدف ما اینجا اینه که ببینیم این پلی‌رایت اصلا چی هست، چطور کار میکنه، و چه چیزهایی رو باید در موردش بدونیم. پس آماده باشید که میخوایم قدم به قدم این ابزار رو کالبدشکافی کنیم.

    پلی‌رایت چیه و به چه دردی میخوره؟

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

    این ابزار با یه API واحد، بهت اجازه میده که تعاملات کاربر رو توی مرورگرهای کرومیوم (Chromium)، فایرفاکس (Firefox) و وب‌کیت (WebKit) شبیه‌سازی کنی.

    مهمترین کاربردهای پلی‌رایت اینها هستن:

    • تست End-to-End: از اول تا آخر یه سناریوی کاربری رو تست میکنه. مثلا از لاگین کردن گرفته تا اضافه کردن محصول به سبد خرید و پرداخت.
    • وب اسکرپینگ (Web Scraping): برای استخراج اطلاعات از وبسایت‌ها به صورت خودکار استفاده میشه.
    • مانیتورینگ عملکرد: عملکرد وبسایت رو زیر نظر میگیره تا ببینه همه چیز روان و سریع اجرا میشه یا نه.

    پلی‌رایت یه ویژگی خیلی مهم داره و اونم اینه که میتونه تست‌ها رو در حالت headless اجرا کنه. یعنی مرورگر باز میشه و کارها رو انجام میده، اما شما هیچ رابط کاربری گرافیکی یا پنجره‌ای ازش نمیبینید. همه چیز توی پس‌زمینه و از طریق خط فرمان اتفاق میفته. البته اگه بخواید، میتونید تنظیمش کنید که مرورگر رو به صورت کامل (non-headless) هم نشون بده.

    این ابزار روی پلتفرم‌های مختلف مثل ویندوز، لینوکس و macOS کار میکنه و میتونی با زبان‌های برنامه‌نویسی مختلفی مثل TypeScript، جاوااسکریپت، پایتون، دات‌نت و جاوا ازش استفاده کنی.

    ویژگی‌هایی که پلی‌رایت رو متمایز میکنه

    • Auto-wait (انتظار خودکار): یکی از دلایل اصلی که تست‌ها شکننده (flaky) میشن و گاهی کار میکنن و گاهی نه، اینه که اسکریپت تست زودتر از آماده شدن یه دکمه یا یه بخش از صفحه، میخواد روش کلیک کنه. پلی‌رایت به طور خودکار منتظر میمونه تا اون عنصر «قابل استفاده» بشه و بعد کارش رو انجام میده. اینطوری نیاز به استفاده از تایم‌اوت‌های مصنوعی که باعث دردسر میشن، از بین میره.
    • Web-first assertions (ادعاهای وب-محور): دستورات بررسی (assertions) توی پلی‌رایت مخصوص دنیای وب طراحی شدن. یعنی به طور خودکار یه شرط رو چک میکنن و اگه درست نبود، چند بار دیگه هم تلاش میکنن تا شاید اون شرط برقرار بشه.
    • Tracing (ردیابی): میتونی تست‌ها رو طوری تنظیم کنی که اگه شکست خوردن، یه گزارش کامل شامل ویدیو، اسکرین‌شات و تمام اتفاقاتی که افتاده رو بهت بده. اینجوری پیدا کردن دلیل مشکل خیلی راحت‌تر میشه.
    • ایزوله‌سازی کامل: پلی‌رایت برای هر تست، یه «کانتکست مرورگر» (browser context) جدید میسازه که مثل یه پروفایل کاملا نو و دست‌نخورده مرورگر میمونه. این کار باعث میشه تست‌ها روی هم اثر نذارن و کاملا از هم جدا باشن. ساختن این کانتکست‌ها هم خیلی سریعه و فقط چند میلی‌ثانیه طول میکشه.
    • پشتیبانی از سناریوهای پیچیده: میتونی سناریوهایی رو تست کنی که شامل چند تب، چند کاربر مختلف یا حتی چند مبدا (origin) متفاوت هستن.
    • رویدادهای قابل اعتماد (Trusted events): پلی‌رایت از پایپ‌لاین ورودی واقعی مرورگر استفاده میکنه. یعنی وقتی میگه روی یه چیزی کلیک کرده، اون کلیک از نظر مرورگر با کلیک یه کاربر واقعی هیچ فرقی نداره.

    نصب و راه‌اندازی اولیه پلی‌رایت

    خب، حالا که فهمیدیم پلی‌رایت چیه، بریم ببینیم چطور باید نصبش کنیم. قبل از هر چیز، باید Node.js نسخه ۲۰، ۲۲ یا ۲۴ روی سیستمت نصب باشه. سیستم‌عاملت هم میتونه ویندوز ۱۰ به بالا، macOS 14 به بالا، یا توزیع‌های لینوکس مثل دبیان ۱۲/۱۳ و اوبونتو ۲۲.۰۴/۲۴.۰۴ باشه.

    برای شروع، میتونی از دستور زیر توی ترمینال پروژه‌ات استفاده کنی:

    # با استفاده از npm
    npm init playwright@latest
    
    # با استفاده از yarn
    yarn create playwright
    
    # با استفاده از pnpm
    pnpm create playwright

    وقتی این دستور رو اجرا میکنی، چند تا سوال ازت میپرسه:

    • میخوای از TypeScript استفاده کنی یا JavaScript؟
    • اسم پوشه تست‌هات چی باشه؟ (معمولا tests یا e2e)
    • میخوای یه فایل workflow برای GitHub Actions اضافه بشه؟ (برای اجرای تست‌ها به صورت خودکار در محیط CI/CD خوبه)
    • مرورگرهای پلی‌رایت نصب بشن؟ (که معمولا جواب «بله» هست)

    بعد از اینکه این مراحل تموم شد، این فایل‌ها و پوشه‌ها به پروژه‌ات اضافه میشن:

    • playwright.config.ts: فایل اصلی تنظیمات پلی‌رایت. اینجا مشخص میکنی تست‌ها روی چه مرورگرهایی، با چه تنظیماتی و … اجرا بشن.
    • package.json: وابستگی‌های پروژه اینجا اضافه میشه.
    • tests/example.spec.ts: یه فایل تست نمونه خیلی ساده.
    • tests-examples/demo-todo-app.spec.ts: یه فایل تست نمونه کامل‌تر که میتونی ازش الگو بگیری.

    بعد از نصب اولیه، باید مرورگرها رو نصب کنی. این دستور هر سه مرورگر اصلی (کرومیوم، فایرفاکس و وب‌کیت) رو دانلود میکنه:

    npx playwright install

    اجرای تست نمونه

    حالا که همه چیز آماده‌ست، میتونی تست نمونه رو اجرا کنی. به طور پیش‌فرض، تست‌ها به صورت موازی و در حالت headless روی هر سه مرورگر اجرا میشن.

    # با استفاده از npm
    npx playwright test
    
    # با استفاده از yarn
    yarn playwright test
    
    # با استفاده از pnpm
    pnpm exec playwright test

    چند تا نکته برای اجرای تست‌ها:

    • اگه میخوای پنجره مرورگر رو ببینی، از فلگ --headed استفاده کن.
    • اگه میخوای تست‌ها فقط روی یه مرورگر خاص اجرا بشن، از --project=chromium استفاده کن.
    • برای اجرای فقط یه فایل تست خاص: npx playwright test tests/example.spec.ts
    • برای باز کردن رابط کاربری گرافیکی تست: --ui

    گزارش تست HTML

    بعد از اینکه تست‌ها تموم شدن، میتونی گزارش HTML رو ببینی. این گزارش بهت یه داشبورد کامل میده که میتونی تست‌ها رو بر اساس مرورگر، وضعیت (موفق، ناموفق، رد شده) فیلتر کنی. اگه تستی شکست خورده باشه، میتونی روش کلیک کنی و خطاها، فایل‌های ضمیمه و مراحل اجرا رو ببینی. این گزارش معمولا فقط وقتی تستی شکست بخوره به طور خودکار باز میشه، اما میتونی با دستور زیر هم به صورت دستی بازش کنی:

    npx playwright show-report

    مدیریت مرورگرها: قلب تپنده پلی‌رایت

    یکی از مهمترین مفاهیم توی پلی‌رایت، مدیریت مرورگرهاست. هر نسخه از پلی‌رایت برای کار کردن به نسخه‌های خیلی مشخصی از باینری‌های مرورگر نیاز داره. این یعنی هر بار که خود پلی‌رایت رو آپدیت میکنی، احتمالا باید دستور install رو دوباره اجرا کنی تا مرورگرهای سازگار با اون نسخه هم دانلود بشن.

    نصب مرورگرها و وابستگی‌ها

    همونطور که گفتیم، دستور اصلی برای نصب مرورگرها اینه:

    npx playwright install

    اما میتونی کارهای دیگه‌ای هم انجام بدی:

    • نصب یک مرورگر خاص:
      npx playwright install webkit
    • دیدن لیست تمام مرورگرهای قابل نصب:
      npx playwright install --help
    • نصب وابستگی‌های سیستمی: این دستور مخصوصا توی محیط‌های CI (Continuous Integration) خیلی به درد میخوره، چون تمام پکیج‌های مورد نیاز روی سیستم‌عامل رو نصب میکنه.
      npx playwright install-deps
    • نصب وابستگی‌های یک مرورگر خاص:
      npx playwright install-deps chromium
    • ترکیب نصب مرورگر و وابستگی‌ها:
      npx playwright install --with-deps chromium

    انواع مرورگرها و تنظیماتشون

    پلی‌رایت میتونه تست‌ها رو روی موتورهای اصلی رندر وب (کرومیوم، وب‌کیت، فایرفاکس) و همچنین مرورگرهای برنددار مثل گوگل کروم (Google Chrome) و مایکروسافت اج (Microsoft Edge) اجرا کنه.

    کرومیوم (Chromium)

    به طور پیش‌فرض، پلی‌رایت از بیلد اوپن‌سورس کرومیوم استفاده میکنه. یه نکته جالب اینه که پروژه کرومیوم همیشه از نسخه‌های نهایی مرورگرهایی مثل کروم جلوتره. یعنی وقتی نسخه N گوگل کروم تازه منتشر شده، پلی‌رایت już از کرومیوم نسخه N+1 پشتیبانی میکنه. این بهت کمک میکنه که مشکلات احتمالی وبسایتت با نسخه‌های آینده کروم رو زودتر پیدا کنی.

    پلی‌رایت دو تا بیلد از کرومیوم رو ارائه میده:

    1. بیلد معمولی کرومیوم: برای عملیات headed (با رابط کاربری).
    2. پوسته headless کرومیوم (chromium headless shell): یه نسخه سبک‌تر که فقط برای اجرای headless استفاده میشه.

    اگه تست‌هات رو فقط در حالت headless اجرا میکنی (مثلا روی CI)، میتونی موقع نصب با اضافه کردن فلگ --only-shell از دانلود کردن بیلد کامل کرومیوم جلوگیری کنی و در فضا صرفه‌جویی کنی.

    npx playwright install --with-deps --only-shell
    حالت headless جدید کروم:

    یه حالت headless جدید هم وجود داره که میتونی با استفاده از کانال «chromium» فعالش کنی. طبق مستندات خود کروم:

    حالت Headless جدید، در واقع خود مرورگر واقعی کروم هست و به همین دلیل معتبرتر، قابل اعتمادتر و با امکانات بیشتره. این باعث میشه برای تست‌های end-to-end با دقت بالا یا تست افزونه‌های مرورگر مناسب‌تر باشه.

    برای استفاده از این حالت، باید فلگ --no-shell رو موقع نصب بزنی تا پوسته headless قدیمی دانلود نشه.

    npx playwright install --with-deps --no-shell
    گوگل کروم و مایکروسافت اج

    پلی‌رایت میتونه با نسخه‌های برنددار کروم و اج که روی سیستم شما نصب هستن هم کار کنه (البته به طور پیش‌فرض اونها رو نصب نمیکنه). پلی‌رایت از کانال‌های Stable و Beta این مرورگرها پشتیبانی میکنه.

    کانال‌های موجود اینها هستن: chrome, msedge, chrome-beta, msedge-beta, chrome-dev, msedge-dev, chrome-canary, msedge-canary.

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

    npx playwright install msedge

    یه نکته مهم: این دستور، مرورگر رو در مسیر پیش‌فرض سیستم‌عامل نصب میکنه و ممکنه نسخه فعلی مرورگر شما رو بازنویسی کنه.

    چه زمانی از کروم/اج استفاده کنیم و چه زمانی نه؟
    • حالت پیش‌فرض (کرومیوم): در بیشتر موارد، استفاده از کرومیوم پیش‌فرض پلی‌رایت بهترین گزینه‌ست. چون جلوتر از نسخه‌های پایدار هست، بهت این اطمینان رو میده که آپدیت‌های آینده کروم وبسایتت رو خراب نمیکنه.
    • تست رگرسیون (Regression testing): بعضی وقت‌ها سیاست‌های تست شرکت ایجاب میکنه که تست‌ها حتما روی نسخه‌های عمومی و پایدار فعلی مرورگرها اجرا بشن. در این حالت، میتونی از کانال‌های chrome یا msedge استفاده کنی.
    • کدک‌های مدیا (Media codecs): کرومیوم به خاطر مسائل لایسنس، همه کدک‌های ویدیویی و صوتی که کروم و اج دارن رو شامل نمیشه. اگه وبسایتت به این کدک‌های خاص وابسته هست، باید از نسخه‌های رسمی استفاده کنی.
    • سیاست‌های سازمانی (Enterprise policy): کروم و اج به سیاست‌های سازمانی احترام میذارن. این سیاست‌ها ممکنه محدودیت‌هایی مثل پروکسی شبکه یا افزونه‌های اجباری ایجاد کنن که جلوی تست رو میگیرن. در این شرایط، راحت‌ترین کار اینه که برای تست‌های lokal از کرومیوم باندل شده استفاده کنی و روی سرورهای CI که معمولا این محدودیت‌ها رو ندارن، از کانال‌های پایدار استفاده کنی.
    فایرفاکس (Firefox)

    نسخه فایرفاکس پلی‌رایت با آخرین بیلد پایدار فایرفاکس مطابقت داره. پلی‌رایت با نسخه برنددار و نصب شده فایرفاکس روی سیستم شما کار نمیکنه، چون به یه سری پچ‌های خاص نیاز داره که خودش اعمال میکنه.

    وب‌کیت (WebKit)

    وب‌کیت پلی‌رایت هم از آخرین سورس‌های وب‌کیت گرفته میشه، حتی قبل از اینکه این تغییرات توی مرورگر سافاری اپل اعمال بشن. این هم بهت زمان میده تا برای آپدیت‌های احتمالی آینده آماده باشی. پلی‌رایت با نسخه برنددار سافاری هم کار نمیکنه و به پچ‌های خودش متکیه.

    چالش‌های پیشرفته: داکر، فایروال و مشکلات رایج

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

    پیش‌نصب مرورگرها در داکر برای CI

    یکی از مشکلات رایج اینه: یه نفر میخواد یه کانتینر داکر برای محیط CI بسازه که مرورگرها و وابستگی‌های پلی‌رایت از قبل روش نصب باشن تا مراحل تست سریع‌تر اجرا بشه. اون شخص دستور playwright install-deps رو توی Dockerfile اجرا میکنه و به نظر میاد مرورگر نصب میشه. اما وقتی به مرحله تست میرسه و دستور npx playwright install chromium رو توی پروژه اجرا میکنه، میبینه که مرورگر داره دوباره از اول دانلود میشه!

    این سوال مطرح میشه: چطور میشه مرورگرها رو در یک کانتینر داکر پیش‌نصب کرد بدون اینکه در مرحله تست دوباره دانلود بشن؟

    مستندات پلی‌رایت به طور خاص میگن که install-deps برای محیط‌های CI مفیده، اما باید مطمئن بشیم که مسیر نصب مرورگرها در مرحله ساخت ایمیج داکر و مرحله اجرای تست یکی باشه تا پلی‌رایت بتونه پیداشون کنه.

    ایمیج رسمی داکر پلی‌رایت:

    برای حل این مشکل، خود پلی‌رایت یه ایمیج رسمی داکر ارائه میده که روی اوبونتو ۲۴.۰۴ ساخته شده. توصیه میشه که از نسخه‌ای از این ایمیج استفاده کنید که با نسخه پلی‌رایت پروژه‌تون یکی باشه. اگه نسخه پلی‌رایت توی ایمیج داکر با نسخه پروژه‌تون نخونه، پلی‌رایت نمیتونه فایل‌های اجرایی مرورگر رو پیدا کنه.

    docker pull mcr.microsoft.com/playwright:v1.50.0-noble

    نصب پشت فایروال یا پروکسی

    به طور پیش‌فرض، پلی‌رایت مرورگرها رو از CDN مایکروسافت دانلود میکنه. بعضی شرکت‌ها یه پروکسی داخلی دارن که دسترسی مستقیم به اینترنت رو میبنده. در این حالت، باید پلی‌رایت رو تنظیم کنی که از طریق پروکسی دانلود کنه:

    # در Bash (لینوکس/macOS)
    HTTPS_PROXY=https://192.0.2.1 npx playwright install
    
    # در PowerShell (ویندوز)
    $Env:HTTPS_PROXY="https://192.0.2.1"
    npx playwright install

    اگه پروکسی شما از گواهی‌های دیجیتال (CA) نامعتبر استفاده میکنه و با خطای self signed certificate in certificate chain مواجه میشید، باید متغیر محیطی NODE_EXTRA_CA_CERTS رو تنظیم کنید.

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

    پلی‌رایت مرورگرها رو توی پوشه‌های کش مخصوص سیستم‌عامل ذخیره میکنه:

    • ویندوز: %USERPROFILE%\AppData\Local\ms-playwright
    • macOS: ~/Library/Caches/ms-playwright
    • لینوکس: ~/.cache/ms-playwright

    اگه بخوای این مسیر رو تغییر بدی، میتونی از متغیر محیطی PLAYWRIGHT_BROWSERS_PATH استفاده کنی. این کار بهت اجازه میده که مرورگرها رو توی یه پوشه اشتراکی نصب کنی و همه پروژه‌ها از همون استفاده کنن.

    # موقع نصب
    PLAYWRIGHT_BROWSERS_PATH=$HOME/pw-browsers npx playwright install
    
    # موقع اجرای تست
    PLAYWRIGHT_BROWSERS_PATH=$HOME/pw-browsers npx playwright test

    مشکل در NixOS: داستان کتابخانه‌های داینامیک

    یه چالش خیلی خاص برای کاربرای توزیع لینوکس NixOS پیش میاد. وقتی میخوان یه اسکریپت ساده پلی‌رایت رو اجرا کنن، با خطا مواجه میشن که میگه یه سری کتابخانه‌های اشتراکی (shared objects) پیدا نشدن.

    مشکل چیه؟

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

    راه حل چیه؟

    چند تا راه وجود داره، اما بهترین و ساده‌ترین راه اینه:

    1. استفاده از playwright-core: به جای پکیج کامل playwright، از پکیج playwright-core استفاده کنید. این پکیج مرورگرها رو به صورت خودکار دانلود نمیکنه.
    2. استفاده از کرومیوم خود NixOS: کرومیومی که از طریق Nixpkgs نصب میشه، به صورت استاتیک لینک شده و به کتابخانه‌های خارجی نیازی نداره.
    3. مشخص کردن مسیر اجرایی: توی کدتون، به پلی‌رایت بگید که به جای استفاده از کرومیوم خودش، از کرومیومی که روی سیستم نصب هست استفاده کنه.
    // به جای require('playwright')
    const { chromium } = require('playwright-core');
    
    const browser = await chromium.launch({
      // مسیر کرومیومی که با which chromium پیدا کردید
      executablePath: '/home/jack/.nix-profile/bin/chromium',
      headless: false
    });

    اینطوری پلی‌رایت دیگه دنبال وابستگی‌های داینامیک نمیگرده و مشکل حل میشه.

    اون روی سکه: شناسایی و بلاک کردن پلی‌رایت

    با اینکه پلی‌رایت یه ابزار قدرتمند برای تست هست، اما میشه ازش برای کارهای دیگه‌ای مثل کلاهبرداری خودکار، پر کردن اعتبارنامه‌ها (credential stuffing) و جمع‌آوری داده هم سوءاستفاده کرد. به همین دلیل، خیلی از وبسایت‌ها سعی میکنن ربات‌هایی که با پلی‌رایت ساخته شدن رو شناسایی و بلاک کنن.

    چطور پلی‌رایت در حالت headless شناسایی میشه؟

    • ویژگی Navigator WebDriver: پلی‌رایت در حالت headless، مقدار navigator.webdriver رو توی جاوااسکریپت true میکنه.
    • الگوهای زمانی و تعاملی غیرعادی: اسکریپت‌های پلی‌رایت خیلی سریع‌تر از یه کاربر واقعی کار میکنن. کلیک‌های سریع، زمان بارگذاری صفحه غیرطبیعی و نبود هیچ زمان بیکاری (idle time)، نشونه‌های ربات هستن.
    • نبود حرکات واقعی موس: تعاملات پلی‌رایت حرکات ارگانیک موس یا اسکرول کردن طبیعی رو تولید نمیکنه.
    • هدرهای HTTP سفارشی: درخواست‌های ارسالی توسط پلی‌رایت ممکنه هدرهای ناقص یا ناهماهنگی مثل sec-ch-ua یا user-agent داشته باشن.
    • انگشت‌نگاری (Fingerprinting): تست‌های انگشت‌نگاری از طریق WebGL، Canvas و Audio API در حالت headless نتایج متفاوتی نسبت به یه مرورگر واقعی تولید میکنن.

    چطور میشه پلی‌رایت رو بلاک کرد؟

    • چالش‌های مبتنی بر جاوااسکریپت: استفاده از تکنیک‌های انگشت‌نگاری برای ردیابی حرکات موس یا رندر WebGL.
    • تشخیص ناهنجاری رفتاری: تحلیل رفتار کاربر مثل لاگین‌های متوالی سریع یا حجم بالای درخواست.
    • کپچا (CAPTCHA) و محدودیت نرخ (Rate Limiting): استفاده از کپچاهای پیشرونده و محدود کردن تعداد درخواست‌ها در یک بازه زمانی.
    • بررسی درخواست در سمت سرور: مانیتور کردن هدرهای HTTP غیر استاندارد و الگوهای ترافیک انبوه.

    یک بحث مهم: موتور مرورگر در برابر خود مرورگر

    یه بحث جالبی که توسط یکی از متخصصان به اسم Maaret Pyhäjärvi مطرح شده اینه که وقتی میگیم «پلی‌رایت همه مرورگرهای اصلی رو اتوماتیک میکنه»، داریم یه کم ماجرا رو ساده‌سازی میکنیم.

    موتورهای مرورگر، خود مرورگرها نیستن.

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

    ایشون اشاره میکنه که با اومدن WebDriver Bidi برای همه مرورگرها، این پروتکل جایگزین CDP میشه و ممکنه شرایط رو تغییر بده.

    پرسش و پاسخ

    سوال ۱: آیا حتما باید هر سه مرورگر کرومیوم، فایرفاکس و وب‌کیت رو نصب کنم؟

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

    سوال ۲: فرق بین playwright و playwright-core چیه؟

    پکیج playwright نسخه کامل هست که شامل خود کتابخانه و اسکریپت‌های دانلود خودکار مرورگرهاست. اما playwright-core یه نسخه سبک‌تره که فقط API اصلی پلی‌رایت رو داره و مرورگرها رو به صورت خودکار دانلود نمیکنه. این پکیج برای سناریوهای خاصی مثل کار با NixOS یا وقتی که میخواید از یه مرورگر از قبل نصب شده روی سیستم استفاده کنید، کاربرد داره.

    سوال ۳: آیا میتونم از نسخه فایرفاکسی که خودم روی کامپیوترم نصب کردم با پلی‌رایت استفاده کنم؟

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

    سوال ۴: headless mode دقیقا یعنی چی؟

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

    سوال ۵: چرا تست‌های من روی CI شکست میخورن ولی روی کامپیوتر خودم درست کار میکنن؟

    این یکی از رایج‌ترین مشکلاته و دلایل زیادی میتونه داشته باشه. یکی از دلایل اصلی که به پلی‌رایت مرتبطه، میتونه مربوط به وابستگی‌های سیستمی باشه. ممکنه روی سیستم عامل سرور CI شما، پکیج‌ها و کتابخانه‌هایی که مرورگرها برای اجرا شدن بهشون نیاز دارن، نصب نباشه. به همین دلیله که دستور npx playwright install-deps خیلی مهمه و باید قبل از اجرای تست‌ها در محیط CI اجرا بشه. دلیل دیگه میتونه تفاوت در نسخه مرورگرها یا خود پلی‌رایت بین دو محیط باشه.

    سوال ۶: آپدیت کردن پلی‌رایت چطوریه و چه نکته‌ای داره؟

    برای آپدیت کردن پلی‌رایت، از دستور npm install -D @playwright/test@latest (یا معادلش در yarn/pnpm) استفاده میکنید. نکته بسیار مهم اینه که بعد از آپدیت خود پکیج پلی‌رایت، تقریبا همیشه باید مرورگرها رو هم آپدیت کنید. چون هر نسخه جدید پلی‌رایت برای نسخه‌های جدیدتر و مشخصی از مرورگرها طراحی شده. اگه این کار رو فراموش کنید و تست‌ها رو اجرا کنید، خود پلی‌رایت یه خطای واضح بهتون میده و میگه که فایل اجرایی مرورگر رو پیدا نکرده و ازتون میخواد که npx playwright install رو اجرا کنید.

    “`

    منابع

    • [2] Robot Framework – Selenium vs. Playwright – Robot Framework – Robot Framework
    • [4] Running playwright tests – Help – NixOS Discourse
    • [6] Supported Playwright versions, browsers and OSes for Playwright tests on BrowserStack Automate | BrowserStack Docs
    • [8] Sharding Playwright tests by browser – Brian Birtles’ Blog
    • [10] Fast and reliable end-to-end testing for modern web apps | Playwright
    • [12] Use Playwright to automate and test in Microsoft Edge – Microsoft Edge Developer documentation | Microsoft Learn
    • [14] Running playwright with the local firefox – Stack Overflow
    • [16] GitHub – microsoft/playwright: Playwright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API.
    • [18] Browsers | Playwright .NET
    • [20] Browsers | Playwright
    • [1] Pre-installing Playwright Browsers and Dependencies in a Docker Container for CI
    • [3] Failed to install the browsers – Playwright Automation tool – Stack Overflow
    • [5] microsoft/playwright – Docker Image | Docker Hub
    • [7] Browsers | Playwright Python
    • [9] Listened to yet another “playwright automates all the main browsers” and ended up collecting logos for sketch. | Maaret Pyhäjärvi
    • [11] node.js – How to update / upgrade Playwright? – Stack Overflow
    • [13] Browser | Playwright
    • [15] What is Playwright headless browser ? How to identify and block it
    • [17] Cypress vs Playwright : r/QualityAssurance
    • [19] Installation | Playwright
  • رابطه CSS و سئو

    قبل از اینکه بخوایم شیرجه بزنیم توی بحث اصلی، باید با سه تا از اصلی‌ترین ابزارهای ساخت وبسایت‌های امروزی آشنا بشیم: HTML، CSS و جاوا اسکریپت. این سه تا مثل اسکلت، پوست و سیستم عصبی یک وبسایت هستن.

    HTML: اسکلت و ساختار سایت

    HTML که مخفف Hypertext Markup Language هست، مثل فونداسیون و اسکلت یه ساختمون عمل میکنه. این زبان، محتوای سایت شما رو ساختاربندی میکنه، فرقی هم نداره این محتوا متن باشه، عکس باشه یا لینک. برای کسی که میخواد کار سئو تکنیکال انجام بده، آشنایی با HTML خیلی مهمه، چون خیلی وقت‌ها باید مستقیم بره سراغ کدها تا مشکلاتی که روی عملکرد سئو تاثیر میذارن رو پیدا و حل کنه.

    HTML از یه سری «تگ» برای ساختاربندی استفاده میکنه. مثلا:

    • <title>: عنوان صفحه وب رو مشخص میکنه.
    • <h1>: تیتر یا عنوان اصلی صفحه رو نشون میده.
    • <p>: یک پاراگراف از متن رو مشخص میکنه.

    یاد گرفتن HTML کمک میکنه تا مطمئن بشیم موتورهای جستجو مثل گوگل، ساختار اصلی سایت ما رو به درستی درک میکنن.

    CSS: لباس و ظاهر سایت

    CSS که مخفف Cascading Style Sheets هست، مسئولیت ظاهر و حس و حال سایت شما رو به عهده داره. اگه HTML ساختار محتوا رو میچینه، CSS میاد و به اون استایل میده. یعنی مشخص میکنه که مثلا تیترها، متن‌ها و عکس‌ها چطور نمایش داده بشن.

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

    جاوا اسکریپت: هوش و رفتار سایت

    جاوا اسکریپت به سایت شما قابلیت تعامل و پویایی میده. از چک کردن فرم‌ها گرفته تا اجرای انیمیشن‌ها، همه این کارها با جاوا اسکریپت انجام میشه و میتونه سایت‌ها رو خیلی دینامیک کنه. اما از نظر سئو، یه چالش اینجا وجود داره: جاوا اسکریپت برای پردازش شدن به منابع زیادی احتیاج داره و ممکنه همیشه توسط موتورهای جستجو به طور کامل پردازش نشه، مخصوصا اگه از نوع «client-side» باشه (یعنی توسط مرورگر کاربر اجرا بشه).

    چند تا از کاربردهای رایج جاوا اسکریپت اینها هستن:

    • گوگل آنالیتیکس: برای ردیابی بازدیدکننده‌های سایت.
    • فریمورک‌های جاوا اسکریپت مثل React یا Vue: برای قدرت بخشیدن به سایت‌های تعاملی.

    یادتون باشه که هرچند جاوا اسکریپت تجربه کاربری رو بهتر میکنه، اما باید با احتیاط ازش استفاده کرد، چون ممکنه موتورهای جستجو همیشه اون رو به طور کامل پردازش نکنن.

    بخش دوم: CSS چی هست و چرا اینقدر مهمه؟

    حالا که با سه تفنگدار دنیای وب آشنا شدیم، بیاید تمرکزمون رو بذاریم روی CSS.

    CSS یعنی چی؟

    CSS که به فارسی بهش میگن «کاسکدینگ استایل شیتس» یا «شیوه‌نامه آبشاری»، یه زبان برای توصیف استایل یک سند HTML هست. به زبون ساده‌تر، CSS مشخص میکنه که اجزای مختلف HTML روی صفحه وب چطوری نمایش داده بشن. این زبان میتونه کلی در وقت ما صرفه‌جویی کنه، چون میتونه طرح‌بندی چندین صفحه رو به صورت همزمان کنترل کنه. معمولا تعریف‌های استایل در فایل‌های خارجی با پسوند .css ذخیره میشن. اینطوری، با استفاده از یه شیوه‌نامه، میشه ظاهر کل وبسایت رو فقط با تغییر دادن یک فایل، عوض کرد.

    ساختار کدهای CSS چطوریه؟

    کدهای CSS یه ساختار مشخص دارن:

    • انتخابگر (Selector): به اون بخش از HTML اشاره میکنه که میخوایم بهش استایل بدیم.
    • بلوک تعریف (Declaration Block): شامل یک یا چند تعریف هست که همیشه با نقطه ویرگول (semicolon) از هم جدا میشن.
    • تعریف (Declaration): هر تعریف شامل یک نام ویژگی (property) و یک مقدار (value) هست که با دو نقطه (colon) از هم جدا میشن.
    • تعریف‌ها همیشه با نقطه ویرگول تموم میشن و بلوک‌های تعریف هم داخل آکولاد {} قرار میگیرن.

    بذارید یه مثال بزنیم تا بهتر متوجه بشید. فرض کنید میخوایم رنگ متن همه پاراگراف‌ها رو سبز کنیم:

    p {
      color: green;
    }

    توی این مثال:

    • p انتخابگر ماست که به تگ پاراگراف <p> اشاره میکنه.
    • color نام ویژگی هست.
    • green مقدار اون ویژگی هست.

    این قانون ساده باعث میشه تمام پاراگراف‌های سایت شما متن سبز رنگ داشته باشن.

    Tailwind CSS: یه روش جدید برای استایل دادن

    حالا که با خود CSS آشنا شدیم، بیاید در مورد یکی از فریمورک‌های مدرن و محبوبش یعنی Tailwind CSS صحبت کنیم. تیل‌ویند یک فریمورک «utility-first» هست. یعنی به جای اینکه برای هر بخش از سایت یه کلاس CSS جدا بنویسیم، از یه سری کلاس‌های آماده و معنایی استفاده میکنیم که هر کدوم یه کار مشخص انجام میدن، مثلا رنگ پس‌زمینه رو تنظیم میکنن یا ضخامت فونت رو تغییر میدن.

    یکی از مشکلات همیشگی برنامه‌نویس‌ها، نام‌گذاری چیزهاست. تیل‌ویند این مشکل رو حل کرده. اسم‌گذاری کلاس‌هاش خیلی قابل فهمه و به خاطر سپردنشون هم خیلی راحته. این که دیگه نگران اسم‌گذاری نباشیم و بتونیم بدون نوشتن CSS جدید برای هر بخش، استایل‌ها رو اضافه کنیم، سرعت کار رو به شدت بالا میبره.

    مزیت‌های تیل‌ویند:

    • شخصی‌سازی و تنظیمات: تیل‌ویند از اول با این ذهنیت طراحی شده که قابل شخصی‌سازی باشه. به طور پیش‌فرض، یه سری ابزار آماده مثل پالت رنگی، ویژگی‌های فونت و غیره داره. همه این تنظیمات در فایلی به اسم tailwind.config.js قرار دارن که میتونید هر طور که دوست دارید تغییرش بدید.
    • انعطاف‌پذیری بالا: تیل‌ویند شما رو مجبور به کار خاصی نمیکنه. راه‌های زیادی برای پیاده‌سازی ویژگی‌هاش وجود داره. اگه هنوز دوست دارید خودتون CSS بنویسید، میتونید این کار رو انجام بدید. حتی برای بخش‌های پیچیده‌تر، گاهی بهتره که CSS خالص بنویسیم چون مدیریت بعضی چیزها با کنار هم چیدن کلاس‌ها در HTML خیلی سخت میشه.
    • دستور @apply: وقتی در کنار تیل‌ویند، CSS جدید مینویسید، بهتره از دستور @apply استفاده کنید. این دستور به شما اجازه میده کلاس‌های تکراری رو از HTML بردارید و مستقیم توی فایل CSS قرار بدید. این خیلی خوبه چون میتونید از کلاس‌های تیل‌ویند استفاده کنید و بعدا اگه خواستید تغییری بدید، فقط کافیه فایل tailwind.config.js رو آپدیت کنید، به جای اینکه CSS خالص رو دستکاری کنید.

    آیا شلوغ شدن HTML با کلاس‌ها بده؟

    بزرگترین چیزی که باعث میشه توسعه‌دهنده‌ها از تیل‌ویند دوری کنن، اینه که باید کلی کلاس توی فایل HTML بنویسن و این فایل‌ها رو شلوغ میکنه. شاید به نظر بیاد که این کار با اصل DRY (خودت رو تکرار نکن) در تضاده. اما یادتون باشه که این یه فریمورک utility-first هست. ما ممکنه اسم کلاس رو تکرار کنیم، اما اون کلاس فقط یک استایل رو تعریف میکنه. راه‌هایی هم برای تمیز نگه داشتن HTML وجود داره، مثل همون دستور @apply که گفتیم، یا استفاده از کامپوننت‌ها.

    با اینکه شاید ظاهر HTML شلوغ به نظر برسه، ولی مزیت‌هاش به معایبش میچربه. اینکه کلاس‌ها رو مستقیم در HTML کنار هم میچینید، باعث میشه موقع کدنویسی دیگه نیازی نباشه دائم بین فایل‌های مختلف جابجا بشید.

    بخش سوم: پیوند عمیق بین CSS و سئو

    خب، رسیدیم به بخش هیجان‌انگیز ماجرا. CSS چطوری روی سئو تاثیر میذاره؟

    چرا CSS برای سئو مهمه؟

    CSS به ما اجازه میده که ظاهر و استایل سایت رو از محتوای اصلی جدا کنیم. این جداسازی چند تا فایده بزرگ برای سئو داره:

    • کد تمیزتر برای خزنده‌ها: این جداسازی باعث میشه کد HTML سبک‌تر و تمیزتر باقی بمونه. این چیزیه که خزنده‌های موتورهای جستجو (مثل گوگل‌بات) ترجیح میدن. وقتی کد شما تمیز باشه، اونها راحت‌تر میتونن محتوای اصلی و کلمات کلیدی شما رو پیدا و درک کنن.
    • تاکید روی محتوای مهم: با CSS میشه چیدمان کدها رو بدون تغییر در ظاهر بصری سایت، عوض کرد. اینطوری میشه به خزنده‌های موتور جستجو نشون داد که کدوم بخش از محتوای شما مهم‌تره.

    گوگل رسما اعلام کرده که به CSS شما اهمیت میده. در سال ۲۰۱۴، گوگل راهنمای وبمستر خودش رو آپدیت کرد و توصیه کرد که به گوگل‌بات اجازه دسترسی به فایل‌های CSS و جاوا اسکریپت داده بشه تا بتونه صفحات رو مثل یک مرورگر واقعی ببینه و رندر کنه. این موضوع مخصوصا برای صفحات موبایل مهمه تا گوگل بتونه بررسی کنه که آیا صفحه شما برای موبایل مناسب (mobile-friendly) هست یا نه.

    پس یادتون باشه، مسدود کردن دسترسی گوگل به فایل‌های CSS و JS که برای درک سایت شما لازمه، میتونه به سئوی شما آسیب بزنه. البته این موضوع فقط در صورتی مشکل‌سازه که جلوی پیدا کردن محتوای قابل مشاهده یا رندر شدن درست صفحه رو بگیره. اگه یه سری فایل JS دارید که تاثیری روی محتوا یا طرح‌بندی ندارن، مسدود کردنشون مشکلی ایجاد نمیکنه و جریمه‌ای هم در کار نیست.

    مزایای کلیدی CSS برای سئو

    استفاده استراتژیک از CSS میتونه مزایای زیادی برای سئو داشته باشه:

    • سئوی بهتر: همونطور که گفتیم، با CSS میشه روی اهمیت محتوا برای خزنده‌ها تاکید کرد.
    • دسترسی‌پذیری بیشتر (Accessibility): CSS کدهای HTML رو ساده‌تر میکنه و این باعث میشه سایت برای همه کاربران، مخصوصا اونهایی که با دستگاه‌های دستی مثل موبایل وبگردی میکنن، در دسترس‌تر باشه.
    • دانلود سریع‌تر: کدهای CSS رو میشه در یک فایل خارجی قرار داد. این فایل یک بار توسط کاربر دانلود میشه و بعد در حافظه پنهان (cache) دستگاهش ذخیره میشه. این کار سرعت دانلود رو در مقایسه با روش‌های قدیمی مثل استفاده از جدول‌ها برای چیدمان، خیلی بیشتر میکنه.
    • نگهداری آسان: چون استایل از محتوا جداست، آپدیت کردن و نگهداری سایت خیلی راحت‌تر میشه.
    • سازگاری با مرورگرهای مختلف: CSS کمک میکنه تا سایت شما در مرورگرهای مختلف، ظاهر حرفه‌ای و یکسانی داشته باشه.

    همه این مزیت‌ها در نهایت به بهینه شدن زمان بارگذاری صفحه، سازماندهی بهتر محتوا، تاکید روی کلمات کلیدی مناسب، کاهش نسبت کد به محتوا و استفاده بهینه از کش مرورگر کمک میکنن.

    بخش چهارم: سرعت، پادشاه است! بهینه‌سازی CSS برای بارگذاری سریع‌تر

    یکی از مهم‌ترین فاکتورها در سئو، سرعت بارگذاری سایته. هیچکس دوست نداره برای باز شدن یه صفحه کلی منتظر بمونه. CSS میتونه هم دوست شما باشه و هم دشمن شما در این زمینه. بیاید ببینیم چطور میتونیم ازش به نفع خودمون استفاده کنیم.

    کوچک‌سازی یا Minification

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

    بذارید یه مثال ببینیم:

    کد قبل از کوچک‌سازی:

    body {
      margin: 0;
      padding: 0;
      background-color: #fff;
    }

    کد بعد از کوچک‌سازی:

    body{margin:0;padding:0;background-color:#fff;}

    می‌بینید؟ کارایی کد یکسانه، اما حجمش خیلی کمتر شده. این کار چهار تا مزیت اصلی داره:

    • زمان بارگذاری سریع‌تر: که تجربه کاربری رو بهتر میکنه.
    • عملکرد بهتر: فایل‌های کوچیک سریع‌تر لود میشن که برای کاربران موبایل و اونهایی که اینترنت کند دارن خیلی مهمه.
    • صرفه‌جویی در زمان: این ابزارها کار رو به صورت خودکار انجام میدن و نیازی به حذف دستی کاراکترها نیست.
    • سئوی بهتر: سایت‌های سریع‌تر، رتبه بهتری از طرف موتورهای جستجو میگیرن.

    مقابله با منابع مسدودکننده رندر (Render-Blocking)

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

    • استفاده از defer یا async برای جاوا اسکریپت: توی تنظیمات پروژه در بخش Custom Code، میتونید به اسکریپت‌های غیرضروری خودتون، ویژگی defer یا async رو اضافه کنید. این کار به مرورگر اجازه میده که صفحه رو سریع‌تر لود کنه و منتظر تموم شدن بارگذاری جاوا اسکریپت نمونه.
    • ترکیب کردن فایل‌های CSS: اگه سایت شما از چندین فایل CSS استفاده میکنه، بهتره اونها رو در یک فایل ادغام کنید. این کار تعداد درخواست‌های HTTP رو کم میکنه و باعث میشه صفحه سریع‌تر لود بشه.

    تکنیک‌های دیگر برای افزایش سرعت

    • اعلام Charset: مطمئن بشید که صفحه شما کدگذاری کاراکتر (character encoding) درستی داره تا روان‌تر رندر بشه. میتونید این خط کد رو در بخش Custom Code و زیر تگ meta اضافه کنید: charset="UTF-8".
    • استفاده از preload و preconnect: برای فایل‌های CSS خارجی، از این ویژگی‌ها استفاده کنید. اینها به مرورگر اجازه میدن که قبل از درخواست HTTP، یه اتصال اولیه برقرار کنه که سرعت لود رو به شکل قابل توجهی بهبود میبخشه.
    • کش مرورگر (Browser Caching): با تنظیم کردن یه تاریخ انقضا یا حداکثر عمر در هدرهای HTTP برای منابع ثابت (مثل فایل CSS)، به مرورگر دستور میدید که منابعی که قبلا دانلود کرده رو از حافظه داخلی دستگاه بخونه، به جای اینکه دوباره از شبکه دانلودشون کنه.
    • بارگذاری تنبل (Lazy Loading): این تکنیک اجازه میده عکس‌ها و منابع دیگه فقط زمانی لود بشن که وارد دید کاربر میشن. این کار سرعت و عملکرد رو بهینه میکنه.

    برای اینکه عملکرد سایتتون رو بسنجید و مشکلات باقی‌مونده رو پیدا کنید، میتونید از ابزارهایی مثل Google PageSpeed Insights، Lighthouse یا GTmetrix استفاده کنید. این ابزارها به شما اطلاعات ارزشمندی در مورد عملکرد سایتتون میدن و پیشنهادهایی برای بهبود سرعت ارائه میکنن.

    بخش پنجم: روی لبه تیغ راه نروید! ترفندهای CSS و خط قرمزهای سئو

    بعضی از تکنیک‌های CSS هستن که در گذشته برای اهداف سئویی استفاده میشدن، اما امروز میتونن برای سایت شما خطرناک باشن. گوگل خیلی باهوش‌تر از این حرف‌هاست و خیلی راحت میتونه این ترفندها رو تشخیص بده. بیاید با هم چند تا از این موارد رو بررسی کنیم.

    داستان مخفی کردن متن با CSS

    خیلی از توسعه‌دهنده‌های آگاه به استانداردها، از CSS برای مخفی کردن متن به دلایل موجهی مثل دسترسی‌پذیری یا usability استفاده میکنن. مثلا:

    • لینک‌های پرش (skip links) که به کاربران صفحه‌خوان کمک میکنن سریع به محتوای اصلی برسن.
    • لیبل‌های فرم که به صورت بصری مخفی هستن.
    • تکنیک جایگزینی تصویر (image replacement).
    • نمایش متن راهنما فقط زمانی که کاربر درخواست بده.

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

    تکنیک معروف text-indent: -9999px

    یکی از تکنیک‌های رایج برای جایگزینی تصویر، استفاده از text-indent: -9999px هست. فرض کنید یه تگ <h1> دارید که میخواید به جای متنش، یه عکس لوگو نمایش بدید. کدش چیزی شبیه این میشه:

    h1 {
      text-indent: -9999px;
      background: url('logo.png');
    }

    این کد متن داخل تگ <h1> رو ۹۹۹۹ پیکسل به سمت چپ هل میده و عملا از صفحه خارجش میکنه، و به جاش یه عکس پس‌زمینه نشون میده. ایده اینه که موتور جستجو متن رو بخونه و کاربر عکس رو ببینه. اما آیا این کار از نظر سئو امنه؟

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

    اما در مقابل، گزارش‌هایی وجود داره که میگه گوگل میتونه و گاهی اوقات کدهای CSS و جاوا اسکریپت شما رو میخونه. پس این احتمال وجود داره که الگوریتم‌ها، هر متنی که با text-indent منفی و بیش از حد از صفحه خارج شده رو به عنوان اسپم در نظر بگیرن و سایت شما رو جریمه کنن.

    نظر گوگل در این باره چیست؟

    مت کاتس (Matt Cutts) که در گوگل کار میکنه، در این مورد گفته: «من توصیه نمیکنم که مردم از CSS برای مخفی کردن متن استفاده کنن». این جمله نگرانی‌های زیادی رو ایجاد کرد.

    اما بعدا در جای دیگری توضیح بیشتری داد و گفت: «اگه دارید مستقیما از CSS برای مخفی کردن متن استفاده میکنید، تعجب نکنید اگه بهش بگن اسپم. … تصور کنید این کار از دید یه بازدیدکننده، یه رقیب، یا کسی که داره یه گزارش اسپم رو بررسی میکنه چطور به نظر میرسه. اگه شما اسم شرکتتون که مثلا Expo Markers هست رو به جای لوگو نشون بدید، مشکلی نیست. اما اگه متنی که تصمیم میگیرید نشون بدید این باشه: «Expo Markers ارزان آنلاین تخفیف خرید آنلاین فروش Expo Markers…» اون موقع من بیشتر احتیاط میکنم، چون این میتونه بد به نظر برسه.»

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

    به طور خلاصه، بهتره همیشه جانب احتیاط رو رعایت کنید. محتوا رو برای کاربر بنویسید، نه برای موتورهای جستجو. سعی نکنید گوگل رو فریب بدید، چون در نهایت به ضرر خودتون تموم میشه.

    محتوای تولید شده با ::before و ::after

    اینها یه سری شبه-عنصر (pseudo-elements) در CSS هستن که به توسعه‌دهنده‌ها اجازه میدن محتوای تزئینی (مثل آیکون یا یه سری نماد کوچیک) رو قبل یا بعد از یک عنصر اضافه کنن، بدون اینکه لازم باشه اون رو مستقیم در HTML بنویسن.

    نکته سئویی فوق‌العاده مهم: محتوایی که از طریق ::before یا ::after اضافه میشه، در Document Object Model (DOM) قرار نمیگیره و در نتیجه، توسط سیستم‌های رندرینگ و ایندکس گوگل دیده نمیشه.

    توصیه: از این شبه-عنصرها فقط و فقط برای اهداف تزئینی استفاده کنید. هرگز برای محتوایی که لازمه ایندکس بشه یا مفهوم مهمی رو منتقل میکنه (مثلا اضافه کردن علامت هشتگ به کلمات) از اونها استفاده نکنید. محتوایی که برای درک مطلب حیاتیه، باید همیشه مستقیم در HTML نوشته بشه.

    <img> یا background-image؟ مسئله این است!

    یه سوال رایج اینه که برای نمایش عکس‌ها از تگ <img> در HTML استفاده کنیم یا از ویژگی background-image در CSS؟

    قانون کلی اینه:

    • اگه عکس بخشی از محتوای اصلی شماست، باید از تگ <img> استفاده کنید.
    • اگه عکس صرفا برای تزئین و خوشگلی (eye candy) هست، باید از background-image استفاده کنید.

    چرا این موضوع برای سئو مهمه؟ چون عکس‌هایی که با background-image در CSS قرار داده میشن، توسط موتورهای جستجو به عنوان عکس ایندکس نمیشن. اونها فقط عناصر تزئینی به حساب میان. اما تگ‌های <img> یا <picture> در HTML برای عکس‌های محتوایی هستن که بخشی جدایی‌ناپذیر از مفهوم صفحه شما هستن (مثل عکس محصولات، عکس‌های یک مقاله خبری، یا نمودارها). این عکس‌ها بخشی از DOM هستن، میتونن در جستجوی تصاویر گوگل ایندکس بشن و محتواشون توسط خزنده‌ها درک بشه.

    یکی از دلایلی که متخصص‌های سئو ممکنه از شما بخوان همه عکس‌ها رو به تگ <img> تغییر بدید، اینه که میخوان از ویژگی alt استفاده کنن. alt یا متن جایگزین، برای توصیف عکس برای کسانی هست که نمیتونن عکس رو ببینن (مثلا به خاطر اینترنت کند، یا چون از صفحه‌خوان استفاده میکنن).

    متاسفانه بعضی‌ها از این ویژگی برای انباشت کلمات کلیدی (keyword stuffing) استفاده میکنن که کار اشتباهیه. متن alt باید توصیف دقیق و مفیدی از عکس باشه، نه لیستی از کلمات کلیدی.

    • مثال بد: <img src="آسمان.jpg" alt="ارزان، با کیفیت، ویجت">
    • مثال خوب: <img src="آسمان.jpg" alt="تصویری از آسمان آبی بدون ابر">

    بخش ششم: ابزارهای پیشرفته برای کنترل خزنده‌ها و تحلیل سایت

    حالا که با بایدها و نبایدهای اصلی آشنا شدیم، بیاید کمی عمیق‌تر بشیم و در مورد ابزارها و تکنیک‌های پیشرفته‌تر صحبت کنیم.

    کنترل خزنده‌ها با robots.txt

    فایل robots.txt یه فایل متنی ساده در ریشه سایت شماست که به موتورهای جستجو میگه کدوم بخش‌های سایت رو میتونن بخزن (crawl) و کدوم بخش‌ها رو نه. دستور اصلی برای این کار Disallow هست.

    Disallow یعنی چی؟

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

    چه زمانی نباید از Disallow استفاده کرد؟

    • برای صفحاتی که میخواهید PageRank منتقل کنند: اگه یه URL در robots.txt مسدود بشه، خزیده نمیشه و در نتیجه نمیتونه PageRank (اعتبار) رو به صفحات دیگه منتقل کنه. پس صفحاتی که احتمال داره لینک خارجی بگیرن یا برای لینک‌دهی به صفحات داخلی دیگه ضروری هستن رو Disallow نکنید.
    • برای پارامترها: جان مولر (John Mueller) از گوگل گفته که مسدود کردن پارامترها با Disallow باعث میشه که سیگنال‌های اعتبار برای URL اصلی جمع‌آوری نشن. چون گوگل نمیتونه URLهای دارای پارامتر رو ببینه، متوجه نمیشه که این صفحات در واقع کپی همدیگه هستن. بهترین راه برای مدیریت URLهای پارامتردار، استفاده از ساختار URL تمیز، ریدایرکت‌های ۳۰۱، تگ‌های کنونیکال یا ابزار URL Parameters گوگل هست.
    • برای فایل‌های JS و CSS که به گوگل در درک سایت کمک میکنند: همونطور که قبلا گفتیم، این کار میتونه به سئوی شما ضربه بزنه.

    آیا Disallow جلوی ایندکس شدن رو میگیره؟

    نه! یادتون باشه Disallow فقط جلوی خزیدن (crawling) رو میگیره، نه ایندکس شدن (indexing). اگه یه URL مسدود شده، از جای دیگه‌ای (داخلی یا خارجی) لینک گرفته باشه، ممکنه هنوز در نتایج جستجو ظاهر بشه. در این حالت، گوگل هیچ اطلاعاتی به جز خود URL رو نمیتونه نشون بده و به جای توضیحات، این پیام رو نمایش میده: «به دلیل robots.txt این سایت، توضیحی برای این نتیجه در دسترس نیست.»

    فرمت‌بندی پیشرفته در robots.txt

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

    • * (wildcard): به معنی «هر دنباله‌ای از کاراکترها».
    • $ (end of URL): برای مشخص کردن URLهایی که با یک الگوی خاص تموم میشن (مثلا پسوند فایل).

    با ترکیب این دو میشه کنترل دقیقی روی خزنده‌ها داشت. چند تا مثال:

    • مسدود کردن یک نوع فایل خاص (مثلا همه PDFها):
    • مسدود کردن هر پوشه‌ای که شامل یک کلمه خاص باشه (مثلا example):
    • مسدود کردن URLهای دارای پارامتر (Query):

    قوانین متناقض Allow و Disallow

    گاهی ممکنه یه URL هم با قانون Allow و هم با قانون Disallow مطابقت داشته باشه. در این حالت، طولانی‌ترین قانون برنده میشه. منظور از طول، تعداد کاراکترها در مسیر بعد از Allow: یا Disallow: هست.

    مثال:

    <pre><code>Allow: /exam* (6 کاراکتر)
    Disallow: /examp* (7 کاراکتر)</code></pre>

    در این مثال، URLای مثل /example.htm مسدود میشه، چون قانون Disallow با ۷ کاراکتر، طولانی‌تر از قانون Allow با ۶ کاراکتره.

    یه نکته جالب اینه که استفاده از * در انتهای یک الگو، اون رو «قوی‌تر» میکنه، چون یه کاراکتر به طولش اضافه میکنه.

    مثال:

    <pre><code>Allow: /example
    Disallow: /example*</code></pre>

    اینجا، URL /example.htm مسدود میشه چون Disallow یه کاراکتر * اضافه داره و طولانی‌تره.

    استفاده از CSS Selectors برای ممیزی سئو

    یه کاربرد خیلی جالب CSS که شاید کمتر شنیده باشید، استفاده از انتخابگرهای CSS (CSS Selectors) برای پیدا کردن بخش‌های خاصی از کد در تمام صفحات سایته. ابزارهایی مثل WebSite Auditor یه قابلیتی به اسم «Custom Search» دارن که به شما اجازه میده با استفاده از انتخابگرهای CSS، دنبال محتوای خاصی بگردید.

    مثلا، میتونید با این روش به راحتی پیدا کنید:

    کدام صفحات…دستور CSS Selector
    اسکریپت گوگل تگ منیجر رو دارن؟noscript:has(iframe[src$=XXX-XXXXXX])
    تگ h1 دارن؟h1
    عکس‌هایی با یک متن alt خاص دارن؟img[alt=green-grass]
    به یک صفحه خاص لینک دادن؟a[href*=page.html]
    لینک ایمیل دارن؟a[href^=mailto:]
    تگ‌های Open Graph رو دارن؟meta[name^=og:]

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

    بخش هفتم: پرسش و پاسخ کلاسی

    خب، درس امروزمون به پایان رسید. حالا وقتشه چند تا از سوال‌هایی که ممکنه براتون پیش اومده باشه رو با هم مرور کنیم.

    سوال ۱: استاد، پس اسم کلاس‌های CSS که انتخاب میکنم، روی رتبه من در گوگل تاثیری داره؟

    جواب: سوال خیلی خوبیه. نه، اسم کلاس‌های CSS هیچ تاثیر مستقیمی روی سئو ندارن. اونها فقط برای استایل دادن هستن و به عنوان محتوای متنی قابل مشاهده که موتورهای جستجو برای کلمات کلیدی تحلیل میکنن، در نظر گرفته نمیشن.

    سوال ۲: یعنی میتونم یه عالمه کلمه کلیدی رو توی صفحه‌ام بنویسم و بعد رنگشون رو همرنگ پس‌زمینه کنم تا رتبه‌ام بهتر بشه؟

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

    سوال ۳: اگه یه صفحه‌ای رو با robots.txt مسدود کنم، یعنی دیگه هیچوقت توی گوگل نشون داده نمیشه؟

    جواب: لزوما نه. همونطور که گفتیم، Disallow فقط جلوی خزیدن گوگل رو میگیره. اگه اون صفحه از سایت‌های دیگه لینک گرفته باشه، گوگل از وجودش با خبر میشه و ممکنه اون رو ایندکس کنه. البته چون نتونسته محتواش رو بخونه، در نتایج جستجو یه عنوان ساده (معمولا خود URL) و یک توضیح عمومی نشون میده.

    سوال ۴: برای لوگوی شرکتم بهتره از تگ <img> استفاده کنم یا از background-image در CSS؟

    جواب: چون لوگو یک بخش مهم از محتوا و هویت برند شماست، قطعا بهتره که از تگ <img> استفاده کنید. اینطوری میتونید یک متن alt مناسب هم براش بنویسید (مثلا «لوگوی شرکت X») که هم برای دسترسی‌پذیری خوبه و هم به موتورهای جستجو کمک میکنه بفهمن اون عکس چیه.

    سوال ۵: میخوام قبل از تیترهام یه سری آیکون جالب بذارم. توی یه آموزش دیدم که با ::before این کار رو میکنن. این برای سئو مشکلی نداره؟

    جواب: تا زمانی که اون آیکون‌ها صرفا تزئینی باشن و هیچ مفهوم مهمی رو منتقل نکنن، استفاده از ::before کاملا درسته و مشکلی برای سئو ایجاد نمیکنه. نکته مهم اینه که خود متن تیتر باید حتما در تگ HTML (مثلا <h2>) نوشته شده باشه. یادتون باشه، هر محتوایی که با ::before یا ::after اضافه بشه، ایندکس نمیشه.

    سوال ۶: گزارش سرعت سایتم میگه باید CSS رو «کوچک‌سازی» یا «minify» کنم. این یعنی چی دقیقا؟

    جواب: کوچک‌سازی یا مینیفای کردن یعنی حذف کردن تمام چیزهای اضافی از فایل CSS شما که برای اجرای کد لازم نیستن. چیزهایی مثل فاصله‌های اضافی، خطوط خالی و کامنت‌هایی که برای راهنمایی خودتون نوشتید. این کار باعث میشه حجم فایل CSS شما کمتر بشه و در نتیجه سریع‌تر دانلود و بارگذاری بشه، که این هم به نوبه خودش سرعت کلی سایت و سئوی شما رو بهتر میکنه.

    منابع

    • [2] Converting a html/css website to WordPress and effects on SEO : r/Wordpress
    • [4] CSS: co to jest? Definicja – Słownik SEO/SEM Delante
    • [6] Google On SEO & CSS
    • [8] Barry Schwartz on X: “Google’s @g33konaut and @JohnMu on CSS and SEO for Google Search https://t.co/HG5KYeITj1 https://t.co/LINvuZJGow” / X
    • [10] Using Custom Search: CSS Selectors – SEO PowerSuite Help Center
    • [12] Removing CSS & JS Files from Index | SEO Forum | Moz
    • [14] critical JS/CSS slows pages – bad for SEO and google ranking – SEO – Squarespace Forum
    • [16] Is there any SEO benefits for using <img> vs background CSS – Marketing – SitePoint Forums | Web Development & Design Community
    • [1] Is Tailwind CSS bad for SEO? – Quora
    • [3] Disallow and Google: An Intermediate SEO Guide: PageRank, JS/CSS, formatting and more
    • [5] text-indent: -9999px = bad seo? – CSS-Tricks
    • [7] Effective CSS Rules for SEO Optimization
    • [9] Google, SEO and using CSS to hide text | 456 Berea Street
    • [11] SEO Issues with Render Blocking, Charset Declaration and Inline CSS – Publishing help / SEO – Forum | Webflow
    • [13] CSS minifier {Free & Online SEO Tool}✴️
    • [15] HTML, CSS, and JavaScript: A Simple SEO Primer