<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>علی باقرزاده نویسنده در بلاگ هم‌روش</title>
	<atom:link href="https://hamravesh.com/blog/author/ali-bagherzadeh/feed/" rel="self" type="application/rss+xml" />
	<link>https://hamravesh.com/blog/author/ali-bagherzadeh/</link>
	<description>بلاگ رسمی هم‌روش</description>
	<lastBuildDate>Mon, 28 Sep 2026 11:37:45 +0000</lastBuildDate>
	<language>fa-IR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://hamravesh.com/blog/wp-content/uploads/2026/08/cropped-favicon-96x96-1-32x32.png</url>
	<title>علی باقرزاده نویسنده در بلاگ هم‌روش</title>
	<link>https://hamravesh.com/blog/author/ali-bagherzadeh/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>بررسی آسیب‌پذیری ImageResponse در Next.js؛ راهکار رفع مشکل</title>
		<link>https://hamravesh.com/blog/nextjs-cve-2026-94545-vulnerability/</link>
					<comments>https://hamravesh.com/blog/nextjs-cve-2026-94545-vulnerability/#respond</comments>
		
		<dc:creator><![CDATA[علی باقرزاده]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 11:29:27 +0000</pubDate>
				<category><![CDATA[دواپس]]></category>
		<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5761</guid>

					<description><![CDATA[<p>یک آسیب‌پذیری امنیتی بحرانی در Next.js شناسایی شده که در شرایط مشخص می‌تواند به اجرای کد از راه دور یا Remote Code Execution روی سرور منجر شود. این آسیب‌پذیری با شناسه CVE-2026-94545 در قابلیت ImageResponse قرار دارد؛ قابلیتی که از جمله برای ساخت Open Graph Image و تصاویر پیش‌نمایش هنگام اشتراک‌گذاری صفحات استفاده می‌شود. شرکت [&#8230;]</p>
<p>The post <a href="https://hamravesh.com/blog/nextjs-cve-2026-94545-vulnerability/">بررسی آسیب‌پذیری ImageResponse در Next.js؛ راهکار رفع مشکل</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">یک آسیب‌پذیری امنیتی بحرانی در Next.js شناسایی شده که در شرایط مشخص می‌تواند به اجرای کد از راه دور یا Remote Code Execution روی سرور منجر شود. این آسیب‌پذیری با شناسه CVE-2026-94545 در قابلیت <code>ImageResponse</code> قرار دارد؛ قابلیتی که از جمله برای ساخت Open Graph Image و تصاویر پیش‌نمایش هنگام اشتراک‌گذاری صفحات استفاده می‌شود.</p>



<p class="wp-block-paragraph">شرکت Vercel در ۲۲ سپتامبر ۲۰۲۶ یک <a href="https://nextjs.org/blog/nextjs-security-update-september-22-2026" data-type="link" data-id="https://nextjs.org/blog/nextjs-security-update-september-22-2026" target="_blank" rel="noreferrer noopener">به‌روزرسانی امنیتی خارج از چرخه عادی</a> برای رفع این مشکل منتشر کرد. نسخه‌های Next.js از <code>16.2.0</code> تا قبل از <code>16.3.6</code> تحت تأثیر قرار دارند و نسخه <code>16.3.6</code> این آسیب‌پذیری را برطرف کرده است.</p>



<p class="wp-block-paragraph">شدت این آسیب‌پذیری در راهنمای امنیتی رسمی Next.js «بحرانی» اعلام شده و امتیاز آن در نسخه ۴ استاندارد CVSS به ۹.۵ از ۱۰ می‌رسد. سوء‌استفاده از آن از طریق شبکه امکان‌پذیر است، به دسترسی قبلی مهاجم نیازی ندارد و به تعامل کاربر نیز وابسته نیست. البته برای امکان سوء‌استفاده، لازم است شرایط مشخصی در نحوه استفاده اپلیکیشن از <code>ImageResponse</code> وجود داشته باشد.</p>



<h2 id="h-آسیب-پذیری-cve-2026-94545-چیست" class="wp-block-heading">آسیب‌پذیری CVE-2026-94545 چیست؟</h2>



<p class="wp-block-paragraph">این آسیب‌پذیری Next.js، نسخه‌ای از قابلیت <code>ImageResponse</code> در ماژول <code>next/og</code> را تحت تأثیر قرار می‌دهد که در محیط Node.js اجرا می‌شود. این قابلیت برای تولید تصاویر به کار می‌رود و از کتابخانه Satori متعلق به Vercel استفاده می‌کند تا ساختار تصویر را ابتدا به SVG تبدیل کند و سپس تصویر نهایی تولید شود.</p>



<p class="wp-block-paragraph">ریشه این آسیب‌پذیری به نحوه تولید SVG در Satori برمی‌گردد. برخی مقادیر، پیش از قرار گرفتن در خروجی SVG به‌درستی خنثی نمی‌شدند؛ در نتیجه، یک مقدار دستکاری‌شده می‌توانست به‌جای متن عادی به‌عنوان کد SVG تفسیر شود. طبق توضیح Next.js، این مشکل در شرایط مشخص و در ترکیب با آسیب‌پذیری‌های موجود در وابستگی‌های دیگر می‌تواند به اجرای کد از راه دور منجر شود.</p>



<p class="wp-block-paragraph">نکته مهم این است که شدت این مشکل در Satori و Next.js یکسان ارزیابی نشده است. Advisory مربوط به Satori برای همین CVE شدت Moderate و امتیاز 5.3 را اعلام کرده، زیرا پیامد آسیب‌پذیری، به نحوه استفاده از خروجی SVG بستگی دارد. اما در Next.js این زنجیره در شرایط آسیب‌پذیر می‌تواند به اجرای کد منجر شود و به همین دلیل امتیاز 9.5 دریافت کرده است.</p>



<h2 id="h-چه-اپلیکیشن-هایی-در-معرض-آسیب-پذیری-next-js-قرار-دارند" class="wp-block-heading">چه اپلیکیشن‌هایی در معرض آسیب‌پذیری Next.js قرار دارند؟</h2>



<p class="wp-block-paragraph">صرف استفاده از Next.js به معنای آسیب‌پذیر بودن یک اپلیکیشن نیست. چند شرط برای قرار گرفتن در معرض CVE-2026-94545 وجود دارد.</p>



<p class="wp-block-paragraph">نسخه Next.js باید از <code>16.2.0</code> به بعد و قدیمی‌تر از <code>16.3.6</code> باشد. علاوه بر این، اپلیکیشن باید از پیاده‌سازی Node.js مربوط به <code>ImageResponse</code> در <code>next/og</code> استفاده کند و هنگام تولید تصویر، <a href="https://github.com/vercel/next.js/security/advisories/GHSA-vcvr-r3jv-pc5j" data-type="link" data-id="https://github.com/vercel/next.js/security/advisories/GHSA-vcvr-r3jv-pc5j" target="_blank" rel="noreferrer noopener">داده‌های تحت کنترل مهاجم</a> را در محتوای SVG، ویژگی‌ها (attributes) یا استایل‌های آن وارد کند.</p>



<p class="wp-block-paragraph">برای نمونه، در راهنمای امنیتی رسمی Next.js سناریویی نشان داده شده که در آن، از آدرس درخواست پارامتری با نام <code>value</code> استخراج می‌شود و سپس مستقیماً در عنصر <code>&lt;title&gt;</code> یک SVG قرار می‌گیرد:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">JavaScript</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>import { ImageResponse } from 'next/og'

export async function GET(request: Request) {
  const value = new URL(request.url).searchParams.get('value') ?? ''

  return new ImageResponse(
    &lt;svg width="1200" height="630">
      &lt;title>{value}&lt;/title>
    &lt;/svg>
  )
}</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F47067">import</span><span style="color: #ADBAC7"> { ImageResponse } </span><span style="color: #F47067">from</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&#39;next/og&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #F47067">export</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">async</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">function</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">GET</span><span style="color: #ADBAC7">(</span><span style="color: #F69D50">request</span><span style="color: #F47067">:</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">Request</span><span style="color: #ADBAC7">) {</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F47067">const</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">value</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">=</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">new</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">URL</span><span style="color: #ADBAC7">(request.url).searchParams.</span><span style="color: #DCBDFB">get</span><span style="color: #ADBAC7">(</span><span style="color: #96D0FF">&#39;value&#39;</span><span style="color: #ADBAC7">) </span><span style="color: #F47067">??</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&#39;&#39;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #F47067">return</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">new</span><span style="color: #ADBAC7"> </span><span style="color: #DCBDFB">ImageResponse</span><span style="color: #ADBAC7">(</span></span>
<span class="line"><span style="color: #ADBAC7">    &lt;</span><span style="color: #8DDB8C">svg</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">width</span><span style="color: #F47067">=</span><span style="color: #96D0FF">&quot;1200&quot;</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">height</span><span style="color: #F47067">=</span><span style="color: #96D0FF">&quot;630&quot;</span><span style="color: #ADBAC7">&gt;</span></span>
<span class="line"><span style="color: #ADBAC7">      &lt;</span><span style="color: #8DDB8C">title</span><span style="color: #ADBAC7">&gt;</span><span style="color: #F47067">{</span><span style="color: #ADBAC7">value</span><span style="color: #F47067">}</span><span style="color: #ADBAC7">&lt;/</span><span style="color: #8DDB8C">title</span><span style="color: #ADBAC7">&gt;</span></span>
<span class="line"><span style="color: #ADBAC7">    &lt;/</span><span style="color: #8DDB8C">svg</span><span style="color: #ADBAC7">&gt;</span></span>
<span class="line"><span style="color: #ADBAC7">  )</span></span>
<span class="line"><span style="color: #ADBAC7">}</span></span></code></pre></div>



<p class="wp-block-paragraph">در چنین الگویی، داده‌ای که درخواست‌کننده می‌تواند آن را کنترل کند، مستقیماً در SVG قرار می‌گیرد. در نتیجه، اگر سایر شرایط ذکرشده نیز وجود داشته باشند، اپلیکیشن در معرض این آسیب‌پذیری قرار می‌گیرد.</p>



<p class="wp-block-paragraph">در راهنمای امنیتی رسمی مشخص نشده است که آیا قرار گرفتن داده‌های تحت کنترل مهاجم در بخش‌های دیگری از محتوای تصویر نیز باعث بروز این آسیب‌پذیری می‌شود یا خیر؛ برای مثال، زمانی که این داده‌ها به‌عنوان متن یک عنوان درون عنصر <code>div</code> قرار می‌گیرند.</p>



<h2 id="h-چگونه-بررسی-کنیم-اپلیکیشن-در-معرض-این-آسیب-پذیری-قرار-دارد" class="wp-block-heading">چگونه بررسی کنیم اپلیکیشن در معرض این آسیب‌پذیری قرار دارد؟</h2>



<p class="wp-block-paragraph">برای بررسی اپلیکیشن، باید محل‌هایی را پیدا کرد که <code>ImageResponse</code> از <code>next/og</code> وارد شده است. طبق <a href="https://thehackernews.com/2026/09/critical-nextjs-imageresponse-flaw-can.html" data-type="link" data-id="https://thehackernews.com/2026/09/critical-nextjs-imageresponse-flaw-can.html" target="_blank" rel="noreferrer noopener">گزارش The Hacker News</a>، این موارد ممکن است در route handlerها یا فایل‌های <code>opengraph-image</code> وجود داشته باشند.</p>



<p class="wp-block-paragraph">در مرحله بعد باید بررسی شود آیا مقادیری که مهاجم قادر به کنترل آن‌ها است وارد SVG content ،attributes یا styles می‌شوند یا خیر.</p>



<p class="wp-block-paragraph">بررسی مستقیم نسخه Next.js نیز اهمیت دارد. طبق این گزارش، Satori داخل پکیج Next.js گنجانده شده است؛ بنابراین lockfile الزاماً آن را به‌عنوان یک وابستگی مجزای Next.js نمایش نمی‌دهد.</p>



<p class="wp-block-paragraph">این موضوع از جهت دیگری نیز اهمیت دارد. طبق بررسی The Hacker News در ۲۳ سپتامبر، دستور <code>npm audit</code> آسیب‌پذیری موجود در نسخه <code>16.3.5</code> از Next.js را شناسایی نکرد. بنابراین، در آن زمان نمی‌شد برای شناسایی این آسیب‌پذیری تنها به نتیجه <code>npm audit</code> تکیه کرد و لازم بود نسخه Next.js به‌طور مستقیم بررسی شود.</p>



<h2 id="h-کدام-نسخه-ها-تحت-تأثیر-نیستند" class="wp-block-heading">کدام نسخه‌ها تحت تأثیر نیستند؟</h2>



<p class="wp-block-paragraph">نسخه‌ای از <code>ImageResponse</code> که در محیط اجرایی Edge اجرا می‌شود، تحت تأثیر CVE-2026-94545 قرار ندارد. همچنین، همه اپلیکیشن‌های استفاده‌کننده از <code>ImageResponse</code> در محیط Node.js آسیب‌پذیر نیستند. طبق راهنمای امنیتی رسمی، این مشکل زمانی مطرح است که داده‌های تحت کنترل مهاجم در محتوا، ویژگی‌ها یا استایل‌های SVG قرار بگیرند.</p>



<p class="wp-block-paragraph">نسخه‌های Next.js 15.x نیز در برابر این RCE آسیب‌پذیر اعلام نشده‌اند. با این حال Vercel نسخه <code>15.5.26</code> را با تغییرات امنیتی مرتبط برای هاردنینگ منتشر کرده است.</p>



<h2 id="h-چگونه-آسیب-پذیری-cve-2026-94545-را-برطرف-کنیم" class="wp-block-heading">چگونه آسیب‌پذیری CVE-2026-94545 را برطرف کنیم؟</h2>



<p class="wp-block-paragraph">راهکار اصلی، ارتقای Next.js به نسخه اصلاح‌شده <code>16.3.6</code> است. Next.js دستور زیر را برای نسخه 16.3 اعلام کرده است:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>npm install next@16.3.6</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">npm</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">install</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">next@16.3.6</span></span></code></pre></div>



<p class="wp-block-paragraph">بر اساس گزارش The Hacker News، در ۲۳ سپتامبر نسخه اصلاح‌شده‌ای برای شاخه 16.2 در npm registry وجود نداشت؛ در نتیجه، اپلیکیشن‌هایی که از نسخه 16.2 استفاده می‌کنند، باید Next.js را به نسخه 16.3.6 ارتقا دهند.</p>



<p class="wp-block-paragraph">برای Next.js 15.5 نیز نسخه هاردنینگ شده را می‌توان با دستور زیر نصب کرد:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>npm install next@15.5.26</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">npm</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">install</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">next@15.5.26</span></span></code></pre></div>



<p class="wp-block-paragraph">البته همان‌طور که اشاره کردیم، Vercel تأکید کرده که Next.js 15.x در برابر RCE مورد بحث آسیب‌پذیر نیست و انتشار <code>15.5.26</code> با هدف hardening مرتبط انجام شده است.</p>



<p class="wp-block-paragraph">اگر امکان ارتقای فوری Next.js وجود ندارد، راهکار موقت این است که داده‌های تحت کنترل مهاجم در محتوا، ویژگی‌ها یا استایل‌های SVG قرار نگیرند. این راهکار برای <code>ImageResponse</code> در محیط Node.js ارائه شده است.</p>



<p class="wp-block-paragraph">همچنین، اگر پروژه به‌طور مستقیم از Satori استفاده می‌کند، باید آن را به نسخه <code>0.33.5</code> ارتقا داد. طبق گزارش The Hacker News، این نسخه مشکل امنیتی Satori را برطرف می‌کند.</p>



<h2 id="h-آیا-این-آسیب-پذیری-next-js-در-حملات-واقعی-استفاده-شده-است" class="wp-block-heading">آیا این آسیب‌پذیری Next.js در حملات واقعی استفاده شده است؟</h2>



<p class="wp-block-paragraph">بر اساس بررسی The Hacker News تا ۲۳ سپتامبر ۲۰۲۶، گزارش عمومی از حمله‌ای که از CVE-2026-94545 استفاده کرده باشد وجود نداشت و کد exploit عمومی نیز منتشر نشده بود.</p>



<p class="wp-block-paragraph">همچنین، Vercel مشخص نکرده است که آیا اپلیکیشن‌های میزبانی‌شده روی این پلتفرم در برابر این آسیب‌پذیری محافظت می‌شوند یا خیر. این منابع همچنین روشی برای تشخیص سوءاستفاده احتمالی از یک <code>route</code> آسیب‌پذیر پیش از نصب به‌روزرسانی امنیتی ارائه نکرده‌اند.</p>



<div class="wp-block-dh-blog-card-database-block card database">
<div class="wp-block-group row align-items-center is-nowrap is-layout-flex wp-container-core-group-is-layout-8f761849 wp-block-group-is-layout-flex">
<div class="wp-block-group col-md"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h3 id="h-پلتفرم-ابری-دارکوب-هر-آنچه-برای-استقرار-محصولتان-نیاز-دارید" class="wp-block-heading">💡 پلتفرم ابری دارکوب؛ هر آنچه برای استقرار محصولتان نیاز دارید</h3>



<p class="wp-block-paragraph">پلتفرم ابری دارکوب با ارائه زیرساخت مبتنی بر کوبرنتیز، نیازهای شما برای بیلد، دیپلوی و نگهداری محصولتان را رفع و فرایند استقرار محصول را ساده‌تر می‌کند.</p>



<p class="wp-block-paragraph"><br>✅ پشتیبانی از انواع اپ‌های کانتینری شده<br>✅ اتصال آسان به گیت و راه‌اندازی CI/CD<br>✅ پشتیبان‌گیری خودکار روزانه</p>



<p class="wp-block-paragraph"></p>
</div></div>
</div>



<div class="wp-block-group col-md-auto"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p class="btn btn--main btn--wide wp-block-paragraph"><a href="https://hamravesh.com/darkube" data-type="link" data-id="https://hamravesh.com/darkube" target="_blank" rel="noreferrer noopener">مشاهده پلتفرم ابری دارکوب</a></p>
</div></div>
</div>



<h2 id="h-جمع-بندی" class="wp-block-heading">جمع‌بندی</h2>



<p class="wp-block-paragraph">آسیب‌پذیری CVE-2026-94545 با امتیاز 9.5 از 10 در معیار CVSS، در دسته آسیب‌پذیری‌های بحرانی قرار می‌گیرد و نسخه‌های <code>16.2.0</code> تا <code>16.3.5</code> از Next.js را تحت شرایط مشخصی درگیر می‌کند. این آسیب‌پذیری به <code>ImageResponse</code> در محیط Node.js مربوط است و زمانی می‌تواند خطرساز شود که داده‌های تحت کنترل مهاجم در محتوا، ویژگی‌ها یا استایل‌های SVG قرار بگیرند.</p>



<p class="wp-block-paragraph">راهکار اصلی Vercel برای رفع مشکل، ارتقای Next.js به نسخه <code>16.3.6</code> است. اگر ارتقای فوری امکان‌پذیر نیست، باید از قرار دادن داده‌های تحت کنترل مهاجم در محتوا، ویژگی‌ها یا استایل‌های SVG تولیدشده با <code>ImageResponse</code> در محیط Node.js جلوگیری کرد.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/nextjs-cve-2026-94545-vulnerability/">بررسی آسیب‌پذیری ImageResponse در Next.js؛ راهکار رفع مشکل</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/nextjs-cve-2026-94545-vulnerability/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>آشنایی با Session Replay سنتری هم‌روش؛ مشاهده مشکل اپلیکیشن از دید تجربه کاربر</title>
		<link>https://hamravesh.com/blog/what-is-sentry-session-replay/</link>
					<comments>https://hamravesh.com/blog/what-is-sentry-session-replay/#respond</comments>
		
		<dc:creator><![CDATA[علی باقرزاده]]></dc:creator>
		<pubDate>Wed, 09 Sep 2026 08:30:00 +0000</pubDate>
				<category><![CDATA[مشاهده‌پذیری]]></category>
		<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5699</guid>

					<description><![CDATA[<p>وقتی یک کاربر با خطا مواجه می‌شود، گزارش‌های فنی همیشه تمام ماجرا را نشان نمی‌دهند. ممکن است تیم توسعه به Stack Trace، لاگ‌های برنامه و جزئیات درخواست‌های شبکه دسترسی داشته باشد، اما همچنان نداند کاربر پیش از وقوع خطا چه مراحلی را طی کرده، روی چه عناصری کلیک کرده یا در کدام بخش رابط کاربری [&#8230;]</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-sentry-session-replay/">آشنایی با Session Replay سنتری هم‌روش؛ مشاهده مشکل اپلیکیشن از دید تجربه کاربر</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph" id="h-وقتی-یک-کاربر-با-خطا-مواجه-می-شود-گزارش-های-فنی-همیشه-تمام-ماجرا-را-نشان-نمی-دهند-ممکن-است-تیم-توسعه-به-stack-trace-لاگ-های-برنامه-و-جزئیات-درخواست-های-شبکه-دسترسی-داشته-باشد-اما-همچنان-نداند-کاربر-پیش-از-وقوع-خطا-چه-مراحلی-را-طی-کرده-روی-چه-عناصری-کلیک-کرده-یا-در-کدام-بخش-رابط-کاربری-متوقف-شده-است">وقتی یک کاربر با خطا مواجه می‌شود، گزارش‌های فنی همیشه تمام ماجرا را نشان نمی‌دهند. ممکن است تیم توسعه به Stack Trace، لاگ‌های برنامه و جزئیات درخواست‌های شبکه دسترسی داشته باشد، اما همچنان نداند کاربر پیش از وقوع خطا چه مراحلی را طی کرده، روی چه عناصری کلیک کرده یا در کدام بخش رابط کاربری متوقف شده است. قابلیت <strong>Session Replay در سنتری</strong> برای پاسخ به همین پرسش‌ها طراحی شده است.</p>



<p class="wp-block-paragraph" id="h-وقتی-یک-کاربر-با-خطا-مواجه-می-شود-گزارش-های-فنی-همیشه-تمام-ماجرا-را-نشان-نمی-دهند-ممکن-است-تیم-توسعه-به-stack-trace-لاگ-های-برنامه-و-جزئیات-درخواست-های-شبکه-دسترسی-داشته-باشد-اما-همچنان-نداند-کاربر-پیش-از-وقوع-خطا-چه-مراحلی-را-طی-کرده-روی-چه-عناصری-کلیک-کرده-یا-در-کدام-بخش-رابط-کاربری-متوقف-شده-است">این قابلیت، تعامل کاربر با برنامه را به‌شکل تصویری بازسازی می‌کند و اطلاعات آن را در کنار خطاها، رویدادهای شبکه، پیام‌های کنسول و داده‌های عملکردی قرار می‌دهد. نتیجه این است که تیم فنی به‌جای حدس‌زدن شرایط وقوع مشکل، می‌تواند تجربه واقعی کاربر را بررسی کند.</p>



<h2 id="h-session-replay-سنتری-چیست" class="wp-block-heading">Session Replay سنتری چیست؟</h2>



<p class="wp-block-paragraph">قابلیت Session Replay سنتری نمایشی شبیه ویدئو از نشست کاربر ارائه می‌دهد، اما در عمل یک فیلم ضبط‌شده از صفحه نمایش نیست. <a href="https://hamravesh.com/blog/what-is-sentry" data-type="link" data-id="https://hamravesh.com/blog/what-is-sentry" target="_blank" rel="noreferrer noopener">سنتری</a> وضعیت و تغییرات ساختار صفحه را در کنار تعاملاتی مانند کلیک، پیمایش و جابه‌جایی میان صفحات ثبت می‌کند و سپس آن‌ها را به‌شکل یک نشست قابل‌پخش بازسازی می‌کند.</p>



<p class="wp-block-paragraph">این تفاوت از نظر فنی و حفظ حریم خصوصی مهم است. در این روش، سنتری لزوماً پیکسل‌های صفحه را مانند یک ابزار فیلم‌برداری ضبط نمی‌کند؛ بلکه وضعیت رابط کاربری و تغییرات آن را بازسازی می‌کند. البته قابلیت ثبت برخی عناصر مانند Canvas، محتوای چندرسانه‌ای یا اجزای متعلق به دامنه‌های دیگر، محدودیت‌ها و تنظیمات جداگانه‌ای دارد.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1024" height="639" src="https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay04-1024x639.jpeg" alt="" class="wp-image-5703" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay04-1024x639.jpeg 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay04-300x187.jpeg 300w, https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay04-767x479.jpeg 767w, https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay04-120x75.jpeg 120w, https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay04.jpeg 1280w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">نمایی از Session Replay در سنتری و نمایش زمان وقوع یک خطا. با کلیک روی هر خطا می‌توان جزئیات کامل مرتبط با آن از جمله Stack Trace، خط کد خطا، Breadcrumpها و بسیاری موارد دیگر را مشاهده کرد. </figcaption></figure>



<p class="wp-block-paragraph">هر نشست ضبط‌شده می‌تواند اطلاعاتی مانند موارد زیر را در اختیار تیم توسعه قرار دهد:</p>



<ul class="wp-block-list">
<li>مسیر حرکت کاربر در برنامه</li>



<li>کلیک‌ها و تعاملات کاربر</li>



<li>پیمایش در صفحه</li>



<li>تغییر مسیرها و بارگذاری صفحات</li>



<li>خطاهای سمت کاربر و سرور</li>



<li>پیام‌های ثبت‌شده در Console</li>



<li>درخواست‌های Fetch و XHR</li>



<li>پاسخ‌های ناموفق یا کند شبکه</li>



<li>رخدادهای عملکردی و Traceها</li>



<li>کلیک‌های تکراری،‌ عصبی یا بدون نتیجه</li>
</ul>



<p class="wp-block-paragraph">ترکیب این اطلاعات، Session Replay سنتری را از یک ابزار صرفاً بصری به بخشی از فرایند مشاهده‌پذیری و عیب‌یابی تبدیل می‌کند.</p>



<div class="wp-block-dh-blog-card-database-block card database">
<div class="wp-block-group row align-items-center is-nowrap is-layout-flex wp-container-core-group-is-layout-8f761849 wp-block-group-is-layout-flex">
<div class="wp-block-group col-md"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h3 id="h-سنتری-هم-روش-مشاهده-تحلیل-و-رفع-مشکلات-اپلیکیشن-در-یک-پلتفرم-یکپارچه" class="wp-block-heading">💡 سنتری هم‌روش؛ مشاهده، تحلیل و رفع مشکلات اپلیکیشن در یک پلتفرم یکپارچه</h3>



<p class="wp-block-paragraph">با سرویس سنتری هم‌روش می‌توانید بدون تحمیل بار عملیاتی میزبانی و نگهداری Sentry به تیم فنی، از قابلیت‌های آن برای مشاهده و تحلیل مشکلات اپلیکیشن استفاده کنید.</p>



<p class="wp-block-paragraph"><br>✅ راه‌اندازی و نگهداری زیرساخت توسط هم‌روش<br>✅ کاهش بار عملیاتی تیم‌های توسعه، DevOps و Platform<br>✅ امکان استقرار و نگهداری روی زیرساخت اختصاصی سازمان</p>



<p class="wp-block-paragraph"></p>
</div></div>
</div>



<div class="wp-block-group col-md-auto"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p class="btn btn--main btn--wide wp-block-paragraph"><a href="https://hamravesh.com/sentry" target="_blank" rel="noreferrer noopener">مشاهده سرویس سنتری هم‌روش</a></p>
</div></div>
</div>



<h2 id="h-چرا-گزارش-خطا-به-تنهایی-کافی-نیست" class="wp-block-heading">چرا گزارش خطا به‌تنهایی کافی نیست؟</h2>



<p class="wp-block-paragraph">یک گزارش خطا معمولاً مشخص می‌کند که مشکل در کدام تابع، فایل یا خط کد رخ داده است. بااین‌حال، برای پاسخ‌دادن به پرسش‌های زیر کافی نیست:</p>



<ul class="wp-block-list">
<li>کاربر پیش از وقوع خطا چه کاری انجام داده بود؟</li>



<li>آیا خطا مانع ادامه فرایند شد؟</li>



<li>آیا کاربر چند بار روی یک دکمه کلیک کرد؟</li>



<li>آیا رابط کاربری در وضعیت بارگذاری باقی ماند؟</li>



<li>آیا یک درخواست شبکه با تأخیر یا خطا مواجه شد؟</li>



<li>آیا مشکل فقط در یک مرورگر یا دستگاه مشخص رخ می‌دهد؟</li>



<li>آیا کاربر پس از خطا تلاش کرد مسیر دیگری را امتحان کند؟</li>
</ul>



<p class="wp-block-paragraph">برای مثال، ممکن است گزارش خطا نشان دهد که یک مقدار تهی باعث شکست عملیات پرداخت شده است. Session Replay سنتری می‌تواند نشان دهد که کاربر ابتدا روش پرداخت را تغییر داده، سپس به مرحله قبل بازگشته و دوباره فرم را ارسال کرده است. این توالی ممکن است همان سناریویی باشد که تیم تست پیش‌تر بررسی نکرده است.</p>



<p class="wp-block-paragraph">به‌عبارت دیگر، گزارش خطا محل شکست را نشان می‌دهد؛ اما Session Replay سنتری می‌تواند شرایط و مسیر رسیدن به آن را روشن کند.</p>



<h2 id="h-مهم-ترین-کاربردهای-session-replay" class="wp-block-heading">مهم‌ترین کاربردهای Session Replay</h2>



<h3 id="h-۱-بازتولید-خطاهای-دشوار" class="wp-block-heading">۱. بازتولید خطاهای دشوار</h3>



<p class="wp-block-paragraph">یکی از زمان‌برترین بخش‌های عیب‌یابی، بازتولید خطایی است که فقط برای بعضی کاربران یا در شرایط خاص رخ می‌دهد. گاهی کاربران در تیکت‌های پشتیبانی توضیحاتی مانند «دکمه کار نکرد» یا «صفحه ناگهان بسته شد» می‌دهند. اما این توضیحات، اطلاعات کافی برای بررسی فنی ارائه نمی‌کنند.</p>



<p class="wp-block-paragraph">با اتصال Replay به رویداد خطا، تیم توسعه می‌تواند وضعیت صفحه و تعاملات قبل و بعد از مشکل را مشاهده کند. این قابلیت به‌خصوص برای خطاهای وابسته به ترتیب تعاملات، وضعیت رابط کاربری، نوع مرورگر یا پاسخ API مفید است.</p>



<h3 id="h-۲-بررسی-مشکلات-عملکردی" class="wp-block-heading">۲. بررسی مشکلات عملکردی</h3>



<p class="wp-block-paragraph">کندی همیشه به‌شکل یک خطای صریح ظاهر نمی‌شود. ممکن است یک درخواست چند ثانیه طول بکشد، یک مؤلفه دیر رندر شود یا کاربر پس از کلیک بازخورد مناسبی دریافت نکند.</p>



<p class="wp-block-paragraph">در Session Replay سنتری می‌توان رفتار کاربر را در کنار درخواست‌های شبکه و Traceهای عملکردی مشاهده کرد. برای مثال، اگر کاربر پس از کلیک چند بار همان دکمه را انتخاب کند، ممکن است رابط کاربری بازخورد مناسبی درباره پردازش درخواست ارائه نکرده باشد.</p>



<h3 id="h-۳-شناسایی-کلیک-های-تکراری-و-بدون-نتیجه" class="wp-block-heading">۳. شناسایی کلیک‌های تکراری و بدون نتیجه</h3>



<p class="wp-block-paragraph">سنتری می‌تواند برخی نشانه‌های نارضایتی کاربر، از جمله Rage Click و Dead Click را شناسایی کند. Rage Click به چند کلیک متوالی روی یک عنصر بی‌پاسخ گفته می‌شود که معمولاً نارضایتی کاربر از عملکرد رابط کاربری را نشان می‌دهند. Dead Click نیز کلیکی روی یک عنصر تعاملی است که تا چند ثانیه پس از انجام آن، هیچ تغییر یا پاسخ قابل‌مشاهده‌ای در صفحه ایجاد نمی‌کند. این رفتارها همیشه نشانه وجود باگ نیستند، اما می‌توانند مشکلاتی مانند طراحی مبهم، پاسخ‌گویی ضعیف رابط کاربری یا خرابی یک مؤلفه را آشکار کنند.</p>



<h3 id="h-۴-درک-اثر-واقعی-خطا-بر-کاربر" class="wp-block-heading">۴. درک اثر واقعی خطا بر کاربر</h3>



<p class="wp-block-paragraph">تمام خطاها اهمیت یکسانی ندارند. ممکن است یک خطا هزاران بار رخ دهد، اما تأثیر محدودی بر تجربه کاربر داشته باشد. در مقابل، یک خطای کم‌تکرار می‌تواند فرایند مهمی مانند ثبت‌نام، خرید یا پرداخت را کاملاً متوقف کند. Session Replay سنتری به تیم فنی کمک می‌کند اثر واقعی خطا را ببیند و اولویت‌بندی مشکلات را فقط بر اساس تعداد رخداد انجام ندهد.</p>



<h3 id="h-۵-کاهش-رفت-وبرگشت-میان-تیم-ها" class="wp-block-heading">۵. کاهش رفت‌وبرگشت میان تیم‌ها</h3>



<p class="wp-block-paragraph">در بسیاری از سازمان‌ها، گزارش مشکل ابتدا به تیم پشتیبانی می‌رسد و سپس میان تیم محصول، توسعه و عملیات جابه‌جا می‌شود. اگر اطلاعات اولیه ناقص باشد، فرایند بررسی طولانی خواهد شد.</p>



<p class="wp-block-paragraph">وجود Replay مرتبط با خطا می‌تواند بخشی از این شکاف اطلاعاتی را کاهش دهد. به کمک Session Replay تیم‌های مختلف یک مرجع مشترک برای مشاهده رفتار کاربر و داده‌های فنی در اختیار خواهند داشت.</p>



<h2 id="h-ارتباط-session-replay-با-قابلیت-های-دیگر-سنتری" class="wp-block-heading">ارتباط Session Replay با قابلیت‌های دیگر سنتری</h2>



<p class="wp-block-paragraph">ارزش اصلی Session Replay سنتری زمانی مشخص می‌شود که در کنار سایر داده‌های سنتری استفاده شود. صفحه Replay فقط یک پخش‌کننده تصویری نیست؛ بلکه خط زمانی مشترکی برای چند نوع داده فراهم می‌کند.</p>



<p class="wp-block-paragraph">تیم توسعه می‌تواند در یک نشست، ارتباط میان موارد زیر را بررسی کند:</p>



<ul class="wp-block-list">
<li>اقدام کاربر در رابط کاربری</li>



<li>خطای ثبت‌شده در برنامه</li>



<li>پیام‌های Console</li>



<li>درخواست‌ها و پاسخ‌های شبکه</li>



<li>Breadcrumbها</li>



<li>Transactionها و Spanها</li>



<li>خطاهای مرتبط سمت Backend</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay03-1024x576.jpeg" alt="نمایش تجربه کاربر در لحظاتی قبل از وقوع خطا در Session Replay سنتری" class="wp-image-5701" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay03-1024x576.jpeg 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay03-300x169.jpeg 300w, https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay03-1536x864.jpeg 1536w, https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay03-768x432.jpeg 768w, https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay03-120x68.jpeg 120w, https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay03.jpeg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">اگر یک Replay به رویداد خطا مرتبط شده باشد، در صفحه جزئیات خطا می‌توان نمایی از تجربه کاربر را در لحظات پیش از وقوع مشکل مشاهده کرد.</figcaption></figure>



<p class="wp-block-paragraph">برای نمونه، توسعه‌دهنده می‌تواند لحظه کلیک کاربر روی دکمه ثبت سفارش را مشاهده کند، درخواست API مرتبط با آن را پیدا کند و مدت‌زمان یا وضعیت پاسخ را بررسی کند. اگر ردیابی توزیع‌شده به‌درستی پیکربندی شده باشد، بررسی مسیر درخواست در سرویس‌های Backend نیز امکان‌پذیر خواهد بود.</p>



<h2 id="h-نرخ-نمونه-برداری-در-session-replay-چگونه-تعیین-می-شود" class="wp-block-heading">نرخ نمونه‌برداری در Session Replay چگونه تعیین می‌شود؟</h2>



<p class="wp-block-paragraph">ثبت تمام نشست‌های کاربران معمولاً ضروری یا مقرون‌به‌صرفه نیست. سنتری امکان تعیین نرخ نمونه‌برداری جداگانه (Sample Rate) برای نشست‌های عادی و نشست‌های دارای خطا را فراهم می‌کند. به‌این‌ترتیب، تیم فنی می‌تواند درصد محدودی از نشست‌های عادی را ثبت کند و نرخ بیشتری به نشست‌هایی اختصاص دهد که در آن‌ها خطایی رخ داده است. نرخ مناسب باید بر اساس حجم ترافیک، هزینه نگهداری داده و نیازهای عیب‌یابی تعیین شود.</p>



<p class="wp-block-paragraph">انتخاب نرخ نمونه‌برداری بالا بدون بررسی حجم ترافیک می‌تواند مصرف داده و هزینه سرویس را افزایش دهد. علاوه بر این، هرچه تعداد نشست‌های ثبت‌شده بیشتر باشد، مدیریت دسترسی و الزامات حریم خصوصی نیز اهمیت بیشتری پیدا می‌کند.</p>



<h2 id="h-حریم-خصوصی-در-session-replay-چگونه-حفظ-می-شود" class="wp-block-heading">حریم خصوصی در Session Replay چگونه حفظ می‌شود؟</h2>



<p class="wp-block-paragraph">فعال‌کردن Session Replay سنتری بدون توجه به حریم خصوصی کاربران، تصمیم درستی نیست. رابط کاربری یک برنامه ممکن است اطلاعات شخصی، داده‌های مالی، پیام‌های خصوصی یا اطلاعات محرمانه سازمانی را نمایش دهد. بنابراین، پیش از استفاده از این قابلیت باید مشخص شود چه داده‌هایی اجازه ثبت دارند و چه بخش‌هایی باید از Replay حذف یا پنهان شوند.</p>



<p class="wp-block-paragraph">سنتری به‌صورت پیش‌فرض متن‌ها و ورودی‌های کاربران را می‌پوشاند و نمایش محتوای چندرسانه‌ای مانند تصاویر و ویدئوها را مسدود می‌کند. بااین‌حال، اتکا به تنظیمات پیش‌فرض کافی نیست؛ زیرا نوع اطلاعات حساس در هر برنامه متفاوت است و تغییرات رابط کاربری نیز ممکن است داده‌های جدیدی را در معرض ثبت قرار دهد.</p>



<p class="wp-block-paragraph">برای محافظت از اطلاعات می‌توان محتوای حساس را پوشاند یا بعضی عناصر را به‌طور کامل از Replay حذف کرد. در روش پوشاندن، ساختار کلی عنصر باقی می‌ماند، اما محتوای آن قابل‌مشاهده نیست. در روش مسدودسازی، خود عنصر و محتوای آن در بازسازی نشست نمایش داده نمی‌شوند.</p>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="576" src="https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay02-1024x576.jpeg" alt="نمایی از قابلیت سشن ریپلی سنتری و نمایش مخفی‌کردن داده‌های ورودی حساس کاربران" class="wp-image-5700" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay02-1024x576.jpeg 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay02-300x169.jpeg 300w, https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay02-768x432.jpeg 768w, https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay02-1536x864.jpeg 1536w, https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay02-120x68.jpeg 120w, https://hamravesh.com/blog/wp-content/uploads/2026/09/hamravesh-what-is-sentry-session-replay02.jpeg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">برای حفظ حریم خصوصی، سشن ریپلی سنتری امکان مخفی‌کردن داده‌های ورودی حساس کاربران در فرایند پخش نشست را دارد.</figcaption></figure>



<p class="wp-block-paragraph">اطلاعاتی مانند گذرواژه، شماره کارت، کد احراز هویت، داده‌های پزشکی و پیام‌های خصوصی نباید در Replay قابل مشاهده باشند. همچنین نمایش متن واقعی تنها باید برای عناصر مشخص و کم‌خطر مجاز شود؛ غیرفعال‌کردن عمومی پوشش اطلاعات، ریسک افشای داده را به‌شدت افزایش می‌دهد.</p>



<p class="wp-block-paragraph">در کنار کنترل محتوای ثبت‌شده، دسترسی اعضای سازمان به Replayها و مدت نگهداری این داده‌ها نیز باید مدیریت شود. سیاست حریم خصوصی Session Replay باید با الزامات حقوقی، سیاست‌های امنیتی و قواعد نگهداری داده در سازمان هماهنگ باشد.</p>



<h2 id="h-آیا-محتوای-درخواست-ها-و-پاسخ-های-شبکه-ثبت-می-شود" class="wp-block-heading">آیا محتوای درخواست‌ها و پاسخ‌های شبکه ثبت می‌شود؟</h2>



<p class="wp-block-paragraph">Session Replay سنتری به‌صورت پیش‌فرض اطلاعات پایه درخواست‌های خروجی Fetch و XHR، مانند آدرس درخواست، متد، اندازه بدنه و کد وضعیت را ثبت می‌کند. بااین‌حال، ثبت محتوای کامل بدنه درخواست و پاسخ به تنظیمات جداگانه نیاز دارد</p>



<p class="wp-block-paragraph">ثبت نامحدود محتوای درخواست‌ها و پاسخ‌های شبکه ممکن است اطلاعات شخصی، توکن‌ها یا داده‌های محرمانه را وارد سامانه مانیتورینگ کند. بنابراین، فهرست آدرس‌های مجاز و Headerهای قابل‌ثبت باید محدود و هدفمند باشد.</p>



<p class="wp-block-paragraph">رویکرد صحیح این نیست که «همه‌چیز را ثبت کنیم تا شاید بعداً مفید باشد»؛ بلکه باید فقط داده‌ای ثبت شود که ضرورت عملیاتی آن روشن است و برای نگهداری آن مجوز و کنترل کافی وجود دارد.</p>



<h2 id="h-ملاحظات-عملکردی-و-فنی" class="wp-block-heading">ملاحظات عملکردی و فنی</h2>



<p class="wp-block-paragraph">Session Replay سنتری برای کاهش فشار روی رابط کاربری، داده‌های Replay را فشرده‌سازی و پردازش می‌کند. بااین‌حال، هیچ ابزار ثبت نشستی کاملاً بدون هزینه نیست. در برنامه‌هایی مانند داشبوردهای زنده که محتوای صفحه به‌طور مداوم تغییر می‌کند، Session Replay باید تعداد بیشتری از تغییرات را ثبت و پردازش کند. این موضوع ممکن است مصرف پردازنده، حافظه و حجم داده ارسالی را افزایش دهد؛ بنابراین تأثیر آن بر عملکرد برنامه باید پیش از انتشار گسترده بررسی شود.</p>



<p class="wp-block-paragraph">پیش از انتشار گسترده باید موارد زیر بررسی شوند:</p>



<ul class="wp-block-list">
<li>تأثیر Replay بر مصرف پردازنده و حافظه دستگاه کاربر</li>



<li>حجم داده ارسالی در شبکه</li>



<li>رفتار برنامه در دستگاه‌های ضعیف و اینترنت کند</li>



<li>بررسی مجوز اجرای Web Worker در سیاست امنیتی وب‌سایت</li>



<li>بررسی ثبت نمودارها و عناصر گرافیکی Canvas</li>



<li>محدودیت ثبت محتوای iframeهای بارگذاری‌شده از وب‌سایت‌های دیگر</li>



<li>بررسی دسترسی Replay به فونت‌ها و فایل‌های خارجی</li>



<li>رفتار Replay در صفحات دارای تغییرات پرتعداد DOM</li>
</ul>



<p class="wp-block-paragraph">اگر سیاست امنیتی وب‌سایت اجازه اجرای پردازش‌های پس‌زمینه موردنیاز Session Replay را ندهد، سنتری ممکن است نتواند داده‌های نشست را به‌درستی پردازش و ارسال کند. برای جلوگیری از این مشکل، باید مجوزهای مربوط به Web Worker در تنظیمات امنیتی وب‌سایت بر اساس مستندات نسخه SDK سنتری بررسی شوند.</p>



<h2 id="h-session-replay-چه-چیزی-نیست" class="wp-block-heading">Session Replay چه چیزی نیست؟</h2>



<p class="wp-block-paragraph">برداشت اشتباه از این قابلیت می‌تواند انتظارات غیرواقعی ایجاد کند. Session Replay موارد زیر نیست:</p>



<ul class="wp-block-list">
<li>جایگزین تست خودکار و تست دستی نیست.</li>



<li>جایگزین لاگ‌گذاری ساختاریافته نیست.</li>



<li>جایگزین Error Monitoring و Performance Monitoring نیست.</li>



<li>ابزار تحلیل کامل رفتار محصول نیست.</li>



<li>تضمین نمی‌کند تمام نشست‌ها بدون نقص بازسازی شوند.</li>



<li>مجوزی برای جمع‌آوری نامحدود اطلاعات کاربران ایجاد نمی‌کند.</li>
</ul>



<p class="wp-block-paragraph">Replay باید در کنار سایر ابزارهای مشاهده‌پذیری استفاده شود. این قابلیت زمینه وقوع مشکل را فراهم می‌کند، اما تحلیل علت ریشه‌ای همچنان به داده‌های خطا، Traceها، Metrics و لاگ‌ها نیاز دارد.</p>



<h2 id="h-الگوی-پیشنهادی-برای-استفاده-عملیاتی" class="wp-block-heading">الگوی پیشنهادی برای استفاده عملیاتی</h2>



<p class="wp-block-paragraph">برای پیاده‌سازی کنترل‌شده سشن ریپلی سنتری می‌توان از مسیر زیر استفاده کرد:</p>



<p class="wp-block-paragraph">۱. ابتدا قابلیت Replay را در محیط آزمایشی فعال کنید.</p>



<p class="wp-block-paragraph">۲. تمام مسیرهای دارای اطلاعات حساس را شناسایی کنید.</p>



<p class="wp-block-paragraph">۳. تنظیمات Mask و Block را پیش از ورود به محیط عملیاتی آزمایش کنید.</p>



<p class="wp-block-paragraph">۴. نرخ نمونه‌برداری نشست‌های عادی را متناسب با حجم ترافیک و نیازهای عیب‌یابی تعیین کنید.</p>



<p class="wp-block-paragraph">۵. برای نشست‌های دارای خطا نرخ بیشتری در نظر بگیرید.</p>



<p class="wp-block-paragraph">۶. دسترسی به Replayها را بر اساس نقش اعضای تیم محدود کنید.</p>



<p class="wp-block-paragraph">۷. میزان مصرف و حجم داده را پس از فعال‌سازی پایش کنید.</p>



<p class="wp-block-paragraph">۸. به‌صورت دوره‌ای بررسی کنید که تغییرات رابط کاربری باعث افشای داده جدید نشده باشند.</p>



<p class="wp-block-paragraph">۹. سیاست نگهداری داده و الزامات حقوقی سازمان را با پیکربندی فنی هماهنگ کنید.</p>



<p class="wp-block-paragraph">۱۰. از Replay برای پاسخ به پرسش‌های مشخص استفاده کنید، نه برای مشاهده تصادفی رفتار کاربران.</p>



<h2 id="h-جمع-بندی" class="wp-block-heading">جمع‌بندی</h2>



<p class="wp-block-paragraph">قابلیت Session Replay در سنتری، شکاف اطلاعاتی میان گزارش فنی خطا و تجربه واقعی کاربر را کاهش می‌دهد. تیم توسعه با استفاده از این قابلیت می‌تواند مسیر حرکت کاربر، تعاملات او با رابط کاربری، درخواست‌های شبکه، خطاها و داده‌های عملکردی را در یک خط زمانی مشترک بررسی کند.</p>



<p class="wp-block-paragraph">مزیت اصلی Session Replay فقط مشاهده رفتار کاربر نیست؛ بلکه برقراری ارتباط میان رفتار او و داده‌های فنی سامانه است. این ارتباط می‌تواند زمان لازم برای بازتولید و عیب‌یابی خطا را کاهش دهد، اولویت‌بندی مشکلات را دقیق‌تر کند و همکاری میان تیم‌های توسعه، محصول، عملیات و پشتیبانی را بهبود بخشد.</p>



<p class="wp-block-paragraph">بااین‌حال، استفاده مؤثر از این قابلیت به سه عامل وابسته است: انتخاب حساب‌شده نرخ نمونه‌برداری، رعایت سخت‌گیرانه الزامات حریم خصوصی و اتصال صحیح Replay به سایر داده‌های مشاهده‌پذیری. فعال‌کردن این قابلیت بدون برنامه‌ای مشخص، لزوماً به عیب‌یابی بهتر منجر نمی‌شود و ممکن است هزینه‌ها و ریسک‌های غیرضروری ایجاد کند.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-sentry-session-replay/">آشنایی با Session Replay سنتری هم‌روش؛ مشاهده مشکل اپلیکیشن از دید تجربه کاربر</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-sentry-session-replay/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>تشریح آسیب‌پذیری Dirty Frag لینوکس با امکان دسترسی روت؛ آموزش تشخیص و ایمن‌سازی</title>
		<link>https://hamravesh.com/blog/dirty-frag-linux-vulnerability-explained/</link>
					<comments>https://hamravesh.com/blog/dirty-frag-linux-vulnerability-explained/#respond</comments>
		
		<dc:creator><![CDATA[علی باقرزاده]]></dc:creator>
		<pubDate>Tue, 19 May 2026 10:00:47 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[لینوکس]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=5077</guid>

					<description><![CDATA[<p>آسیب‌پذیری Dirty Frag لینوکس که به تازگی تشخیص داده شده و توسط برخی هکرها از آن سوء استفاده شده، می‌تواند مشکلات امنیتی جدی از جمله دسترسی روت را به همراه داشته باشد. در این مطلب به جزئیات این آسیب‌پذیری، روش سوء استفاده احتمالی هکرها از آن و روش‌های تشخیص و ایمن‌سازی در مقابل باگ Dirty [&#8230;]</p>
<p>The post <a href="https://hamravesh.com/blog/dirty-frag-linux-vulnerability-explained/">تشریح آسیب‌پذیری Dirty Frag لینوکس با امکان دسترسی روت؛ آموزش تشخیص و ایمن‌سازی</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">آسیب‌پذیری Dirty Frag لینوکس که به تازگی تشخیص داده شده و توسط برخی هکرها از آن سوء استفاده شده، می‌تواند مشکلات امنیتی جدی از جمله دسترسی روت را به همراه داشته باشد. در این مطلب به جزئیات این آسیب‌پذیری، روش سوء استفاده احتمالی هکرها از آن و روش‌های تشخیص و ایمن‌سازی در مقابل باگ Dirty Frag می‌پردازیم. </p>



<h2 class="wp-block-heading" id="h-نقص-امنیتی-dirty-frag-چیست-و-چگونه-عمل-می-کند">نقص امنیتی Dirty Frag چیست و چگونه عمل می‌‌کند؟</h2>



<p class="wp-block-paragraph">نقص امنیتی Dirty Frag می‌تواند به یک کاربر با سطح دسترسی پایین، با استفاده از نقص‌های ماژول کرنل esp6 ،esp4 و rxrpc سطح دسترسی روت بدهد و در ادامه این کاربر می‌تواند دستوراتی با سطح دسترسی روت را اجرا کند. کد اثبات مفهوم این آسیب‌پذیری منتشر شده و به همین دلیل حالا یک ریسک فوری محسوب می‌شود. </p>



<p class="wp-block-paragraph">در جدول زیر کلیات مربوط به باگ Dirty Frag ذکر شده است:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>CVE</strong></td><td>CVE-2026-43284 و CVE-2026-43500</td></tr><tr><td><strong>نوع</strong></td><td>ارتقای سطح دسترسی محلی (Local Privilege Escalation)</td></tr><tr><td><strong>سطح خطر امنیتی</strong></td><td>بالا (CVSS 7.8)</td></tr><tr><td><strong>وضعیت</strong></td><td>به طور فعال مورد سوء استفاده قرار گرفته</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Dirty Frag در مقایسه با بسیاری از دیگر آسیب‌پذیری‌های ارتقای سطح دسترسی محلی (LPE)، پتانسیل بسیار بیشتری برای سوء استفاده دارد. این نقص امنیتی به‌صورت زنجیره‌ای، از لایه‌های پردازش شبکه و قطعه‌های حافظه در کرنل سوءاستفاده می‌کند و بر خلاف بسیاری از نقص‌های دیگر، با تکیه بر شرایط رقابتی (Race Condition) عمل نمی‌کند. در روش‌های مبتنی بر شرایط رقابتی، مهاجم سعی می‌کند با دستکاری زمان‌بندی بین عملیات‌ها، برنامه را وادار به انجام کاری کند که برنامه‌نویس انتظارش را نداشته است و به دلیل وابستگی این شرایط به زمان‌بندی، می‌تواند غیر قابل اعتماد باشد. روش باگ Dirty Frag موجب می‌شود این حمله پایدار، قابل‌اتکا و به‌سادگی قابل بازتولید باشد. در نتیجه مهاجم پس از به‌دست آوردن نخستین دسترسی خود به محیط هدف، می‌تواند این آسیب‌پذیری را به‌آسانی مورد سوءاستفاده قرار دهد.</p>



<h3 class="wp-block-heading" id="h-چه-توزیع-هایی-در-معرض-این-آسیب-پذیری-هستند">چه توزیع‌هایی در معرض این آسیب‌پذیری هستند؟</h3>



<p class="wp-block-paragraph">تمام توزیع‌های اصلی از جمله موارد زیر در معرض این آسیب‌پذیری هستند:</p>



<ul class="wp-block-list">
<li>Ubuntu</li>



<li>Rocky Linux</li>



<li>AlmaLinux</li>



<li>CentOS Stream</li>



<li>RHEL (یا Red Hat Enterprise Linux)</li>



<li>Fedora</li>



<li>openSUSE</li>



<li>OpenShift</li>
</ul>



<h2 class="wp-block-heading" id="h-تحلیل-فنی-آسیب-پذیری-های-تشکیل-دهنده-نقص-امنیتی-dirty-frag">تحلیل فنی آسیب‌پذیری‌های تشکیل‌دهنده نقص امنیتی <strong>Dirty Frag</strong><br></h2>



<p class="wp-block-paragraph" id="h-تحلیل-فنی-آسیب-پذیری-های-تشکیل-دهنده-dirty-frag">باگ Dirty Frag از دو آسیب‌پذیری متفاوت در کرنل لینوکس تشکیل شده است که کامپوننت شبکه و کامپوننت مدیریت قطعه‌های حافظه را تحت تأثیر قرار می‌دهند. </p>



<p class="wp-block-paragraph" id="h-تحلیل-فنی-آسیب-پذیری-های-تشکیل-دهنده-dirty-frag">نخستین آسیب‌پذیری با شناسه CVE-2026-43284، مؤلفه‌های esp4 و esp6 را هدف قرار می‌دهد. این مؤلفه‌ها مسئول پردازش ESP ‏(مخفف Encapsulated Security Payload) هستند که یکی از پروتکل‌های اصلی در فریم‌ورک IPsec محسوب می‌شود. دومین آسیب‌پذیری با شناسه CVE-2026-43500، کامپوننت rxrpc را تحت تأثیر قرار می‌دهد؛ پروتکلی که در فایل‌سیستم توزیع‌شده AFS مورد استفاده قرار می‌گیرد.</p>



<p class="wp-block-paragraph" id="h-تحلیل-فنی-آسیب-پذیری-های-تشکیل-دهنده-dirty-frag">مهاجمی که از قبل از طریق دسترسی SSH، وب‌شل، فرار از کانتینر یا حتی یک حساب کاربری با سطح دسترسی پایین به سیستم نفوذ کرده باشد، می‌تواند از این زنجیره برای دستیابی به دسترسی کامل روت روی میزبان استفاده کند.</p>



<h2 class="wp-block-heading" id="h-آیا-سیستم-عامل-سرور-من-تحت-تاثیر-باگ-dirty-frag-قرار-گرفته-است">آیا سیستم‌عامل سرور من تحت تاثیر باگ Dirty Frag قرار گرفته است؟</h2>



<p class="wp-block-paragraph">برای بررسی کرنل فعلی سیستم‌عامل خود دستور زیر را اجرا کنید: </p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>uname -r</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">uname</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-r</span></span></code></pre></div>



<p class="wp-block-paragraph">همین حالا می‌توانید با اجرای یک ماژول مسدودسازی در سطح کرنل یک راهکار موقت را اعمال کنید. اما توجه داشته باشید که <strong>غیر فعال کردن esp4 و esp6 ممکن است اتصال‌های VPN مبتنی بر IPsec را با مشکل مواجه کند</strong>. به همین دلیل پیشنهاد می‌کنیم پیش از اجرای فرایند مسدودسازی، راهنما را به دقت مطالعه کنید. </p>



<p class="wp-block-paragraph">همه نسخه‌های کرنل در همه توزیع‌های فهرست‌شده، تا زمانی که یک بسته کرنل وصله‌شده (Patched kernel) نصب نشود، آسیب‌پذیر در نظر گرفته می‌شوند. همچنین می‌توانید بررسی کنید که آیا ماژول‌های آسیب‌پذیر در حال حاضر روی سیستم‌عامل شما بارگذاری شده‌اند یا خیر. توجه داشته باشید که برخی توزیع‌ها این ماژول‌ها را با نام‌های متفاوتی مانند xfrm4_tunnel یا xfrm6_tunnel کامپایل می‌کنند؛ بنابراین بهتر است از یک grep گسترده‌تر استفاده شود:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>lsmod | grep -E 'esp|xfrm|rxrpc'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">lsmod</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">|</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">grep</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-E</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&#39;esp|xfrm|rxrpc&#39;</span></span></code></pre></div>



<p class="wp-block-paragraph">در صورتی‌که این دستور هرگونه خروجی شامل esp6 ،esp4 یا rxrpc برگرداند، به این معناست که این ماژول‌ها بارگذاری شده‌اند و سیستم‌عامل شما تا زمان اعمال راهکار کاهش خطر (Mitigation) یا به‌روزرسانی کرنل، قابل سوء استفاده خواهد بود. نام دقیق ماژول‌های نمایش‌داده‌شده را یادداشت کنید، زیرا در مراحل بعدی به آن‌ها نیاز خواهید داشت.</p>



<h2 class="wp-block-heading" id="h-روش-ایمن-سازی-در-مقابل-نقص-امنیتی-dirty-frag">روش ایمن‌سازی در مقابل نقص امنیتی Dirty Frag</h2>



<p class="wp-block-paragraph">این راهکار موقت، از طریق جلوگیری از بارگذاری سه ماژول کرنل عمل می‌کند. در حال حاضر اعمال این راهکار ایمن است؛ حتی پیش از آنکه کرنل وصله‌شده (Patched kernel) برای توزیع شما منتشر شود.</p>



<h3 class="wp-block-heading" id="h-ایمن-سازی-اوبونتو-نسخه-فعلی-و-تمام-توزیع-های-lts">ایمن‌سازی اوبونتو (نسخه فعلی و تمام توزیع‌های LTS)</h3>



<p class="wp-block-paragraph">آسیب‌پذیری، برای توزیع 26.04LTS و تمام توزیع‌های قدیمی‌تر (از 14.04 به بعد) تایید شده است. </p>



<h4 class="wp-block-heading" id="h-قدم-اول-تایید-نام-ماژول-دقیق-در-کرنل-سیستم-عامل-شما"><strong>قدم اول: تایید نام ماژول دقیق در کرنل سیستم‌عامل شما</strong></h4>



<p class="wp-block-paragraph">توزیع‌ها گاهی esp4/esp6 را با نام‌های متفاوتی مثل xfrm4_tunnel و xfrm6_tunnel کامپایل می‌کنند. قبل از نوشتن فایل پیکربندی، بررسی کنید کرنل دقیقاً از چه نام‌هایی استفاده می‌کند:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>lsmod | grep -E 'esp|xfrm|rxrpc'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">lsmod</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">|</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">grep</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-E</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&#39;esp|xfrm|rxrpc&#39;</span></span></code></pre></div>



<p class="wp-block-paragraph">در تمام دستورات بعدی باید دقیقاً از همان نام‌هایی استفاده کنید که در خروجی می‌بینید.</p>



<h4 class="wp-block-heading" id="h-قدم-دوم-مسدودسازی-ماژول-ها-و-قرار-دادن-در-لیست-سیاه"><strong>قدم دوم: مسدودسازی ماژول‌ها و قرار دادن در لیست سیاه</strong></h4>



<p class="wp-block-paragraph" id="h-قدم-دوم-مسدودسازی-و-بلاک-کردن-ماژول-ها">خط <code>install ... /bin/false</code> مانع بارگذاری ماژول از طریق modprobe می‌شود. خط blacklist نیز مثلاً هنگامی‌که یک نوع بسته شبکه خاص دریافت می‌شود، جلوی بارگذاری خودکار ماژول توسط کرنل از طریق alias دستگاه را می‌گیرد. برای پوشش کامل، هر دو لازم هستند:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>cat &lt;&lt;EOF | sudo tee /etc/modprobe.d/dirty-frag.conf >/dev/null
install esp4 /bin/false
install esp6 /bin/false
install rxrpc /bin/false
blacklist esp4
blacklist esp6
blacklist rxrpc
EOF</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">cat</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7">EOF</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">|</span><span style="color: #ADBAC7"> sudo tee /etc/modprobe.d/dirty-frag.conf </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7">/dev/null</span></span>
<span class="line"><span style="color: #96D0FF">install esp4 /bin/false</span></span>
<span class="line"><span style="color: #96D0FF">install esp6 /bin/false</span></span>
<span class="line"><span style="color: #96D0FF">install rxrpc /bin/false</span></span>
<span class="line"><span style="color: #96D0FF">blacklist esp4</span></span>
<span class="line"><span style="color: #96D0FF">blacklist esp6</span></span>
<span class="line"><span style="color: #96D0FF">blacklist rxrpc</span></span>
<span class="line"><span style="color: #ADBAC7">EOF</span></span></code></pre></div>



<h4 class="wp-block-heading" id="h-قدم-سوم-ریبیلد-initramfs-مرحله-هاردنینگ-عمیق"><strong>قدم سوم: ریبیلد initramfs (مرحله هاردنینگ عمیق)</strong></h4>



<p class="wp-block-paragraph" id="h-قدم-سوم-ریبیلد-initramfs-مرحله-هاردنینگ-عمیق-این-کار-تضمین-می-کند-که-ماژول-ها-حتی-در-مراحل-ابتدایی-بوت-و-قبل-از-mount-شدن-فایل-سیستم-روت-در-دسترس-نباشند-در-بیشتر-سیستم-ها-esp6-esp4-و-rxrpc-بعد-از-بوت-لود-می-شوند-بنابراین-اگر-برای-اجرای-مراحل-بعدی-عجله-دارید-این-مرحله-اختیاری-است-اما-همچنان-یک-اقدام-توصیه-شده-است">این کار تضمین می‌کند که ماژول‌ها حتی در مراحل ابتدایی بوت و قبل از mount شدن فایل‌سیستم روت، در دسترس نباشند. در بیشتر سیستم‌ها esp6 ،esp4 و rxrpc بعد از بوت لود می‌شوند، بنابراین اگر برای اجرای مراحل بعدی، عجله دارید، این مرحله اختیاری است، اما همچنان یک اقدام توصیه شده است:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo update-initramfs -u -k all</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">sudo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">update-initramfs</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-u</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-k</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">all</span></span></code></pre></div>



<h4 class="wp-block-heading" id="h-قدم-چهارم-unload-کردن-ماژول-ها-در-صورتی-که-در-حال-اجرا-هستند"><strong>قدم چهارم: unload کردن ماژول‌ها (در صورتی که در حال اجرا هستند)</strong></h4>



<p class="wp-block-paragraph">به‌جای <code>rmmod</code> از <code>modprobe -r</code> استفاده کنید. این موضوع موجب می‌شود که ماژول‌ها به ترتیب صحیح unload شوند و در نتیجه خطای «module is in use» که در rmmod رخ می‌دهد پیش نیاید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo modprobe -r esp4 esp6 rxrpc 2>/dev/null</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">sudo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">modprobe</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-r</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">esp4</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">esp6</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">rxrpc</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">2&gt;</span><span style="color: #96D0FF">/dev/null</span></span></code></pre></div>



<p class="wp-block-paragraph">در صورتی‌که به هر دلیل قصد ری‌استارت سیستم‌عامل را ندارید، کش‌های کرنل را با دستور زیر پاک کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sync &amp;&amp; echo 3 | sudo tee /proc/sys/vm/drop_caches > /dev/null</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">sync</span><span style="color: #ADBAC7"> &amp;&amp; </span><span style="color: #6CB6FF">echo</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">|</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">sudo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">tee</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">/proc/sys/vm/drop_caches</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">/dev/null</span></span></code></pre></div>



<h4 class="wp-block-heading" id="h-قدم-پنجم-بررسی-صحت-اجرای-راهکار"><strong>قدم پنجم: بررسی صحت اجرای راهکار</strong></h4>



<p class="wp-block-paragraph">در این مرحله دستور زیر را اجرا کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>grep -qE '^(esp4|esp6|rxrpc) ' /proc/modules &amp;&amp; echo "Still loaded - reboot needed" || echo "Modules removed successfully"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">grep</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-qE</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&#39;^(esp4|esp6|rxrpc) &#39;</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">/proc/modules</span><span style="color: #ADBAC7"> &amp;&amp; </span><span style="color: #6CB6FF">echo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;Still loaded - reboot needed&quot;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">||</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">echo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;Modules removed successfully&quot;</span></span></code></pre></div>



<h3 class="wp-block-heading" id="h-ایمن-سازی-rocky-linux-almalinux-و-centos-stream">ایمن‌سازی Rocky Linux ،AlmaLinux و CentOS Stream</h3>



<p class="wp-block-paragraph">فرایند اعمال راهکار کاهش خطر در سیستم‌های مبتنی بر RHEL از جمله Rocky Linux مسیر کمی متفاوتی دارد؛ زیرا ابزار initramfs در این خانواده متفاوت است.</p>



<h4 class="wp-block-heading" id="h-قدم-اول-تایید-نام-دقیق-ماژول-ها-روی-کرنل"><strong>قدم اول: تایید نام دقیق ماژول‌ها روی کرنل</strong></h4>



<p class="wp-block-paragraph">برخی کرنل‌های خانواده RHEL نام‌های متفاوتی را برای ماژول‌های ESP کامپایل می‌کنند. قبل از نوشتن فایل پیکربندی، آن را بررسی کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>lsmod | grep -E 'esp|xfrm|rxrpc'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">lsmod</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">|</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">grep</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-E</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&#39;esp|xfrm|rxrpc&#39;</span></span></code></pre></div>



<h4 class="wp-block-heading" id="h-قدم-دوم-مسدودسازی-ماژول-ها-و-قرار-دادن-در-لیست-سیاه-0"><strong>قدم دوم: مسدودسازی ماژول‌ها و قرار دادن در لیست سیاه</strong></h4>



<p class="wp-block-paragraph">هر دو دستور <code>install</code> (برای جلوگیری از بارگذاری توسط modprobe) و <code>blacklist</code> (برای جلوگیری از بارگذاری خودکار مبتنی بر alias) باید در یک فایل قرار داده شوند:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>cat &lt;&lt;EOF | sudo tee /etc/modprobe.d/dirty-frag.conf >/dev/null
install esp4 /bin/false
install esp6 /bin/false
install rxrpc /bin/false
blacklist esp4
blacklist esp6
blacklist rxrpc
EOF</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">cat</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&lt;&lt;</span><span style="color: #ADBAC7">EOF</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">|</span><span style="color: #ADBAC7"> sudo tee /etc/modprobe.d/dirty-frag.conf </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7">/dev/null</span></span>
<span class="line"><span style="color: #96D0FF">install esp4 /bin/false</span></span>
<span class="line"><span style="color: #96D0FF">install esp6 /bin/false</span></span>
<span class="line"><span style="color: #96D0FF">install rxrpc /bin/false</span></span>
<span class="line"><span style="color: #96D0FF">blacklist esp4</span></span>
<span class="line"><span style="color: #96D0FF">blacklist esp6</span></span>
<span class="line"><span style="color: #96D0FF">blacklist rxrpc</span></span>
<span class="line"><span style="color: #ADBAC7">EOF</span></span></code></pre></div>



<h4 class="wp-block-heading" id="h-قدم-سوم-بازسازی-initramfs-با-dracut-مرحله-هاردنینگ-عمیق"><strong>قدم سوم: بازسازی initramfs با dracut (مرحله هاردنینگ عمیق)<br></strong></h4>



<p class="wp-block-paragraph">در بیشتر سیستم‌ها این ماژول‌ها پس از بوت بارگذاری می‌شوند، بنابراین اگر برای اجرای مراحل بعدی، عجله دارید، این مرحله اختیاری است، اما همچنان یک اقدام توصیه شده است:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo dracut -f --regenerate-all</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">sudo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">dracut</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-f</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--regenerate-all</span></span></code></pre></div>



<h4 class="wp-block-heading" id="h-قدم-چهارم-unload-کردن-ماژول-ها-در-صورتی-که-در-حال-اجرا-هستند-0"><strong>قدم چهارم: unload کردن ماژول‌ها (در صورتی که در حال اجرا هستند)</strong></h4>



<p class="wp-block-paragraph">از <code>modprobe -r</code> استفاده کنید تا زنجیره وابستگی‌ها را به‌درستی مدیریت کند:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo modprobe -r esp4 esp6 rxrpc 2>/dev/null</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">sudo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">modprobe</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-r</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">esp4</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">esp6</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">rxrpc</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">2&gt;</span><span style="color: #96D0FF">/dev/null</span></span></code></pre></div>



<p class="wp-block-paragraph">در صورتی‌که به هر دلیل قصد ری‌استارت سیستم‌عامل را ندارید، کش‌های کرنل را با دستور زیر پاک کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sync &amp;&amp; echo 3 | sudo tee /proc/sys/vm/drop_caches > /dev/null</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">sync</span><span style="color: #ADBAC7"> &amp;&amp; </span><span style="color: #6CB6FF">echo</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">3</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">|</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">sudo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">tee</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">/proc/sys/vm/drop_caches</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">&gt;</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">/dev/null</span></span></code></pre></div>



<h4 class="wp-block-heading" id="h-قدم-پنجم-بررسی-صحت-اجرای-راهکار-0"><strong>قدم پنجم: بررسی صحت اجرای راهکار</strong></h4>



<p class="wp-block-paragraph">در این مرحله دستور زیر را اجرا کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>grep -qE '^(esp4|esp6|rxrpc) ' /proc/modules &amp;&amp; echo "Still loaded - reboot needed" || echo "Modules removed successfully"</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">grep</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-qE</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&#39;^(esp4|esp6|rxrpc) &#39;</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">/proc/modules</span><span style="color: #ADBAC7"> &amp;&amp; </span><span style="color: #6CB6FF">echo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;Still loaded - reboot needed&quot;</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">||</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">echo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&quot;Modules removed successfully&quot;</span></span></code></pre></div>



<h2 class="wp-block-heading" id="h-باگ-dirty-frag-چه-تاثیری-بر-کانتینرها-و-محیط-های-ابری-دارد">باگ Dirty Frag چه تاثیری بر کانتینرها و محیط‌های ابری دارد؟</h2>



<p class="wp-block-paragraph">اگر از Docker ،Podman یا OpenShift برای اجرای workloadها استفاده می‌کنید، وضعیت ریسک پیچیده‌تر از یک عبارت ساده مثل «ریسک بالاتر» است. جزئیات آن به این شکل است:</p>



<p class="wp-block-paragraph">روی یک کانتینر Docker استاندارد که هاردنینگ آن به درستی انجام شده و هیچ قابلیت ارتقایافته‌ای (elevated capabilities) ندارد، باگ Dirty Frag باعث می‌شود مهاجم به سطح روت داخل Namespace شبکه کانتینر دست پیدا کند. این وضعیت بد است، اما مهاجم همچنان داخل همان محیط ایزوله باقی می‌ماند و به‌صورت خودکار به سیستم میزبان دسترسی پیدا نمی‌کند.</p>



<p class="wp-block-paragraph">خطر واقعی زمانی ایجاد می‌شود که کانتینرها به‌صورت privileged (با فلگ <code>--privileged</code>) اجرا شوند یا دارای قابلیت‌هایی مثل <code>CAP_SYS_ADMIN</code> ،<code>CAP_NET_ADMIN</code> باشند، یا از فضای نام شبکه میزبان (<code>--net=host</code>) استفاده کنند. در چنین محیط‌هایی، ارتقا به روت داخل کانتینر می‌تواند مستقیماً به روت روی سیستم میزبان تبدیل شود. این همان سناریوی واقعی «خروج از کانتینر» (container escape) است و در تعداد زیادی از workloadهای واقعی، از جمله بسیاری از رانرهای CI/CD و sidecarهای service mesh، دیده می‌شود.</p>



<p class="wp-block-paragraph">در همه موارد باید راهکارهای ایمن‌سازی مربوط به ماژول‌های کرنل را روی میزبان اعمال کنید. همچنین کانتینرهای در حال اجرای خود را برای وجود فلگ‌های <code>--privileged</code> و <code>--net=host</code> بررسی و ممیزی کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>docker ps -q | xargs docker inspect --format '{{.Name}} Privileged={{.HostConfig.Privileged}} NetworkMode={{.HostConfig.NetworkMode}}'</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">docker</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">ps</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-q</span><span style="color: #ADBAC7"> </span><span style="color: #F47067">|</span><span style="color: #ADBAC7"> </span><span style="color: #F69D50">xargs</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">docker</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">inspect</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">--format</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">&#39;{{.Name}} Privileged={{.HostConfig.Privileged}} NetworkMode={{.HostConfig.NetworkMode}}&#39;</span></span></code></pre></div>



<h2 class="wp-block-heading" id="h-آیا-selinux-یا-apparmor-کمک-می-کنند">آیا SELinux یا AppArmor کمک می‌کنند؟</h2>



<p class="wp-block-paragraph" id="h-آیا-selinux-یا-apparmor-کمک-می-کنند-هر-دو-مکانیزم-selinux-به-صورت-پیش-فرض-در-rhel-rocky-almalinux-و-apparmor-به-صورت-پیش-فرض-در-ubuntu-لایه-های-کنترل-دسترسی-اضافه-ای-فراهم-می-کنند-که-می-توانند-پس-از-وقوع-یک-exploit-محدوده-کاری-آن-را-محدود-کنند-با-این-حال-هیچ-کدام-به-طور-کامل-جلوی-خود-ارتقای-سطح-دسترسی-در-dirty-frag-را-نمی-گیرند-اگر-یک-کاربر-بتواند-ماژول-های-آسیب-پذیر-را-بارگذاری-کند-یا-با-آن-ها-تعامل-داشته-باشد-حمله-lpe-همچنان-قابل-اجرا-خواهد-بود-بنابراین-راهکار-اصلی-همان-بلاک-کردن-ماژول-های-کرنل-است-که-در-بالا-توضیح-داده-شد-نه-اتکا-صرف-به-چارچوب-های-mac"><br>هر دو مکانیزم SELinux (به‌صورت پیش‌فرض در RHEL،Rocky و AlmaLinux) و AppArmor (به‌صورت پیش‌فرض در Ubuntu) لایه‌های کنترل دسترسی اضافه‌ای فراهم می‌کنند که می‌توانند پس از وقوع یک exploit، محدوده کاری آن را محدود کنند. با این حال، <strong>هیچ‌کدام به‌طور کامل جلوی خودِ ارتقای سطح دسترسی در نقص امنیتی Dirty Frag را نمی‌گیرند</strong>. اگر یک کاربر بتواند ماژول‌های آسیب‌پذیر را بارگذاری کند یا با آن‌ها تعامل داشته باشد، حمله LPE همچنان قابل اجرا خواهد بود. بنابراین راهکار اصلی، همان بلاک کردن ماژول‌های کرنل است که در بالا توضیح داده شد.</p>



<p class="wp-block-paragraph" id="h-آیا-selinux-یا-apparmor-کمک-می-کنند">با این وجود، بهتر است SELinux در حالت enforcing و AppArmor در همه سیستم‌ها فعال باقی بمانند. این ابزارها دفاع لایه‌به‌لایه (defense-in-depth) ایجاد می‌کنند و در صورت وقوع هر exploit دیگر در کنار این آسیب‌پذیری، میزان خسارت را کاهش می‌دهند. انتظار می‌رود کرنل لینوکس 7.0 شامل بهبودهای هاردنینگ باشد که ممکن است سطح حمله این نوع آسیب‌پذیری‌ها را کاهش دهد.</p>



<h2 class="wp-block-heading" id="h-عیب-یابی-اگر-اعمال-راهکار-باعث-مشکل-شد-چه-باید-کرد">عیب‌یابی: اگر اعمال راهکار باعث مشکل شد چه باید کرد؟</h2>



<p class="wp-block-paragraph">همان‌طور که پیش از این اشاره کردیم، اعمال این راهکار ممکن است باعث بروز مشکلاتی شود. در ادامه به این مشکلات و راهکارهای رفع آن اشاره می‌کنیم</p>



<h3 class="wp-block-heading" id="h-از-کار-افتاددن-ipsec-vpn-بعد-از-بلاک-کردن-esp4-و-esp6">از کار افتاددن IPsec / VPN بعد از بلاک کردن esp4 و esp6</h3>



<p class="wp-block-paragraph">این موضوع در صورتی که از VPN مبتنی بر IPsec استفاده می‌کنید، کاملاً قابل انتظار است. ماژول‌های esp4 و esp6 ترافیک ESP را مدیریت می‌کنند. غیرفعال کردن آن‌ها باعث از کار افتادن هر تونلی می‌شود که از IPsec استفاده می‌کند. در این حالت دو انتخاب دارید: یا downtime را بپذیرید و منتظر انتشار کرنل وصله‌شده بمانید، یا بررسی کنید که آیا می‌توان VPN را به‌صورت موقت روی یک پروتکل غیر IPsec مثل WireGuard تغییر داد تا زمان رفع مشکل برسد.</p>



<h3 class="wp-block-heading" id="h-مشکل-در-حال-استفاده-بودن-و-unload-نشدن-ماژول-از-طریق-modprobe-r">مشکل در حال استفاده بودن و unload نشدن ماژول از طریق modprobe -r</h3>



<p class="wp-block-paragraph">این حالت زمانی رخ می‌دهد که یک فرایند فعال در حال استفاده از ماژول باشد. فایل <code>/etc/modprobe.d/dirty-frag.conf</code> (که شامل هر دو دستور install و blacklist است) به همراه بازسازی initramfs باعث می‌شود ماژول‌ها در بوت بعدی بارگذاری نشوند. برای اعمال فوری این محدودیت و در صورتی که امکان ریبوت را دارید، می‌توانید سیستم را ریبوت کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo reboot</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">sudo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">reboot</span></span></code></pre></div>



<h2 class="wp-block-heading" id="h-چگونه-در-آینده-بعد-از-نصب-وصله-کرنل-راهکار-اعمال-شده-را-حذف-کنیم"><strong>چگونه در آینده بعد از نصب وصله کرنل، راهکار اعمال شده را حذف کنیم؟<br></strong></h2>



<p class="wp-block-paragraph"><strong>پس از اینکه توزیع شما یک کرنل وصله‌شده (Patched kernel)</strong> <strong>برای رفع مشکل آسیب‌پذیری Dirty Frag ارائه داد و آن را نصب کردید</strong>، می‌توانید فایل بلاک را حذف کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>sudo rm /etc/modprobe.d/dirty-frag.conf</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">sudo</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">rm</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">/etc/modprobe.d/dirty-frag.conf</span></span></code></pre></div>



<p class="wp-block-paragraph">سپس initramfs را دوباره بسازید.<br>(در اوبنوتو: <code>sudo update-initramfs -u -k all</code> و در راکی‌لینوکس: <code>sudo dracut -f --regenerate-all</code>) و سیستم را ریبوت کنید.</p>



<p class="wp-block-paragraph">در نهایت با دستور زیر بررسی کنید که کرنل وصله‌شده در حال اجرا است:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>uname -r</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">uname</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-r</span></span></code></pre></div>



<h2 class="wp-block-heading" id="h-هم-روش-برای-مقابله-با-آسیب-پذیری-dirty-frag-چه-کاری-انجام-داده-است">هم‌روش برای مقابله با آسیب‌پذیری Dirty Frag چه کاری انجام داده است؟</h2>



<p class="wp-block-paragraph">تیم فنی هم‌روش از ساعات ابتدایی مطرح شدن این آسیب‌پذیری، فرایند ایمن‌سازی و تست اِعمال صحیح را آغاز کرد و تمام زیرساخت‌های هم‌روش در برابر این آسیب‌پذیری (و همچنین آسیب‌پذیری قدیمی‌تر Copy Fail) ایمن شده‌اند.</p>
<p>The post <a href="https://hamravesh.com/blog/dirty-frag-linux-vulnerability-explained/">تشریح آسیب‌پذیری Dirty Frag لینوکس با امکان دسترسی روت؛ آموزش تشخیص و ایمن‌سازی</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/dirty-frag-linux-vulnerability-explained/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>آشنایی با Gateway API در کوبرنتیز؛ بررسی معماری و مقایسه با Ingress</title>
		<link>https://hamravesh.com/blog/what-is-kubernetes-gateway-api/</link>
					<comments>https://hamravesh.com/blog/what-is-kubernetes-gateway-api/#respond</comments>
		
		<dc:creator><![CDATA[علی باقرزاده]]></dc:creator>
		<pubDate>Wed, 13 May 2026 12:30:28 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=3024</guid>

					<description><![CDATA[<p>Gateway API در کوبرنتیز به‌عنوان نسل جدید مدیریت ترافیک شبکه معرفی شد تا محدودیت‌های مدل Ingress را در محیط‌های cloud-native برطرف کند؛ مدلی که سال‌ها برای مدیریت ترافیک در کوبرنتیز استفاده می‌شد. Gateway API در کوبرنتیز فقط یک ارتقاء در قابلیت‌ها نیست، بلکه تغییری در مدل طراحی، تفکیک مسئولیت‌ها و نحوه مدیریت ترافیک در سطح [&#8230;]</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-gateway-api/">آشنایی با Gateway API در کوبرنتیز؛ بررسی معماری و مقایسه با Ingress</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Gateway API در کوبرنتیز به‌عنوان نسل جدید مدیریت ترافیک شبکه معرفی شد تا محدودیت‌های مدل Ingress را در محیط‌های cloud-native برطرف کند؛ مدلی که سال‌ها برای مدیریت ترافیک در کوبرنتیز استفاده می‌شد. Gateway API در کوبرنتیز فقط یک ارتقاء در قابلیت‌ها نیست، بلکه تغییری در مدل طراحی، تفکیک مسئولیت‌ها و نحوه مدیریت ترافیک در سطح کلاستر محسوب می‌شود. در این مطلب بررسی می‌کنیم که Gateway API چیست، چه تفاوتی با Ingress دارد و با چه مزایایی و چالش‌هایی همراه است.</p>



<h2 class="wp-block-heading" id="h-gateway-api-چیست">Gateway API چیست؟</h2>



<p class="wp-block-paragraph" id="h-gateway-api-در-کوبرنتیز-چیست">Gateway API در کوبرنتیز مجموعه‌ای از resourceها و APIهای استاندارد برای مدیریت ترافیک شبکه در کوبرنتیز است. این API با هدف رفع محدودیت‌های Ingress طراحی شد و امکان مدیریت پیشرفته‌تر ترافیک HTTP ،HTTPS ،TCP ،TLS و gRPC را فراهم می‌کند.</p>



<p class="wp-block-paragraph">Gateway API در کوبرنتیز از چند مؤلفه اصلی تشکیل شده است که هرکدام نقش مشخصی در مدیریت ترافیک دارند:</p>



<ul class="wp-block-list">
<li>GatewayClass مشخص می‌کند که کدام کنترلر مسئول پیاده‌سازی Gateway است.</li>



<li>Gateway نقطه ورود ترافیک به کلاستر را تعریف می‌کند.</li>



<li>Routeها مانند HTTPRoute قوانین مسیریابی درخواست‌ها را مشخص می‌کنند.</li>
</ul>



<p class="wp-block-paragraph">یکی از ویژگی‌های اصلی Gateway API در کوبرنتیز مدل نقش‌محور آن است. در این مدل، مسئولیت‌ها بین نقش‌های مختلف مانند تیم زیرساخت، امنیت و توسعه تفکیک می‌شود تا هر تیم بتواند بخش مربوط به خود را مستقل مدیریت کند.</p>



<p class="wp-block-paragraph">در Gateway API کوبرنتیز، Resorceهای مختلف از یکدیگر جدا شده‌اند و هر بخش مسئولیت مشخصی دارد. این ساختار باعث می‌شود مدیریت networking در کوبرنتیز انعطاف‌پذیرتر و قابل کنترل‌تر باشد.</p>



<p class="wp-block-paragraph" id="h-gateway-api-در-کوبرنتیز-چیست">امروزه پروژه‌هایی مانند Envoy Gateway ،Istio ،Kong و NGINX Gateway Fabric از Gateway API پشتیبانی می‌کنند و این API به یکی از بخش‌های مهم اکوسیستم networking در کوبرنتیز تبدیل شده است.<br></p>



<h2 class="wp-block-heading">چرا Ingress دیگر کافی نیست؟</h2>



<p class="wp-block-paragraph">Ingress سال‌ها روش استاندارد مدیریت ترافیک HTTP و HTTPS در کوبرنتیز بود، اما با پیچیده‌تر شدن معماری‌های <a href="https://hamravesh.com/blog/what-is-cloud-native/" type="link" id="https://hamravesh.com/blog/what-is-cloud-native/">cloud-native</a> دیگر پاسخگوی نیازهای جدید نبود.</p>



<p class="wp-block-paragraph">Ingress در ابتدا برای سناریوهای ساده routing طراحی شده بود و بسیاری از قابلیت‌های پیشرفته networking را به‌صورت استاندارد ارائه نمی‌داد. به همین دلیل، Ingress Controllerها برای افزودن قابلیت‌های بیشتر به annotationهای اختصاصی وابسته شدند. annotationها نوعی متادیتا هستند که به منابع کوبرنتیز اضافه می‌شوند تا تنظیمات یا رفتارهای اضافی را برای کنترلرها تعریف کنند.</p>



<p class="wp-block-paragraph">یکی دیگر از محدودیت‌های Ingress، مدل مدیریت و مالکیت آن بود. در بسیاری از سازمان‌ها، تیم‌های مختلف مسئول بخش‌های متفاوت شبکه هستند، اما Ingress جداسازی مشخصی برای این مسئولیت‌ها ارائه نمی‌کرد و مدیریت سطح دسترسی‌ها در محیط‌هایی که چند تیم روی یک کلاستر کار می‌کردند دشوارتر می‌شد.</p>



<p class="wp-block-paragraph">مجموعه این محدودیت‌ها باعث شد Ingress به‌مرور برای بسیاری از سناریوهای جدید cloud-native کافی نباشد؛ مخصوصاً در معماری‌های بزرگ، محیط‌های چندتیمی و زیرساخت‌هایی که به مدیریت پیشرفته‌تر ترافیک نیاز داشتند. به همین دلیل جامعه توسعه‌دهندگان کوبرنتیز به‌سمت طراحی API جدیدی حرکت کرد که بتواند مدیریت ترافیک شبکه را انعطاف‌پذیرتر، استانداردتر و قابل گسترش‌تر کند. نتیجه این تلاش، Gateway API بود.</p>



<h2 class="wp-block-heading" id="h-تفاوت-ingress-و-gateway-api">تفاوت Ingress و Gateway API</h2>



<p class="wp-block-paragraph">تفاوت اصلی Ingress و Gateway API در کوبرنتیز در مدل طراحی و سطح انتزاع (abstraction level) آن‌ها است. Ingress یک API ساده و متمرکز برای مدیریت ترافیک HTTP/HTTPS است، در حالی که Gateway API یک مدل نقش‌محور و چندلایه برای مدیریت پیشرفته‌تر ترافیک در کوبرنتیز ارائه می‌دهد.</p>



<p class="wp-block-paragraph">در Ingress، تمام منطق مسیریابی در یک resource واحد تعریف می‌شود که باعث سادگی، اما محدودیت در سناریوهای پیچیده می‌شود. در مقابل، Gateway API این مسئولیت‌ها را بین چند resource مستقل تقسیم می‌کند تا مدیریت شبکه قابل توسعه‌تر و منعطف‌تر شود.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="638" src="https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api2-1024x638.webp" alt="مقایسه Ingress با Gateway API در کوبرنتیز" class="wp-image-5109" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api2-1024x638.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api2-300x187.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api2-768x478.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api2-120x75.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api2.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">از نظر مدل مدیریت، تفاوت مهم دیگر در نحوه تقسیم مسئولیت‌ها بین تیم‌ها است. در Ingress معمولاً یک تیم باید هم زیرساخت و هم قوانین routing را مدیریت کند. اما در Gateway API این مسئولیت‌ها قابل تفکیک هستند و هر تیم می‌تواند بخش مشخصی از شبکه را مدیریت کند.</p>



<p class="wp-block-paragraph">از نظر قابلیت‌ها نیز تفاوت قابل توجهی وجود دارد. Ingress عمدتاً برای HTTP و HTTPS طراحی شده است، در حالی که Gateway API از پروتکل‌های بیشتری از جمله موارد زیر پشتیبانی می‌کند:</p>



<ul class="wp-block-list">
<li>HTTP و HTTPS</li>



<li>TCP</li>



<li>TLS</li>



<li>gRPC</li>
</ul>



<p class="wp-block-paragraph">همچنین Gateway API در کوبرنتیز امکان تعریف قابلیت‌های پیشرفته‌تری را به‌صورت استاندارد و قابل توسعه فراهم می‌کند؛ از جمله مسیریابی مبتنی بر هدر، تقسیم ترافیک بین سرویس‌ها و مسیریابی بین چند <a href="https://hamravesh.com/blog/what-is-kubernetes-namespace/" type="link" id="https://hamravesh.com/blog/what-is-kubernetes-namespace/">فضای نام کوبرنتیز</a> مختلف (Namespaceها). در حالی که در Ingress این نوع قابلیت‌ها معمولاً وابسته به پیاده‌سازی هر <a href="https://hamravesh.com/blog/what-is-kubernetes-controller">کنترلر کوبرنتیز</a> هستند و استاندارد واحدی برای آن‌ها وجود ندارد.</p>



<p class="wp-block-paragraph">در نتیجه، تفاوت اصلی این دو مدل در این است که Ingress یک راهکار ساده و محدود برای سناریوهای پایه است، در حالی که Gateway API یک چارچوب استاندارد و قابل توسعه برای مدیریت پیچیده‌تر ترافیک در کوبرنتیز محسوب می‌شود.</p>



<h2 class="wp-block-heading" id="h-معماری-و-اجزای-اصلی-gateway-api">معماری و اجزای اصلی Gateway API</h2>



<p class="wp-block-paragraph" id="h-معماری-و-اجزای-اصلی-gateway-api-در-کوبرنتیز">Gateway API در کوبرنتیز بر پایه یک مدل معماری نقش‌محور طراحی شده است که در آن مسئولیت مدیریت ترافیک بین چند resource مستقل تقسیم می‌شود. این طراحی برای کاهش پیچیدگی Ingress و ایجاد ساختاری قابل توسعه در سناریوهای پیشرفته شبکه شکل گرفته است.</p>



<p class="wp-block-paragraph" id="h-معماری-و-اجزای-اصلی-gateway-api-در-کوبرنتیز">در این معماری، به‌جای اینکه تمام منطق routing و پیکربندی شبکه در یک resource واحد متمرکز شود، اجزای مختلفی تعریف شده‌اند که هرکدام نقش مشخصی دارند و در کنار هم سیستم مدیریت ترافیک را تشکیل می‌دهند. در معماری Gateway API، سه مؤلفه اصلی نقش کلیدی دارند.</p>



<p class="wp-block-paragraph"><strong>GatewayClass</strong></p>



<p class="wp-block-paragraph">GatewayClass مشخص می‌کند که کدام کنترلر مسئول پیاده‌سازی و مدیریت Gatewayها در کلاستر است. این بخش در واقع نقش template یا کلاس رفتاری برای Gatewayها را دارد و تعیین می‌کند که کل سیستم از چه نوع پیاده‌سازی networking استفاده کند.</p>



<p class="wp-block-paragraph"><strong>Gateway</strong></p>



<p class="wp-block-paragraph">Gateway نقطه ورود ترافیک به کلاستر است. این resource مشخص می‌کند که ترافیک از چه مسیرهایی وارد می‌شود و چه listenerهایی برای دریافت درخواست‌ها فعال هستند. به عبارت دیگر Gateway نقطه اتصال بین دنیای بیرونی و سرویس‌های داخل کوبرنتیز است.</p>



<p class="wp-block-paragraph"><strong>Routeها</strong></p>



<p class="wp-block-paragraph">Routeها مسئول تعریف قوانین مسیریابی در Gateway API هستند. این resourceها مشخص می‌کنند درخواست‌ها بر اساس چه معیارهایی به سرویس‌های داخلی هدایت شوند. این معیارها می‌توانند شامل مسیر URL، هدرها یا سایر ویژگی‌های درخواست باشند.</p>



<p class="wp-block-paragraph">HTTPRoute یکی از مهم‌ترین انواع Route است که امکان مسیریابی بر اساس ویژگی‌های HTTP مانند مسیر درخواست، هدرها و سایر مشخصه‌ها را فراهم می‌کند. علاوه بر آن، Routeهای دیگری نیز برای پروتکل‌هایی مانند TCP ،TLS و gRPC وجود دارند.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="755" src="https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api03-1024x755.webp" alt="معماری نقش محور GatewayAPI در کوبرنتیز" class="wp-image-5152" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api03-1024x755.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api03-300x221.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api03-768x566.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api03-120x88.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/05/Hamravesh-what-is-kubernetes-gateway-api03.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">این تصویر معماری مبتنی بر نقش (Role-Oriented Architecture) در Gateway API را نشان می‌دهد. برخلاف Ingress که تمام تنظیمات شبکه و مسیریابی را در یک Resource متمرکز می‌کرد، Gateway API مسئولیت‌ها را بین نقش‌های مختلف مانند تیم زیرساخت، ادمین کلاستر و توسعه‌دهندگان اپلیکیشن تفکیک می‌کند. در این مدل، هر بخش فقط لایه مربوط به خود را مدیریت می‌کند؛ از تعریف نوع Gateway گرفته تا تنظیم قوانین مسیریابی ترافیک.</figcaption></figure>



<p class="wp-block-paragraph">یکی از نکات مهم در معماری Gateway API در کوبرنتیز این است که این سه بخش به‌صورت مستقل از هم طراحی شده‌اند. این جداسازی باعث می‌شود مدیریت شبکه در کوبرنتیز انعطاف‌پذیرتر شود و امکان تقسیم مسئولیت بین تیم‌های مختلف فراهم شود. در این مدل، تیم زیرساخت معمولاً GatewayClass و Gateway را مدیریت می‌کند، در حالی که تیم‌های توسعه می‌توانند Routeهای مربوط به سرویس‌های خود را به‌صورت مستقل تعریف و کنترل کنند.</p>



<h2 class="wp-block-heading" id="h-یک-مثال-ساده">یک مثال ساده</h2>



<p class="wp-block-paragraph" id="h-یک-مثال-ساده-از-کار-با-gateway-api-در-کوبرنتیز">مثال زیر یک Gateway ساده را نشان می‌دهد که ترافیک HTTP را روی پورت ۸۰ دریافت می‌کند:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">YAML</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  name: example-gateway
spec:
  gatewayClassName: example-gateway-class
  listeners:
    - name: http
      protocol: HTTP
      port: 80</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #8DDB8C">apiVersion</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">gateway.networking.k8s.io/v1</span></span>
<span class="line"><span style="color: #8DDB8C">kind</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Gateway</span></span>
<span class="line"><span style="color: #8DDB8C">metadata</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">example-gateway</span></span>
<span class="line"><span style="color: #8DDB8C">spec</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">gatewayClassName</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">example-gateway-class</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">listeners</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">    - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">http</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #8DDB8C">protocol</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">HTTP</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #8DDB8C">port</span><span style="color: #ADBAC7">: </span><span style="color: #6CB6FF">80</span></span></code></pre></div>



<p class="wp-block-paragraph" id="h-یک-مثال-ساده-از-کار-با-gateway-api-در-کوبرنتیز">در این تعریف:</p>



<ul class="wp-block-list">
<li>Gateway به یک GatewayClass متصل است که تعیین می‌کند کدام کنترلر آن را مدیریت کند</li>



<li>یک نقطه ورود ترافیک روی پورت ۸۰ ایجاد شده است</li>



<li>پروتکل HTTP برای دریافت درخواست‌ها مشخص شده است</li>
</ul>



<p class="wp-block-paragraph">در مثال زیر برای تشریح HTTPRoute (تعریف قوانین مسیریابی)، مشخص شده که درخواست‌ها باید به کدام سرویس داخلی ارسال شوند:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">YAML</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: example-route
spec:
  parentRefs:
    - name: example-gateway
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /
      backendRefs:
        - name: example-service
          port: 8080</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #8DDB8C">apiVersion</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">gateway.networking.k8s.io/v1</span></span>
<span class="line"><span style="color: #8DDB8C">kind</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">HTTPRoute</span></span>
<span class="line"><span style="color: #8DDB8C">metadata</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">example-route</span></span>
<span class="line"><span style="color: #8DDB8C">spec</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">parentRefs</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">    - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">example-gateway</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">rules</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">    - </span><span style="color: #8DDB8C">matches</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">        - </span><span style="color: #8DDB8C">path</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">            </span><span style="color: #8DDB8C">type</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">PathPrefix</span></span>
<span class="line"><span style="color: #ADBAC7">            </span><span style="color: #8DDB8C">value</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">/</span></span>
<span class="line"><span style="color: #ADBAC7">      </span><span style="color: #8DDB8C">backendRefs</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">        - </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">example-service</span></span>
<span class="line"><span style="color: #ADBAC7">          </span><span style="color: #8DDB8C">port</span><span style="color: #ADBAC7">: </span><span style="color: #6CB6FF">8080</span></span></code></pre></div>



<p class="wp-block-paragraph">در اینجا:</p>



<ul class="wp-block-list">
<li>این Route به Gateway قبلی متصل شده است</li>



<li>تمام درخواست‌های شروع شده با مسیر <code>/</code> تطبیق داده می‌شوند.</li>



<li>ترافیک به سرویس <code>example-service</code> روی پورت ۸۰۸۰ هدایت می‌شود</li>
</ul>



<h2 class="wp-block-heading" id="h-مزایای-gateway-api">مزایای Gateway API</h2>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز">Gateway API در کوبرنتیز در سناریوهای واقعی چند مزیت کلیدی نسبت به مدل Ingress دارد:</p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز"><strong>تفکیک مسئولیت‌ها در معماری شبکه</strong></p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز">در Gateway API، وظایف مربوط به زیرساخت، نقطه ورود ترافیک و قوانین مسیریابی از هم جدا شده‌اند و هر بخش می‌تواند به‌صورت مستقل مدیریت شود.</p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز"><strong>کاهش وابستگی به annotationهای اختصاصی</strong></p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز">بسیاری از قابلیت‌هایی که در Ingress وابسته به پیاده‌سازی کنترلر بودند، در Gateway API به‌صورت استاندارد و قابل پیش‌بینی تعریف می‌شوند.</p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز"><strong>مقیاس‌پذیری بهتر در معماری‌های بزرگ</strong><br>در محیط‌های مبتنی بر مایکروسرویس، مدیریت تعداد زیاد مسیرها و سرویس‌ها ساده‌تر می‌شود و پیچیدگی پیکربندی‌ها کاهش پیدا می‌کند.</p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز"><strong>یکپارچگی بیشتر بین پیاده‌سازی‌های مختلف</strong><br>رفتار سیستم در کنترلرهای مختلف قابل پیش‌بینی‌تر است و وابستگی به هر پیاده‌سازی خاص کاهش پیدا می‌کند.</p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز"><strong>پشتیبانی گسترده‌تر از پروتکل‌ها</strong><br>Gateway API در کوبرنتیز علاوه بر HTTP و HTTPS، از پروتکل‌هایی مانند TCP ،TLS و gRPC به‌صورت استاندارد پشتیبانی می‌کند.</p>



<div class="wp-block-dh-blog-card-database-block card database">
<div class="wp-block-group row align-items-center"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-group col-md"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<h3 class="wp-block-heading has-medium-font-size" id="h-کوبرنتیز-مدیریت-شده-هم-روش-راهی-مطمئن-برای-رشد-بی-وقفه">💡 کوبرنتیز مدیریت‌شده هم‌روش، راهی مطمئن برای رشد بی‌وقفه</h3>



<p class="wp-block-paragraph">راهکار کوبرنتیز مدیریت شده هم‌روش، بر بستر ابر اختصاصی یا به صورت On-premises</p>



<p class="wp-block-paragraph"><br>✅ کاهش هزینه‌های عملیاتی<br>✅ احراز هویت یکپارچه با اتصال به SSO سازمانی<br>✅ قابل استقرار روی سرورهای on-premises</p>



<p class="wp-block-paragraph"></p>
</div></div>



<div class="wp-block-group col-md-auto"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow">
<p class="btn btn--main btn--wide wp-block-paragraph"><a href="#">کوبرنتیز مدیریت شده</a></p>
</div></div>
</div></div>
</div>



<h2 class="wp-block-heading" id="h-چالش-ها-و-محدودیت-های-gateway-api">چالش‌ها و محدودیت‌های Gateway API</h2>



<p class="wp-block-paragraph">با وجود مزایای معماری Gateway API، این مدل هنوز بدون چالش نیست و در بسیاری از سناریوهای عملی محدودیت‌هایی دارد:</p>



<p class="wp-block-paragraph"><strong>ناهمگونی در پیاده‌سازی کنترلرها</strong><br>همه کنترلرها هنوز سطح یکسانی از پشتیبانی از Gateway API ندارند و برخی قابلیت‌ها ممکن است در همه پیاده‌سازی‌ها در دسترس نباشند.</p>



<p class="wp-block-paragraph"><strong>پیچیدگی بیشتر نسبت به Ingress</strong><br>مدل Gateway API در کوبرنتیز به‌جای یک resource واحد، از چند resource جدا استفاده می‌کند. این موضوع اگرچه از نظر معماری مزیت است، اما در عمل باعث افزایش پیچیدگی مفهومی و یادگیری می‌شود.</p>



<p class="wp-block-paragraph"><strong>پیچیدگی مهاجرت از Ingress</strong><br>بسیاری از تنظیمات Ingress به‌خصوص مواردی که با annotationهای اختصاصی تعریف شده‌اند، معادل مستقیم در Gateway API ندارند و باید مجدد طراحی شوند.</p>



<p class="wp-block-paragraph"><strong>بلوغ ناقص در برخی سناریوها</strong><br>با وجود استاندارد بودن API، هنوز برخی ویژگی‌ها در سطح اکوسیستم به‌صورت کامل و یکپارچه در همه پروژه‌ها پیاده‌سازی نشده‌اند.</p>



<p class="wp-block-paragraph"><strong>هم‌زیستی با Ingress در بسیاری از محیط‌ها</strong><br>در عمل، بسیاری از سازمان‌ها هنوز به‌طور کامل به Gateway API مهاجرت نکرده‌اند و استفاده هم‌زمان از Ingress و Gateway API در یک کلاستر رایج است.</p>



<h2 class="wp-block-heading" id="h-مهاجرت-از-ingress-به-gateway-api-در-کوبرنتیز">مهاجرت از Ingress به Gateway API در کوبرنتیز</h2>



<p class="wp-block-paragraph">مهاجرت از Ingress به Gateway API یک تغییر تدریجی در معماری شبکه است، نه یک جایگزینی ساده. چون این دو مدل ساختار متفاوتی دارند، مهاجرت معمولاً نیازمند بازطراحی بخشی از منابع شبکه در کلاستر است.</p>



<p class="wp-block-paragraph">در مدل Ingress، تمام تنظیمات routing در یک resource واحد تعریف می‌شود. اما در Gateway API این مسئولیت بین چند resource جدا مانند GatewayClass ،Gateway و Routeها تقسیم شده است. به همین دلیل، اولین گام در مهاجرت، درک و بازنویسی این تفکیک مسئولیت‌ها است.</p>



<p class="wp-block-paragraph">در فرایند مهاجرت، معمولاً ابتدا یک Gateway جدید در کنار Ingressهای موجود ایجاد می‌شود. این Gateway به یک کنترلر سازگار متصل می‌شود و به‌صورت تدریجی بخشی از ترافیک را از Ingress به سمت Routeهای جدید هدایت می‌کند.</p>



<p class="wp-block-paragraph">در این مرحله، یکی از چالش‌های اصلی، بازنویسی تنظیمات Ingress است. بسیاری از قابلیت‌هایی که قبلاً از طریق annotationها تعریف می‌شدند، باید در قالب resourceهای استاندارد Gateway API بازتعریف شوند. این موضوع نیازمند بررسی دقیق رفتار Ingressهای موجود و تبدیل آن‌ها به معادل‌های Gateway API است.</p>



<p class="wp-block-paragraph">همچنین در مهاجرت باید توجه شود که همه قابلیت‌های Ingress ممکن است معادل مستقیم در Gateway API نداشته باشند یا پیاده‌سازی آن‌ها وابسته به کنترلر انتخاب‌شده باشد. بنابراین انتخاب کنترلر سازگار با نیازهای پروژه نقش مهمی در موفقیت مهاجرت دارد.</p>



<p class="wp-block-paragraph" id="h-مزایای-gateway-api-در-کوبرنتیز">در نهایت، مهاجرت معمولاً به‌صورت مرحله‌ای انجام می‌شود؛ به‌طوری که Ingress و Gateway API برای مدتی در کنار هم در کلاستر وجود دارند تا انتقال ترافیک بدون اختلال انجام شود.</p>



<h2 class="wp-block-heading" id="h-سخن-پایانی">سخن پایانی</h2>



<p class="wp-block-paragraph">Gateway API یک مسیر جدید در تکامل networking در کوبرنتیز است که برای رفع محدودیت‌های مدل Ingress طراحی شده است. Ingress همچنان در بسیاری از محیط‌ها استفاده می‌شود، اما برای نیازهای جدید و سناریوهای پیچیده‌تر، تمرکز اصلی توسعه در اکوسیستم کوبرنتیز به سمت Gateway API حرکت کرده است. در نتیجه، Gateway API در کوبرنتیز بیشتر به‌عنوان مسیر پیشنهادی آینده برای طراحی شبکه در کوبرنتیز دیده می‌شود، در حالی که Ingress هنوز در بسیاری از سیستم‌های موجود نقش کاربردی خود را حفظ کرده است.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-gateway-api/">آشنایی با Gateway API در کوبرنتیز؛ بررسی معماری و مقایسه با Ingress</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-kubernetes-gateway-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>آشنایی با مفهوم Namespace در کوبرنتیز؛ آموزش نحوه ساخت</title>
		<link>https://hamravesh.com/blog/what-is-kubernetes-namespace/</link>
					<comments>https://hamravesh.com/blog/what-is-kubernetes-namespace/#respond</comments>
		
		<dc:creator><![CDATA[علی باقرزاده]]></dc:creator>
		<pubDate>Wed, 06 May 2026 12:30:07 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=1796</guid>

					<description><![CDATA[<p>فضای نام یا Namespace یکی از کلیدی‌ترین امکانات در دنیای کوبرنتیز است که به مدیریت بهتر پروژه و ایجاد فضاهای ایزوله از همدیگر کمک می‌کند</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-namespace/">آشنایی با مفهوم Namespace در کوبرنتیز؛ آموزش نحوه ساخت</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Namespace در کوبرنتیز یکی از اجزای پایه‌ای در معماری کلاستر است که برای مدیریت بهتر منابع در محیط‌های چندتیمی و چندپروژه‌ای استفاده می‌شود. این قابلیت امکان ایجاد محدوده‌های منطقی برای منابع را فراهم می‌کند تا بتوان سرویس‌ها، محیط‌ها و اپلیکیشن‌های مختلف را در یک کلاستر مشترک اما به‌صورت جداگانه مدیریت کرد. در این مقاله، مفهوم Namespace، ساختار آن، فضاهای نام پیش‌فرض، نحوه استفاده و اشتباهات رایج در پیاده‌سازی آن را بررسی می‌کنیم.</p>



<h2 class="wp-block-heading" id="h-namespace-در-کوبرنتیز-چیست">Namespace در کوبرنتیز چیست؟</h2>



<p class="wp-block-paragraph">Namespace در کوبرنتیز یک مکانیزم برای تقسیم‌بندی منطقی منابع داخل یک کلاستر است که برای کاهش پیچیدگی مدیریت منابع در محیط‌های چندکاربره و چندپروژه‌ای طراحی شده است. این قابلیت اجازه می‌دهد منابعی مانند Pod ،Service و Deployment در محدوده‌های جداگانه سازمان‌دهی شوند، بدون اینکه نیاز به ایجاد چند کلاستر مستقل باشد.</p>



<p class="wp-block-paragraph">در یک کلاستر کوبرنتیز، زمانی که چند تیم، پروژه یا محیط (مانند dev ،staging و production) به‌صورت همزمان کار می‌کنند، قرار گرفتن همه منابع در یک فضای مشترک می‌تواند باعث پیچیدگی در مدیریت، افزایش احتمال خطا در دسترسی‌ها و دشواری در تفکیک منابع شود. Namespace این مشکل را با ایجاد محدوده‌های منطقی برای منابع حل می‌کند.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="818" src="https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-namespace-02-1024x818.webp" alt="Namespace در کوبرنتیز" class="wp-image-5054" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-namespace-02-1024x818.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-namespace-02-300x240.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-namespace-02-768x613.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-namespace-02-120x96.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/05/hamravesh-what-is-kubernetes-namespace-02.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">با استفاده از Namespace، هر مجموعه از منابع می‌تواند در یک محدوده مستقل قرار گیرد و مدیریت آن‌ها به‌صورت جداگانه انجام شود. این ساختار امکان اعمال سیاست‌های دسترسی و کنترل مصرف منابع را در سطح هر محدوده فراهم می‌کند.</p>



<p class="wp-block-paragraph">نکته مهم این است که Namespaceها یک مرز فیزیکی یا امنیتی در سطح زیرساخت ایجاد نمی‌کنند، بلکه تنها یک جداسازی منطقی در سطح API هستند و منابع همچنان روی یک کلاستر و زیرساخت مشترک اجرا می‌شوند.</p>



<h2 class="wp-block-heading" id="h-namespaceهای-پیش-فرض-در-کوبرنتیز">Namespaceهای پیش‌فرض در کوبرنتیز</h2>



<p class="wp-block-paragraph" id="h-namespaceهای-پیش-فرض-در-کوبرنتیز-در-کوبرنتیز-هنگام-ایجاد-یک-کلاستر-چند-namespace-به-صورت-پیش-فرض-ساخته-می-شوند-که-هر-کدام-نقش-مشخصی-در-ساختار-و-عملکرد-کلاستر-دارند">در کوبرنتیز، هنگام ایجاد یک کلاستر، چند Namespace به‌صورت پیش‌فرض ساخته می‌شوند که هر کدام نقش مشخصی در ساختار و عملکرد کلاستر دارند.</p>



<p class="wp-block-paragraph" id="h-default-این-namespace-اگر-هنگام-ایجاد-منابع-namespace-مشخصی-تعیین-نشده-باشد-منابع-به-صورت-خودکار-در-این-فضا-قرار-می-گیرند"><strong>default:</strong> اگر هنگام ایجاد منابع، Namespace مشخصی تعیین نشده باشد. منابع به‌صورت خودکار در این فضا قرار می‌گیرند.</p>



<p class="wp-block-paragraph" id="h-kube-system-این-namespace-شامل-منابع-و-اجزای-داخلی-کوبرنتیز-است-کامپوننت-هایی-که-برای-عملکرد-کلاستر-ضروری-هستند-مانند-برخی-سرویس-های-سیستمی-از-جمله-kube-dns-kube-proxy-و-در-این-بخش-قرار-دارند"><strong>kube-system</strong>: شامل منابع و اجزای داخلی کوبرنتیز است. کامپوننت‌هایی که برای عملکرد کلاستر ضروری هستند (مانند برخی سرویس‌های سیستمی از جمله kube-dns ،kube-proxy و &#8230;)، در این بخش قرار دارند.</p>



<p class="wp-block-paragraph" id="h-kube-public-namespace-با-نام-kube-public-به-گونه-ای-تنظیم-شده-است-که-به-صورت-عمومی-قابل-خواندن-باشد-این-فضا-برای-منابعی-استفاده-می-شود-که-نیاز-به-دسترسی-عمومی-دارند"><strong>kube-public</strong>: به‌گونه‌ای تنظیم شده است که به‌صورت عمومی قابل خواندن باشد. این فضا برای منابعی استفاده می‌شود که نیاز به دسترسی عمومی دارند.</p>



<p class="wp-block-paragraph" id="h-kube-node-lease-namespace-با-نام-kube-node-lease-برای-نگهداری-آبجکت-های-مربوط-به-lease-نودها-استفاده-می-شود-و-به-مدیریت-وضعیت-نودها-در-کلاستر-کمک-می-کند"><strong>kube-node-lease</strong>: این فضای نام کوبرنتیز به مدیریت وضعیت نودها در کلاستر کمک می‌کند و کوبرنتیز به کمک آن می‌تواند بدون ایجاد بار بیش از حد روی سیستم، از زنده‌بودن نودها مطمئن شود.</p>



<h2 class="wp-block-heading" id="h-namespace-و-rbac-در-کوبرنتیز">Namespace و RBAC در کوبرنتیز</h2>



<p class="wp-block-paragraph">در کوبرنتیز، کنترل دسترسی به منابع از طریق مکانیزم <strong>RBAC (مخفف <strong>Role-Based Access Control</strong>)</strong> انجام می‌شود. این سیستم امکان تعریف سطح دسترسی کاربران و سرویس‌ها را فراهم می‌کند.</p>



<p class="wp-block-paragraph">در RBAC، دو مفهوم اصلی وجود دارد:</p>



<ul class="wp-block-list">
<li><strong>Role</strong>: مجموعه‌ای از مجوزها را تعریف می‌کند. Roleها در کوبرنتیز معمولاً به یک Namespace خاص محدود هستند. این یعنی یک Role فقط روی منابع داخل همان Namespace اعمال می‌شود و به سایر Namespaceها گسترش پیدا نمی‌کند.</li>



<li><strong>RoleBinding</strong>: مجوزهای تعریف شده تحت Role را به یک کاربر، گروه یا سرویس‌اکانت نسبت می‌دهد. RoleBinding نیز می‌تواند یک Role را به موجودیت‌های مختلف در همان Namespace متصل کند. </li>
</ul>



<p class="wp-block-paragraph">برای اعمال دسترسی در سطح کل کلاستر، از ClusterRole و ClusterRoleBinding استفاده می‌شود که خارج از محدوده Namespace عمل می‌کنند.</p>



<p class="wp-block-paragraph">به این ترتیب، Namespace نقش مهمی در محدود کردن دامنه دسترسی‌ها در ساختار RBAC دارد و امکان جداسازی سطح دسترسی بین تیم‌ها و پروژه‌ها را فراهم می‌کند.</p>



<h2 class="wp-block-heading" id="h-namespace-و-مدیریت-منابع-resourcequota-و-limitrange">Namespace و مدیریت منابع (ResourceQuota و LimitRange)</h2>



<p class="wp-block-paragraph">در کوبرنتیز، Namespace فقط برای سازمان‌دهی منابع استفاده نمی‌شود، بلکه می‌تواند برای اعمال محدودیت مصرف منابع نیز کاربرد داشته باشد. </p>



<p class="wp-block-paragraph">با استفاده از مکانیزم <strong>ResourceQuota</strong> می‌توان میزان کل منابع قابل استفاده در یک Namespace را محدود کرد. این محدودیت می‌تواند شامل CPU، حافظه، تعداد پادها و سایر منابع قابل شمارش باشد. این مکانیزم باعث می‌شود مصرف منابع در یک Namespace از حد مشخصی فراتر نرود.</p>



<p class="wp-block-paragraph">در کنار آن، <strong>LimitRange</strong> برای تعریف محدودیت‌های پیش‌فرض یا حداقل و حداکثر مصرف منابع برای هر کانتینر در یک Namespace استفاده می‌شود. این امکان موجب می‌شود که هر پاد یا کانتینر، بدون نیاز به تعریف دستی در هر بار ایجاد، دارای محدودیت‌های مشخصی باشد.</p>



<p class="wp-block-paragraph">این دو مکانیزم در کنار Namespace باعث می‌شوند که مدیریت مصرف منابع در سطح هر Namespace به‌صورت مستقل انجام شود و بتوان برای هر تیم یا پروژه سقف مصرف مشخصی تعریف کرد.</p>



<h2 class="wp-block-heading" id="h-نحوه-ارتباط-بین-namespaceها">نحوه ارتباط بین Namespaceها</h2>



<p class="wp-block-paragraph">در کوبرنتیز، Namespaceها در سطح نام‌گذاری و سازمان‌دهی منابع از هم جدا هستند، اما این جداسازی به‌تنهایی به معنای جداسازی شبکه‌ای نیست.</p>



<p class="wp-block-paragraph">در حالت پیش‌فرض، پادها می‌توانند با استفاده از آدرس‌های شبکه‌ای با یکدیگر ارتباط برقرار کنند؛ حتی اگر در Namespaceهای متفاوت قرار داشته باشند. این ارتباط محدود به Namespace نیست و در صورت عدم وجود محدودیت‌های شبکه‌ای، بین Namespaceها نیز برقرار است. برای مدیریت ارتباط بین پادها در سطح شبکه، از Network Policy استفاده می‌شود. این مکانیزم امکان تعریف قوانین مشخص برای اجازه دادن یا مسدود کردن ترافیک بین پادها را فراهم می‌کند و می‌تواند ارتباط بین Namespaceها را محدود کند.</p>



<p class="wp-block-paragraph">در زمینه DNS، کوبرنتیز برای سرویس‌ها در هر Namespace یک نام دامنه داخلی ایجاد می‌کند. ساختار نام‌گذاری سرویس‌ها به‌گونه‌ای است که شامل نام سرویس و Namespace آن می‌شود و از طریق DNS داخلی کلاستر قابل دسترسی است.</p>



<p class="wp-block-paragraph">به این ترتیب، ارتباط بین Namespaceها هم از طریق شبکه و هم از طریق DNS امکان‌پذیر است، مگر اینکه به‌صورت مشخص با سیاست‌های شبکه محدود شده باشد.</p>



<h2 class="wp-block-heading" id="h-چگونه-در-کوبرنتیز-namespace-جدید-ایجاد-کنیم">چگونه در کوبرنتیز Namespace جدید ایجاد کنیم؟</h2>



<p class="wp-block-paragraph">اگر با مفاهیمی مانند <a href="https://hamravesh.com/blog/what-is-kubernetes-pod/" target="_blank" rel="noreferrer noopener">پاد کوبرنتیز</a> و <a href="https://hamravesh.com/blog/what-is-kubernetes-deployment/" type="link" id="https://hamravesh.com/blog/what-is-kubernetes-deployment/" target="_blank" rel="noreferrer noopener">دیپلویمنت در کوبرنتیز</a> آشنایی داشته باشید، فرایند ساخت یک فضای نام برای‌تان ساده و واضح خواهد بود. برای تعریف Namespace می‌توانید به دو روش اقدام کنید:</p>



<h3 class="wp-block-heading" id="h-روش-اول-ایجاد-namespace-از-طریق-فایل-yaml">روش اول: ایجاد Namespace از طریق فایل YAML</h3>



<p class="wp-block-paragraph">در مرحله اول نیاز است که یک فایل YAML ایجاد کنید. نام آن را <code>my-namespace.yaml</code> قرار داده و اطلاعات زیر را در آن قرار دهید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">YAML</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>apiVersion: v1
kind: Namespace
metadata:
  name: namespace1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #8DDB8C">apiVersion</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">v1</span></span>
<span class="line"><span style="color: #8DDB8C">kind</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">Namespace</span></span>
<span class="line"><span style="color: #8DDB8C">metadata</span><span style="color: #ADBAC7">:</span></span>
<span class="line"><span style="color: #ADBAC7">  </span><span style="color: #8DDB8C">name</span><span style="color: #ADBAC7">: </span><span style="color: #96D0FF">namespace1</span></span></code></pre></div>



<p class="wp-block-paragraph">یکی از بخش‌های مهم فایل مقدار kind است که آن را Namespace قرار داده‌ایم. </p>



<p class="wp-block-paragraph">همچنین نام Namespace جدید را namespace1 قرار داده‌ایم. برای نام‌گذاری مطمئن شوید که در کلاستر مورد نظر، قبلا فضای نام دیگری را با این عنوان ندارید.</p>



<p class="wp-block-paragraph">در قدم بعدی با استفاده از دستور زیر namespace مورد نظر را ایجاد کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl create -f ./my-namespace.yaml</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">create</span><span style="color: #ADBAC7"> </span><span style="color: #6CB6FF">-f</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">./my-namespace.yaml</span></span></code></pre></div>



<p class="wp-block-paragraph">برای مشاهده Namespace ساخته شده می‌توانید دستور زیر را وارد کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl get namespace namespace1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">get</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">namespace</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">namespace1</span></span></code></pre></div>



<p class="wp-block-paragraph">همچنین برای مشاهده جزئیات بیشتر Namespace ساخته شده، دستور زیر را وارد کنید:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl describe namespace namespace1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">describe</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">namespace</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">namespace1</span></span></code></pre></div>



<h3 class="wp-block-heading" id="h-روش-دوم-ایجاد-namespace-بدون-فایل-yaml">روش دوم: ایجاد Namespace بدون فایل YAML</h3>



<p class="wp-block-paragraph">یک روش بسیار ساده‌تر برای ایجاد فضای نام کوبرنتیز استفاده از دستور زیر است:</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:clamp(16px, 1rem, 24px);font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:clamp(24px, 1.5rem, 36px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:10px 0px 10px 16px;margin-bottom:-2px;width:100%;text-align:left;background-color:#2d333d;color:#9eadbd">Bash</span><span role="button" tabindex="0" style="color:#adbac7;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>kubectl create namespace namespace1</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki github-dark-dimmed" style="background-color: #22272e" tabindex="0"><code><span class="line"><span style="color: #F69D50">kubectl</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">create</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">namespace</span><span style="color: #ADBAC7"> </span><span style="color: #96D0FF">namespace1</span></span></code></pre></div>



<h2 class="wp-block-heading" id="h-اشتباهات-رایج-در-استفاده-از-namespace-کوبرنتیز">اشتباهات رایج در استفاده از Namespace کوبرنتیز</h2>



<p class="wp-block-paragraph">Namespace در کوبرنتیز یک ابزار سازمان‌دهی و جداسازی منطقی منابع است، اما استفاده نادرست از آن می‌تواند باعث پیچیدگی در مدیریت کلاستر و کاهش بهره‌وری شود.</p>



<p class="wp-block-paragraph">یکی از اشتباهات رایج این است که از Namespace به‌عنوان مرز کامل امنیتی استفاده می‌شود. در حالی که Namespace به‌تنهایی تضمین‌کننده ایزوله‌سازی کامل نیست و برای کنترل امنیت باید از مکانیزم‌هایی مانند Network Policy و RBAC استفاده شود.</p>



<p class="wp-block-paragraph">اشتباه رایج دیگر، ایجاد تعداد زیاد Namespace برای هر سرویس یا هر جزء کوچک سیستم است. این کار باعث افزایش پیچیدگی در مدیریت منابع، سیاست‌ها و مانیتورینگ می‌شود و معمولاً (به استثنا سناریو‌های خاص) توصیه نمی‌شود.</p>



<p class="wp-block-paragraph">از دیگر خطاهای متداول، عدم تعریف سیاست‌های منابع در سطح Namespace است. در چنین حالتی ممکن است یک تیم یا سرویس، مصرف منابع را بدون محدودیت افزایش دهد و روی سایر بخش‌های کلاستر تأثیر بگذارد.</p>



<p class="wp-block-paragraph">همچنین استفاده نکردن از استاندارد مشخص برای نام‌گذاری Namespaceها باعث سردرگمی در محیط‌های چند تیمی و چند پروژه‌ای می‌شود.</p>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p class="wp-block-paragraph">Namespace در کوبرنتیز یک مکانیزم برای سازمان‌دهی منابع داخل یک کلاستر است که امکان تفکیک منطقی بین تیم‌ها، پروژه‌ها و محیط‌های مختلف را فراهم می‌کند. این قابلیت کمک می‌کند منابعی مانند Pod ،Service و Deployment در محدوده‌های جداگانه مدیریت شوند؛ بدون اینکه نیاز به ایجاد چند کلاستر مستقل باشد.</p>



<p class="wp-block-paragraph">Namespaceها همچنین نقش مهمی در کنترل دسترسی و مدیریت سیاست‌ها دارند. با استفاده از آن‌ها می‌توان محدوده اعمال RBAC را مشخص کرد و همچنین از طریق ResourceQuota و LimitRange مصرف منابع را در هر محدوده کنترل کرد.</p>



<p class="wp-block-paragraph">با وجود این قابلیت‌ها، Namespace به‌تنهایی یک مرز امنیتی کامل محسوب نمی‌شود و برای ایزوله‌سازی شبکه یا اعمال محدودیت‌های امنیتی دقیق‌تر باید از ابزارهای تکمیلی مانند Network Policy استفاده شود. در نتیجه، Namespace بیشتر از این‌که یک مکانیزم برای ایزوله‌سازی در سطح زیرساخت باشد، یک ابزار برای ساختاردهی، مدیریت و کنترل منابع در سطح منطقی است.</p>



<p class="wp-block-paragraph">در برخی پلتفرم‌های مبتنی بر کوبرنتیز، امکان استفاده از Namespace به‌صورت یکپارچه فراهم شده تا تیم‌ها بتوانند منابع، دسترسی‌ها و محیط‌های مختلف را ساده‌تر مدیریت کنند. به‌عنوان مثال، <a href="https://hamravesh.com/darkube" type="link" id="https://hamravesh.com/darkube" target="_blank" rel="noreferrer noopener">سرویس دارکوب</a> هم‌روش این قابلیت را در اختیار شما قرار می‌دهند تا بدون درگیر شدن با پیچیدگی‌های زیرساخت، از مزایای Namespace در مدیریت پروژه‌های خود استفاده کنید.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-namespace/">آشنایی با مفهوم Namespace در کوبرنتیز؛ آموزش نحوه ساخت</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-kubernetes-namespace/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>آشنایی با کنترلر کوبرنتیز؛ مقایسه با اپراتور کوبرنتیز</title>
		<link>https://hamravesh.com/blog/what-is-kubernetes-controller/</link>
					<comments>https://hamravesh.com/blog/what-is-kubernetes-controller/#respond</comments>
		
		<dc:creator><![CDATA[علی باقرزاده]]></dc:creator>
		<pubDate>Wed, 15 Apr 2026 12:30:00 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[کوبرنتیز]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=2935</guid>

					<description><![CDATA[<p>کنترلرها حلقه‌های بی‌پایانی از بررسی کلاستر کوبرنتیز هستند که در صورت مشاهده مشکلی، آن را حل می‌کنند. در این مطلب قصد داریم با انواع کنترلرها در کوبرنتیز آشنا شویم.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-controller/">آشنایی با کنترلر کوبرنتیز؛ مقایسه با اپراتور کوبرنتیز</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">کنترلر کوبرنتیز یکی از مفاهیم کلیدی در مدیریت کلاسترهاست که به شما کمک می‌کند وضعیت منابع و پادها همواره پایدار و مطابق با وضعیت مطلوب (Desired State) باقی بماند. با استفاده از کنترلرها، بسیاری از وظایف تکراری و مدیریتی به‌صورت خودکار انجام می‌شود و نیاز به دخالت دستی کاهش می‌یابد. علاوه بر کنترلرها، اپراتور کوبرنتیز لایه‌ای پیشرفته‌تر فراهم می‌کند تا مدیریت اپلیکیشن‌های پیچیده و stateful را نیز خودکار کرده و فرایندهایی مانند نصب، به‌روزرسانی، مقیاس‌دهی و بازیابی را بهبود بخشد. در این مطلب بررسی می‌‌کنیم که کنترلر کوبرنتیز چیست، چگونه کار می‌کند و چه تفاوتی با اپراتور کوبرنتیز دارد. </p>



<h2 class="wp-block-heading">کنترلر کوبرنتیز چیست؟</h2>



<p class="wp-block-paragraph">کنترلرها اجزای بنیادی کوبرنتیز هستند که برای مدیریت و نگهداری وضعیت منابع طراحی شده‌اند. این اجزا با بررسی مداوم وضعیت فعلی منابع و مقایسه آن با وضعیت مطلوب (Desired State)، اطمینان حاصل می‌کنند که کلاستر همیشه در شرایط پایدار باقی بماند. به عبارت دیگر، کنترلرها به صورت حلقه‌های کنترلی (Control Loops) عمل می‌کنند تا به صورت خودکار وضعیت منابع را اصلاح و هماهنگ کنند.</p>



<h2 class="wp-block-heading">کنترلر کوبرنتیز چگونه کار می‌کنند؟</h2>



<p class="wp-block-paragraph">عملکرد کنترلرها را می‌توان با مثال یک ترموستات ساده توضیح داد. فرض کنید ترموستات برای حفظ دمای اتاق روی یک مقدار مشخص تنظیم شده است. در این حالت دمای تنظیم‌شده همان وضعیت مطلوب و دمای فعلی اتاق همان وضعیت فعلی است. ترموستات به‌صورت مداوم دما را بررسی می‌کند و اگر دما از مقدار مطلوب کمتر باشد، سیستم گرمایشی را روشن و در صورت بیشتر بودن خاموش می‌کند.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="669" src="https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-02-1024x669.webp" alt="کنترلر کوبرنتیز چگونه کار می‌‌کند؟ ارتباط کنترلر کوبرنتیز با آبجکت‌ها و منابع" class="wp-image-4752" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-02-1024x669.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-02-300x196.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-02-768x502.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-02-120x78.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-02.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">کنترلرهای کوبرنتیز نیز دقیقاً به همین شکل عمل می‌کنند؛ آن‌ها وضعیت منابع را از طریق Kubernetes API پایش کرده و هرگونه اختلاف با وضعیت مطلوب را اصلاح می‌کنند. این حلقه کنترلی به صورت پیوسته اجرا می‌شود تا منابع و پادها همیشه در وضعیت پایدار باقی بمانند.</p>



<h2 class="wp-block-heading">کنترلر کوبرنتیز چه منابعی را مدیریت می‌کند؟</h2>



<p class="wp-block-paragraph">در کوبرنتیز، هر کنترلر مسئول مدیریت یک نوع مشخص از منابع است. این منابع به‌صورت آبجکت‌هایی در Kubernetes API تعریف می‌شوند و کنترلرها وضعیت آن‌ها را به‌صورت مداوم بررسی و اصلاح می‌کنند.</p>



<p class="wp-block-paragraph">برای مثال، برخی کنترلرها مانند ReplicaSet مسئول حفظ تعداد مشخصی <a href="https://hamravesh.com/blog/what-is-kubernetes-pod" target="_blank" rel="noreferrer noopener">پاد در کوبرنتیز</a> هستند، در حالی که کنترلرهایی مانند Job وظیفه اجرای تسک‌های مشخص را برعهده دارند. هر کنترلر تنها روی مجموعه‌ای از منابع مشخص تمرکز دارد و تلاش می‌کند وضعیت آن‌ها را با وضعیت مطلوب تعریف‌شده توسط کاربر همگام نگه دارد.</p>



<p class="wp-block-paragraph">نکته مهم این است که در کوبرنتیز، این منابع از طریق API تعریف و ذخیره می‌شوند و کنترلرها نیز از همین طریق وضعیت آن‌ها را مشاهده کرده (Watch) و در صورت نیاز تغییرات لازم را اعمال می‌کنند (Update). به همین دلیل، تعامل بین کنترلر کوبرنتیز و Kubernetes API نقش کلیدی در مدیریت کلاستر دارد.</p>



<figure class="wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex">
<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="573" data-id="4753" src="https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-03-1024x573.webp" alt="انواع کنترلرهای کوبرنتیز شامل ReplicaSet و Deployment و StatefulSet و Job و CronJob و DaemonSet" class="wp-image-4753" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-03-1024x573.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-03-300x168.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-03-768x430.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-03-120x67.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/04/hamravesh-what-is-kubernetes-controller-03.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
</figure>



<h2 class="wp-block-heading" id="h-انواع-کنترلر-کوبرنتیز">انواع کنترلر کوبرنتیز</h2>



<p class="wp-block-paragraph">در <a href="https://hamravesh.com/blog/what-is-kubernetes" target="_blank" rel="noreferrer noopener">کوبرنتیز</a>، کنترلرهای مختلفی برای مدیریت سناریوهای متفاوت وجود دارند. هر یک از این کنترلرها برای مدیریت نوع خاصی از workload طراحی شده‌اند. نکته مهم این است که این کنترلرها معمولاً به‌صورت مستقل از یکدیگر عمل نمی‌کنند، بلکه در بسیاری از موارد به‌صورت زنجیره‌ای با هم در ارتباط هستند. برای مثال، زمانی که یک Deployment ایجاد می‌شود، این کنترلر به‌طور مستقیم پادها را مدیریت نمی‌کند، بلکه یک ReplicaSet ایجاد می‌کند و این ReplicaSet است که مسئول ایجاد و نگهداری پادها است. این ارتباط بین کنترلرها باعث می‌شود مدیریت وضعیت مطلوب سیستم به‌صورت دقیق‌تر و قابل‌کنترل‌تری انجام شود.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">در ادامه با مهم‌ترین انواع کنترلر کوبرنتیز آشنا می‌شویم.</p>



<h3 class="wp-block-heading">ReplicaSet</h3>



<p class="wp-block-paragraph">کنترلر ReplicaSet مسئول اطمینان از اجرای تعداد مشخصی از پادهای یکسان در هر لحظه است و نقش مهمی در حفظ پایداری اپلیکیشن‌ها در کوبرنتیز دارد. این کنترلر به‌صورت مداوم وضعیت پادها را بررسی می‌کند و اگر تعداد پادهای در حال اجرا کمتر از مقدار تعریف‌شده باشد، پادهای جدیدی ایجاد می‌کند. در مقابل، اگر تعداد پادها بیشتر از مقدار موردنظر باشد، برخی از آن‌ها را حذف می‌کند.</p>



<h3 class="wp-block-heading">Deployment</h3>



<p class="wp-block-paragraph">کنترلر <a href="https://hamravesh.com/blog/what-is-kubernetes-deployment" target="_blank" rel="noreferrer noopener">دیپلویمنت در کوبرنتیز</a> یکی از رایج‌ترین راهکارها برای استقرار اپلیکیشن‌ها در کوبرنتیز است. این کنترلر مدیریت ReplicaSetها را برعهده دارد و امکان به‌روزرسانی تدریجی (rolling update) و بازگشت به نسخه‌های قبلی (rollback) را فراهم می‌کند. به بیان دیگر، Deployment یک لایه بالاتر از ReplicaSet است و فرایند به‌روزرسانی و مدیریت نسخه‌های مختلف اپلیکیشن را ساده‌تر می‌کند.</p>



<h3 class="wp-block-heading">StatefulSet</h3>



<p class="wp-block-paragraph">کنترلر StatefulSet برای مدیریت اپلیکیشن‌هایی استفاده می‌شود که به هویت پایدار و ذخیره‌سازی دائمی نیاز دارند (برای مثال سرویس‌های داده‌های احراز هویت کاربران). در این نوع از workloadها، هر پاد دارای یک شناسه منحصربه‌فرد است و این شناسه حتی در صورت جابه‌جایی یا راه‌اندازی مجدد پاد نیز حفظ می‌شود. برخلاف سایر workloadها، این پادها قابل جایگزینی ساده با یکدیگر نیستند و هر کدام هویت مستقل خود را دارند. این ویژگی باعث می‌شود StatefulSet گزینه مناسبی برای اجرای سیستم‌هایی باشد که به ذخیره‌سازی پایدار وابسته هستند.</p>



<p class="wp-block-paragraph">زمانی که از دیتابیس‌های PostgreSQL ،MySQL ،MongoDB ،Cassandra و به‌صورت کلی از هر حالت Persistent Storage استفاده می‌شود، StatefulSets راهکار مناسبی است.</p>



<h3 class="wp-block-heading">Job</h3>



<p class="wp-block-paragraph">کنترلر Job برای اجرای تسک‌های کوتاه‌مدت طراحی شده است. این کنترلر یک یا چند پاد ایجاد می‌کند و تا زمانی که این پادها با موفقیت کار خود را به پایان برسانند، آن‌ها را مدیریت می‌کند. پس از تکمیل موفقیت‌آمیز تسک، Job، دیگر پاد جدیدی ایجاد نمی‌کند.</p>



<h3 class="wp-block-heading">CronJob</h3>



<p class="wp-block-paragraph">کنترلر <a href="https://hamravesh.com/blog/cronjob-kubernetes/" target="_blank" rel="noreferrer noopener">CronJob</a> برای اجرای Jobها در زمان‌بندی‌های مشخص استفاده می‌شود. کاربران می‌توانند با استفاده از الگوی زمان‌بندی (cron)، مشخص کنند که یک Job در چه زمان‌هایی اجرا شود و CronJob به‌صورت خودکار در همان زمان‌ها Jobهای موردنظر را ایجاد می‌کند.</p>



<h3 class="wp-block-heading">DaemonSet</h3>



<p class="wp-block-paragraph">کنترلر DaemonSet اطمینان حاصل می‌کند که یک نسخه از یک پاد مشخص روی همه (یا برخی) از نودهای کلاستر اجرا شود. با اضافه شدن نودهای جدید به کلاستر، پادهای مربوط به DaemonSet نیز به‌صورت خودکار روی آن‌ها اجرا می‌شوند و در صورت حذف نود، این پادها نیز حذف می‌شوند.</p>



<h2 class="wp-block-heading">تفاوت کنترلر کوبرنتیز و اپراتور کوبرنتیز</h2>



<p class="wp-block-paragraph">در کوبرنتیز، کنترلرها و اپراتورها هر دو مسئول مدیریت وضعیت منابع هستند، اما از نظر دامنه و سطح پیچیدگی تفاوت دارند.</p>



<ul class="wp-block-list">
<li><strong>کنترلر کوبرنتیز</strong>: وظیفه اصلی آن حفظ وضعیت مطلوب (Desired State) برای یک یا چند نوع مشخص از منابع است. این کنترلرها معمولاً برای workloadهای استاندارد و عمومی مثل پادها، ReplicaSetها، Deploymentها و Jobها استفاده می‌شوند. همان‌طور که در بخش قبل توضیح دادیم، کنترلرها از حلقه‌های کنترلی (Control Loops) استفاده می‌کنند تا وضعیت فعلی را با وضعیت مطلوب مقایسه کرده و در صورت نیاز اصلاح کنند.</li>



<li><strong>اپراتور کوبرنتیز</strong>: اپراتورها لایه‌ای بالاتر از کنترلرها هستند و برای مدیریت <a href="https://hamravesh.com/blog/stateful-vs-stateless" target="_blank" rel="noreferrer noopener">اپلیکیشن‌های stateful</a> یا پیچیده طراحی شده‌اند. یک اپراتور علاوه بر حفظ وضعیت مطلوب منابع، می‌تواند منطق اختصاصی برنامه را نیز پیاده‌سازی کند؛ مثلاً مدیریت نصب، پیکربندی، به‌روزرسانی، بکاپ و بازیابی یک دیتابیس. به‌عبارتی اپراتورها کنترلرهایی هستند که با دانش برنامه (application-specific logic) ترکیب شده‌اند تا مدیریت خودکار اپلیکیشن‌های پیچیده را ممکن سازند.</li>
</ul>



<p class="wp-block-paragraph">به طور خلاصه کنترلرها برای منابع استاندارد و عمومی هستند و فقط وضعیت کلاستر را پایش و اصلاح می‌کنند. اپراتورها از کنترلرها استفاده می‌کنند اما شامل منطق اختصاصی اپلیکیشن هم هستند و قادرند عملیات پیچیده و خودکار اپلیکیشن را مدیریت کنند.</p>



<h3 class="wp-block-heading" id="h-مزایای-کنترلر-کوبرنتیز">مزایای کنترلر کوبرنتیز</h3>



<p class="wp-block-paragraph">کنترلرهای کوبرنتیز از مزایای زیر برخوردارند:</p>



<ul class="wp-block-list">
<li><strong>پایداری وضعیت منابع:</strong> کنترلرها تضمین می‌کنند که وضعیت فعلی منابع همواره با وضعیت مطلوب (Desired State) هماهنگ باشد.</li>



<li><strong>خودکارسازی وظایف ساده و تکراری:</strong> کنترلرها وظایف مدیریت تعداد پادها، راه‌اندازی مجدد آنها و نگهداری وضعیت را بدون دخالت دستی انجام می‌دهند.</li>



<li><strong>حلقه کنترل مستمر:</strong> کنترلرها به صورت مداوم منابع را پایش می‌کنند و در صورت اختلاف با وضعیت مطلوب، تغییرات لازم را اعمال می‌کنند.</li>
</ul>



<h3 class="wp-block-heading" id="h-مزایای-اپراتور-کوبرنتیز">مزایای اپراتور کوبرنتیز</h3>



<p class="wp-block-paragraph" id="h-مزایای-اپراتور-کوبرنتیز-شامل-موارد-زیر-است">مزایای اپراتور کوبرنتیز شامل موارد زیر است:</p>



<ul class="wp-block-list">
<li><strong>مدیریت خودکار اپلیکیشن‌های پیچیده:</strong> اپراتورها قادرند علاوه بر حفظ وضعیت مطلوب منابع، منطق اختصاصی برنامه‌ها را نیز مدیریت کنند.</li>



<li><strong>خودکارسازی عملیات پیشرفته:</strong> نصب، به‌روزرسانی، مقیاس‌دهی، پشتیبان‌گیری و بازیابی اپلیکیشن‌ها توسط اپراتور کوبرنتیز به صورت خودکار انجام می‌شود.</li>



<li>پ<strong>شتیبانی از اپلیکیشن‌های stateful:</strong> اپراتورها برای اپلیکیشن‌هایی که به ذخیره‌سازی پایدار و هویت ثابت نیاز دارند، گزینه مناسب هستند.</li>
</ul>



<h2 class="wp-block-heading" id="h-در-پایان">در پایان</h2>



<p class="wp-block-paragraph">کنترلرها بخش اصلی کوبرنتیز هستند که به‌صورت مداوم وضعیت منابع را پایش می‌کنند و با اعمال تغییرات لازم، آن‌ها را با وضعیت مطلوب هماهنگ نگه می‌دارند. این کار باعث پایداری پادها و کاهش دخالت دستی می‌شود. اپراتورها لایه‌ای بالاتر هستند و علاوه بر مدیریت منابع، منطق اپلیکیشن‌های پیچیده و stateful را خودکار می‌کنند؛ مانند فرایندهای نصب، مقیاس‌دهی و بازیابی. درک کنترلرها و نقش اپراتورها برای مدیریت مؤثر کلاستر و استفاده بهینه از منابع ضروری است. </p>



<p class="wp-block-paragraph"><a href="https://hamravesh.com/darkube" target="_blank" rel="noreferrer noopener">پلتفرم ابری دارکوب</a> هم‌روش تجربه زیرساختی مبتنی بر کوبرنتیز را به ساده‌ترین شکل ممکن در اختیارتان قرار می‌دهد. با کمک دارکوب می‌توانید به سرعت برنامه‌های خود را بر بستر کوبرنتیز اجرا کنید و اپلیکیشن‌های پرکاربرد را با تنظیمانت دلخواه بسازید.</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-kubernetes-controller/">آشنایی با کنترلر کوبرنتیز؛ مقایسه با اپراتور کوبرنتیز</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-kubernetes-controller/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>بازیابی از فاجعه یا Disaster Recovery چیست؟ آشنایی با انواع استراتژی‌ها</title>
		<link>https://hamravesh.com/blog/what-is-disaster-recovery/</link>
					<comments>https://hamravesh.com/blog/what-is-disaster-recovery/#respond</comments>
		
		<dc:creator><![CDATA[علی باقرزاده]]></dc:creator>
		<pubDate>Wed, 18 Mar 2026 16:30:00 +0000</pubDate>
				<category><![CDATA[مقالات]]></category>
		<category><![CDATA[فضای ابری]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=3712</guid>

					<description><![CDATA[<p>بعد از وقوع هر شکلی از فاجعه و مشکل در دنیای زیرساخت و IT، نیاز است که به سرعت همه چیز را به حالت عادی برگرداند. بازیابی از فاجعه دقیقا چنین هدفی دارد.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-disaster-recovery/">بازیابی از فاجعه یا Disaster Recovery چیست؟ آشنایی با انواع استراتژی‌ها</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">بازیابی از فاجعه (Disaster Recovery) یکی از مهم‌ترین مفاهیم در مدیریت زیرساخت‌های IT است. DR به سازمان‌ها کمک می‌کند در صورت بروز حوادثی مانند حملات سایبری، قطعی سیستم‌ها یا خطاهای انسانی، خدمات خود را در کوتاه‌ترین زمان ممکن بازیابی کنند. در این مطلب، به بررسی کامل اجزای برنامه بازیابی از فاجعه، تفاوت DR با DRaaS و مقایسه استراتژی‌های مختلف مانند Active-Active و Active-Passive می‌پردازیم.</p>



<h2 class="wp-block-heading">بازیابی از فاجعه (Disaster Recovery) چیست؟</h2>



<p class="wp-block-paragraph">بازیابی از فاجعه (Disaster Recovery یا DR) به مجموعه‌ای از فرایندها، سیاست‌ها و راهکارهای فنی گفته می‌شود که به سازمان‌ها کمک می‌کند پس از وقوع یک حادثه، بحران یا فاجعه، سیستم‌های فناوری اطلاعات (IT) و داده‌های حیاتی خود را در کوتاه‌ترین زمان ممکن بازیابی کنند. این مفهوم یکی از اجزای اصلی استراتژی‌های تداوم کسب‌وکار (Business Continuity) در سازمان‌ها محسوب می‌شود.</p>



<p class="wp-block-paragraph">هدف اصلی بازیابی از فاجعه این است که زمان از کار افتادن سیستم‌ها (Downtime) و از دست رفتن داده‌ها به حداقل برسد. این فرایند شامل اقداماتی مانند پشتیبان‌گیری از داده‌ها، استفاده از زیرساخت‌های جایگزین برای داده‌ها و سرویس‌ها و تعریف سناریوهای مشخص برای بازگرداندن سرویس‌ها است.</p>



<p class="wp-block-paragraph">در عمل، بازیابی از فاجعه، بازیابی از بحران و بازیابی از حادثه همگی به یک مفهوم اشاره دارند: آمادگی برای بازگرداندن سریع عملیات سازمان پس از وقوع اختلال‌های جدی، به‌گونه‌ای که تداوم کسب‌وکار حفظ شود.</p>



<h2 class="wp-block-heading" id="h-انواع-فاجعه-ها-در-دنیای-it">انواع فاجعه‌ها در دنیای IT</h2>



<p class="wp-block-paragraph">در حوزه فناوری اطلاعات، فاجعه‌ها به رویدادهایی گفته می‌شود که باعث اختلال جدی در سیستم‌ها، از دست رفتن داده‌ها یا توقف خدمات می‌شوند. در چنین شرایطی، سازمان‌ها باید با استفاده از راهکارهای بازیابی از فاجعه بتوانند سیستم‌ها و اطلاعات حیاتی خود را در کوتاه‌ترین زمان ممکن بازیابی کنند. این فاجعه‌ها را می‌توان به سه دسته اصلی تقسیم کرد.</p>



<h3 class="wp-block-heading">۱. فاجعه‌های طبیعی</h3>



<p class="wp-block-paragraph">فاجعه‌های طبیعی از جمله تهدیداتی هستند که می‌توانند زیرساخت‌های فیزیکی IT را به‌طور مستقیم تخریب کرده و دسترسی به سیستم‌ها را مختل کنند. این رویدادها خارج از کنترل انسان هستند و معمولاً نیاز فوری به بازیابی از فاجعه ایجاد می‌کنند. برخی از فاجعه‌های طبیعی در دنیای IT عبارتند از زلزله، سیل، آتش‌سوزی و طوفان و رعد و برق.</p>



<h3 class="wp-block-heading" id="h-۲-فاجعه-های-ناشی-از-انسان">۲. فاجعه‌های ناشی از انسان</h3>



<p class="wp-block-paragraph">این نوع فاجعه‌ها معمولاً در اثر خطاهای داخلی یا حملات عمدی رخ می‌دهند و یکی از رایج‌ترین دلایل نیاز به بازیابی از فاجعه در سازمان‌ها هستند. برخی از این فاجعه‌ها عبارتند از:</p>



<ul class="wp-block-list">
<li>حملات سایبری شامل:
<ul class="wp-block-list">
<li>باج‌افزار (Ransomware): قفل شدن یا رمزگذاری داده‌ها</li>



<li><a href="https://hamravesh.com/blog/ddos-attack" target="_blank" rel="noreferrer noopener">حملات DDoS</a>: از دسترس خارج شدن سرویس‌ها</li>



<li>نفوذ و سرقت اطلاعات: دسترسی غیرمجاز به داده‌های حساس</li>
</ul>
</li>



<li>اشتباهات انسانی شامل:
<ul class="wp-block-list">
<li>حذف ناخواسته داده‌ها</li>



<li>پیکربندی اشتباه سیستم‌ها یا تنظیمات امنیتی</li>
</ul>
</li>
</ul>



<h3 class="wp-block-heading" id="h-۳-فاجعه-های-زیرساختی-و-ژئوپلیتیکی">۳. فاجعه‌های زیرساختی و ژئوپلیتیکی<br></h3>



<p class="wp-block-paragraph">برخی فاجعه‌ها در مقیاس کلان رخ می‌دهند و می‌توانند زیرساخت‌های ارتباطی و فناوری اطلاعات را در سطح گسترده مختل کنند. در این شرایط، اهمیت بازیابی از فاجعه برای حفظ تداوم خدمات حیاتی بیشتر می‌شود. از جمله این موارد عبارتند از: </p>



<ul class="wp-block-list">
<li>جنگ: تخریب زیرساخت‌ها و اختلال در اینترنت و مراکز داده</li>



<li>حملات سایبری گسترده (Cyber Warfare): هدف قرار دادن زیرساخت‌های حیاتی</li>



<li>قطع سراسری اینترنت: اختلال در شبکه‌های ارتباطی یا از کار افتادن زیرساخت‌های مخابراتی</li>
</ul>



<h2 class="wp-block-heading" id="h-اجزای-اصلی-برنامه-بازیابی-از-فاجعه-drp">اجزای اصلی برنامه بازیابی از فاجعه (DRP)</h2>



<p class="wp-block-paragraph">برنامه بازیابی از فاجعه (Disaster Recovery Plan یا DRP) یکی از مهم‌ترین بخش‌های مدیریت ریسک و تداوم کسب‌وکار در سازمان‌ها است. این برنامه مشخص می‌کند که در صورت وقوع یک حادثه یا بحران، چگونه باید سیستم‌ها، داده‌ها و خدمات حیاتی در کوتاه‌ترین زمان ممکن بازیابی شوند. یک برنامه DR از اجزای مختلفی تشکیل شده است که هرکدام نقش مشخصی در فرایند بازیابی دارند.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="612" src="https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-02-1024x612.webp" alt="برنامه بازیابی از فاجعه چیست؟" class="wp-image-4733" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-02-1024x612.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-02-300x179.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-02-768x459.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-02-120x72.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-02.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<h3 class="wp-block-heading" id="h-۱-تحلیل-ریسک-و-ارزیابی-اثرات-فاجعه-risk-assessment-and-business-impact-analysis">۱. <strong>تحلیل ریسک و ارزیابی اثرات فاجعه (Risk Assessment and Business Impact Analysis)</strong></h3>



<p class="wp-block-paragraph">این مرحله نقطه شروع طراحی هر برنامه بازیابی از فاجعه است و هدف آن شناسایی تهدیدات و بررسی تأثیر آن‌ها بر کسب‌وکار است. در این مرحله موارد زیر بررسی می‌شوند:</p>



<ul class="wp-block-list">
<li>شناسایی تهدیدات: مانند حملات سایبری، بلایای طبیعی و خطاهای انسانی</li>



<li>اولویت‌بندی سیستم‌ها و داده‌ها: تعیین سیستم‌های حیاتی برای تداوم کسب‌وکار</li>



<li>ارزیابی تأثیرات: بررسی پیامدهای مالی و عملیاتی هر اختلال</li>
</ul>



<h3 class="wp-block-heading" id="h-۲-برنامه-ریزی-بازیابی-از-فاجعه-disaster-recovery-planning">۲. <strong>برنامه‌ریزی بازیابی از فاجعه (Disaster Recovery Planning)</strong></h3>



<p class="wp-block-paragraph">در این مرحله، سناریوهای مختلف برای بازیابی از فاجعه طراحی می‌شوند و مشخص می‌شود در هر شرایط چه اقداماتی باید انجام شود. این بخش شامل موارد زیر می‌شود:</p>



<ul class="wp-block-list">
<li><strong>تعیین اولویت سیستم‌ها: </strong>هر کسب‌وکار سیستم‌هایی دارد که در یک یا چند مورد از این دسته‌بندی‌های حیاتی قرار می‌گیرد. در فرایند برنامه‌ریزی باید ارزیابی مخاطرات برای هر یک از سیستم‌ها بر اساس سناریوهای متفاوت بحران انجام شود:
<ul class="wp-block-list">
<li><strong>سیستم‌های حیاتی ماموریت (Mission-critical systems): </strong>از کار افتادن این سیستم‌ها کل عملیات یا کسب‌و کار را به‌سرعت متوقف می‌کنند و کسب‌وکار فلج می‌شود</li>



<li><strong>سیستم‌های حیاتی کسب‌وکار (Business-critical systems): </strong>با از کار افتادن این سیستم‌ها، آسیب‌های مالی یا عملیاتی شدید ایجاد می‌شود اما کل فرایندهای سازمان، فورا از کار نمی‌افتد</li>



<li><strong>سیستم‌های غیر حیاتی (Non-critical systems):</strong> هنگامی که این سیستم‌ها از کار بیافتند تاثیر جزئی بر بهره‌وری می‌گذارند و پیامدهای مالی کمی به همراه دارند</li>
</ul>
</li>



<li><strong>تعیین اهداف بازیابی: </strong>دو هدف کلیدی در این بخش وجود دارد:
<ul class="wp-block-list">
<li><strong>هدف نقطه بازیابی (Recovery Point Objective &#8211; RPO):</strong> این مقدار مشخص می‌کند که در صورت بروز بحران، سازمان قصد دارد حداکثر به چند دقیقه قبل از بحران باز گردد</li>



<li><strong>هدف زمان بازیابی (Recovery Time Objective &#8211; RTO):</strong> حداکثر مدت زمانی که پس از فاجعه باید سپری شود تا سیستم‌ها بازیابی شوند. به عبارت دیگر، چقدر زمان نیاز داریم تا سیستم‌های حیاتی دوباره به کار بیافتند</li>
</ul>
</li>
</ul>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="612" src="https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-04-1024x612.webp" alt="مقایسه RTO و RPO در بازیابی از فاجعه" class="wp-image-4776" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-04-1024x612.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-04-300x179.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-04-768x459.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-04-120x72.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-04.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<ul class="wp-block-list">
<li><strong>تعیین فرایندهای بازیابی:</strong> مشخص می‌شود که در زمان وقوع فاجعه، چه اقداماتی باید انجام شود و کدام تیم‌ها و افراد مسئولیت دارند</li>



<li><strong>طراحی ساختار سازمانی DR:</strong> برای اینکه بازیابی فاجعه به‌درستی انجام شود، باید یک ساختار سازمانی مشخص داشته باشیم که تعیین کند چه کسی مسئولیت چه کاری را بر عهده دارد. این ساختار معمولاً شامل یک تیم بازیابی فاجعه تشکیل شده از افراد کلیدی سازمان است</li>
</ul>



<h3 class="wp-block-heading" id="h-۳-پشتیبان-گیری-منظم-از-داده-ها-data-backup">۳. <strong>پشتیبان‌گیری منظم از داده‌ها (Data Backup)</strong></h3>



<p class="wp-block-paragraph">پشتیبان‌گیری از داده‌ها یکی از حیاتی‌ترین بخش‌های هر برنامه بازیابی از فاجعه است، زیرا بدون نسخه پشتیبان، بازیابی اطلاعات عملاً غیرممکن خواهد بود. این فرایند شامل موارد زیر است:</p>



<ul class="wp-block-list">
<li><strong>پشتیبان‌گیری منظم:</strong> برنامه‌ریزی برای تهیه نسخه پشتیبان از داده‌ها به‌صورت دوره‌ای (روزانه، هفتگی یا ماهانه) با توجه به نیازهای سازمان</li>



<li><strong>ذخیره‌سازی Off-Site:</strong> نگهداری نسخه‌های پشتیبان در مکانی جدا از محل اصلی داده‌ها (مانند استفاده از مراکز داده دور یا سرویس‌های ابری) تا در صورت بروز فاجعه در محل اصلی، نسخه‌های پشتیبان ایمن بمانند</li>



<li><strong>استفاده از <a href="https://hamravesh.com/blog/cloud-backup" target="_blank" rel="noreferrer noopener">سرویس بکاپ</a> ابری (Cloud Backup):</strong> که امکان بازیابی سریع‌تر و کاهش هزینه‌های نگهداری را فراهم می‌کند</li>
</ul>



<p class="wp-block-paragraph">یکی از نکات مهم این است که بسیاری از سازمان‌ها بکاپ دارند، اما آن را تست نمی‌کنند؛ بکاپی که قابل بازیابی نباشد، عملاً بی‌فایده است.</p>



<h3 class="wp-block-heading" id="h-۴-راهکارهای-فنی-بازیابی-disaster-recovery-solutions">۴. <strong>راهکارهای فنی بازیابی (Disaster Recovery Solutions)</strong></h3>



<p class="wp-block-paragraph">در این بخش، فناوری‌ها و زیرساخت‌های مورد استفاده برای اجرای بازیابی از فاجعه مشخص می‌شوند. این راهکارها به سازمان‌ها کمک می‌کنند تا در صورت وقوع حادثه، سیستم‌ها و خدمات خود را با حداقل اختلال بازیابی کنند. راهکارها عبارتند از:</p>



<ul class="wp-block-list">
<li><strong>مجازی‌سازی و فناوری‌های ابری (Virtualization &amp; Cloud):</strong> استفاده از زیرساخت‌های ابری و مجازی‌سازی یکی از رایج‌ترین روش‌های پیاده‌سازی بازیابی از فاجعه در سازمان‌های مدرن است</li>



<li><strong>سیستم‌های Fail-Over و Fail-back:</strong> این سیستم‌ها امکان انتقال خودکار سیستم‌ها از سرورهای آسیب‌دیده به سرورهای سالم را فراهم می‌کنند تا وقفه‌های عملیاتی به حداقل برسند</li>
</ul>



<h3 class="wp-block-heading" id="h-۵-آزمایش-و-ارزیابی-برنامه-بازیابی-از-فاجعه-testing-amp-evaluation">۵. <strong>آزمایش و ارزیابی برنامه بازیابی از فاجعه (Testing &amp; Evaluation)</strong></h3>



<p class="wp-block-paragraph">هیچ برنامه DR بدون آزمایش و ارزیابی منظم قابل اعتماد نیست. برای اطمینان از کارایی برنامه در زمان فاجعه، باید آن را به صورت منظم آزمایش کرد. این مرحله شامل موارد زیر است:</p>



<ul class="wp-block-list">
<li><strong>آزمایش سناریوهای مختلف فاجعه:</strong> DRP باید برای سناریوهای مختلف مانند قطعی برق، حمله سایبری یا خرابی سخت‌افزاری آزمایش شود تا از عملکرد صحیح آن اطمینان حاصل شود</li>



<li><strong>آموزش کارکنان:</strong> تیم‌های مربوط به بازیابی فاجعه باید به‌طور مداوم آموزش ببینند تا در زمان فاجعه بتوانند سریع و مؤثر واکنش نشان دهند</li>



<li><strong>به‌روزرسانی مداوم برنامه:</strong> پس از هر آزمون یا وقوع فاجعه واقعی، DRP باید بازبینی و به‌روزرسانی شود تا نقاط ضعف اصلاح شوند</li>
</ul>



<h3 class="wp-block-heading" id="h-۶-مدیریت-و-نظارت-مداوم-monitoring-and-maintenance">۶. <strong>مدیریت و نظارت مداوم (Monitoring and Maintenance)</strong></h3>



<p class="wp-block-paragraph">برنامه بازیابی از فاجعه باید به‌صورت مداوم به‌روزرسانی و پایش شود تا در زمان نیاز قابل اجرا باشد. فرایندهای نظارت شامل این موارد هستند:</p>



<ul class="wp-block-list">
<li><strong>نظارت بر سیستم‌های پشتیبان:</strong> اطمینان از اینکه نسخه‌های پشتیبان به‌درستی گرفته شده‌اند و در دسترس هستند</li>



<li><strong>نظارت بر سلامت سیستم‌ها:</strong> پایش مداوم زیرساخت‌ها و سیستم‌ها برای شناسایی مشکلات و جلوگیری از وقوع فاجعه‌ها</li>



<li><strong>نگهداری و به‌روزرسانی مستمر:</strong> تجهیزات و فناوری‌های مورد استفاده در DR باید به‌صورت منظم نگهداری و به‌روزرسانی شوند</li>
</ul>



<h3 class="wp-block-heading" id="h-۷-مستندسازی-documentation">۷. <strong>مستندسازی (Documentation)</strong></h3>



<p class="wp-block-paragraph">مستندسازی دقیق، اجرای صحیح فرایند بازیابی از فاجعه را تضمین می‌کند؛ به‌ویژه در شرایطی که زمان و دقت اهمیت بالایی دارند. برخی از مستندات شامل این موارد هستند:</p>



<ul class="wp-block-list">
<li><strong>فرایندها و سیاست‌های بازیابی:</strong> مراحل اجرای بازیابی، مسئولیت‌ها و اقداماتی که باید انجام شوند</li>



<li><strong>ثبت اطلاعات تماس‌های ضروری:</strong> اطلاعات تماس افراد کلیدی مانند مدیران IT، تامین‌کنندگان سرویس‌های ابری و شرکت‌های امنیتی</li>
</ul>



<h2 class="wp-block-heading" id="h-draas-چیست">DRaaS چیست؟</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="612" src="https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-03-1024x612.webp" alt="DRaaS یا بازیابی از فاجعه به عنوان سرویس چیست؟" class="wp-image-4734" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-03-1024x612.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-03-300x179.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-03-768x459.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-03-120x72.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-disaster-recovey-03.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">DRaaS یا Disaster Recovery as a Service به معنای «بازیابی از فاجعه به‌عنوان یک سرویس» است. DRaaS یک راهکار مبتنی بر رایانش ابری از DR است که برخلاف مدل‌های سنتی، نیاز به طراحی و مدیریت زیرساخت بازیابی توسط سازمان را حذف می‌کند و این مسئولیت را به یک ارائه‌دهنده سرویس واگذار می‌کند. در حالی که در روش‌های سنتی Disaster Recovery، سازمان‌ها باید زیرساخت پشتیبان (مانند دیتاسنتر ثانویه) را خودشان ایجاد و نگهداری کنند، در DRaaS این زیرساخت به‌صورت سرویس و بر بستر ابر ارائه می‌شود.</p>



<h3 class="wp-block-heading">DRaaS چگونه کار می‌کند؟</h3>



<p class="wp-block-paragraph">در سرویس Disaster Recovery as a Service، فرایند بازیابی معمولاً از ۴ مرحله اصلی تشکیل شده است:</p>



<ul class="wp-block-list">
<li>انتقال مداوم داده‌ها به زیرساخت ابری (Replication)</li>



<li>نگهداری نسخه‌های به‌روز از سیستم‌ها و ماشین‌های مجازی</li>



<li>فعال‌سازی سریع سرویس‌ها در محیط جایگزین (Failover)</li>



<li>بازگشت به زیرساخت اصلی پس از رفع مشکل (Failback)</li>
</ul>



<h3 class="wp-block-heading">مزایای DRaaS</h3>



<p class="wp-block-paragraph">DRaaS مزایایی دارد که آن را به گزینه‌ای مناسب برای بسیاری از سازمان‌ها تبدیل می‌کند.</p>



<p class="wp-block-paragraph"><strong>۱. کاهش هزینه‌های زیرساختی</strong></p>



<p class="wp-block-paragraph">در DRaaS نیازی به راه‌اندازی دیتاسنتر پشتیبان یا خرید تجهیزات گران‌قیمت نیست و سازمان‌ها می‌توانند از زیرساخت ابری برای پیاده‌سازی راهکار بازیابی از فاجعه استفاده کنند.</p>



<p class="wp-block-paragraph"><strong>۲. مقیاس‌پذیری بالا</strong></p>



<p class="wp-block-paragraph">سازمان‌ها می‌توانند متناسب با رشد داده‌ها و نیازهای خود، منابع مورد استفاده را افزایش یا کاهش دهند؛ بدون اینکه تغییرات پیچیده‌ای در زیرساخت ایجاد کنند.</p>



<p class="wp-block-paragraph"><strong>۳. کاهش زمان بازیابی (RTO)</strong></p>



<p class="wp-block-paragraph">به دلیل آماده بودن زیرساخت جایگزین در فضای ابری، بازیابی سیستم‌ها در زمان بسیار کوتاه‌تری نسبت به روش‌های سنتی انجام می‌شود.</p>



<p class="wp-block-paragraph"><strong>۴. پیاده‌سازی سریع</strong></p>



<p class="wp-block-paragraph">برخلاف راهکارهای سنتی DR، راه‌اندازی DRaaS معمولاً زمان کمتری می‌برد و پیچیدگی کمتری دارد.</p>



<h3 class="wp-block-heading">چالش‌ها و محدودیت‌های DRaaS</h3>



<p class="wp-block-paragraph">DRaaS در کنار مزایا، چالش‌هایی نیز به همراه دارد.</p>



<p class="wp-block-paragraph"><strong>۱. هزینه‌های پنهان</strong></p>



<p class="wp-block-paragraph">در برخی موارد، هزینه‌های مربوط به پهنای باند، ذخیره‌سازی یا بازیابی می‌تواند بیشتر از انتظار باشد.</p>



<p class="wp-block-paragraph"><strong>۲. نگرانی‌های امنیتی و حریم داده</strong></p>



<p class="wp-block-paragraph">انتقال داده‌ها به فضای ابری نیازمند اعتماد به ارائه‌دهنده سرویس و رعایت استانداردهای امنیتی است.</p>



<p class="wp-block-paragraph"><strong>۳. وابستگی به اینترنت</strong></p>



<p class="wp-block-paragraph">در صورت اختلال در ارتباطات، دسترسی به زیرساخت ابری ممکن است محدود شود.</p>



<h2 class="wp-block-heading">انواع استراتژی‌های بازیابی از فاجعه (Active-Active و Active-Passive)</h2>



<p class="wp-block-paragraph">در طراحی راهکار بازیابی از فاجعه، انتخاب معماری مناسب یکی از تصمیم‌های کلیدی است که به‌طور مستقیم بر فاکتورهای RTO ،RPO و هزینه‌های زیرساخت تأثیر می‌گذارد.</p>



<p class="wp-block-paragraph">به‌طور کلی، استراتژی‌های بازیابی از فاجعه به دو دسته اصلی تقسیم می‌شوند: Active-Active و Active-Passive.</p>



<h3 class="wp-block-heading">مقایسه بازیابی از فاجعه Active-Active و Active-Passive در یک نگاه</h3>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>ویژگی</strong></td><td class="has-text-align-center" data-align="center"><strong>Active-Passive</strong></td><td class="has-text-align-center" data-align="center"><strong>Active-Active</strong></td></tr><tr><td><strong>میزان حیاتی بودن سرویس‌ها</strong></td><td class="has-text-align-center" data-align="center">سیستم‌های حیاتی کسب‌وکار (میزان حیاتی بودن متوسط)</td><td class="has-text-align-center" data-align="center">سیستم‌های حیاتی ماموریت (بسیار حیاتی)</td></tr><tr><td><strong>وضعیت عملیاتی تجهیزات در زیرساخت‌ها</strong></td><td class="has-text-align-center" data-align="center">زیرساخت اصلی فعال و زیرساخت جایگزین معمولا در حالت آماده به کار</td><td class="has-text-align-center" data-align="center">همه زیرساخت‌ها فعال</td></tr><tr><td><strong>روش همگام‌شدن دیتا</strong></td><td class="has-text-align-center" data-align="center">با تاخیر زمانی و/یا به صورت دوره‌ای</td><td class="has-text-align-center" data-align="center">در لحظه و با تاخیر نزدیک به صفر</td></tr><tr><td><strong>RPO</strong></td><td class="has-text-align-center" data-align="center">دقیقه/ساعت/روز</td><td class="has-text-align-center" data-align="center">نزدیک به صفر</td></tr><tr><td><strong>RTO</strong></td><td class="has-text-align-center" data-align="center">دقیقه/ساعت/روز/هفته</td><td class="has-text-align-center" data-align="center">ثانیه/دقیقه (نزدیک به صفر)</td></tr><tr><td><strong>روش انتقال سرویس هنگام فاجعه</strong></td><td class="has-text-align-center" data-align="center">دستی یا نیمه خودکار</td><td class="has-text-align-center" data-align="center">کاملا خودکار</td></tr><tr><td><strong>تاثیر بازیابی روی کاربران سازمان</strong></td><td class="has-text-align-center" data-align="center">امکان از دسترس خارج شدن سرویس برای چند ثانیه تا چند ساعت</td><td class="has-text-align-center" data-align="center">کاربران معمولا متوجه مشکل نمی‌شوند</td></tr><tr><td><strong>هزینه راه‌اندازی و استفاده</strong></td><td class="has-text-align-center" data-align="center">پایین تا متوسط</td><td class="has-text-align-center" data-align="center">بسیار بالا</td></tr><tr><td><strong>پیچیدگی فنی</strong></td><td class="has-text-align-center" data-align="center">پیچیدگی متوسط. راه‌اندازی و مدیریت ساده‌تر</td><td class="has-text-align-center" data-align="center">پیچیدگی بالا. نیاز به مدیریت ترافیک (لود بالانسر هوشمند) و همانند‌سازی همزمان داده‌ها&nbsp;</td></tr></tbody></table></figure>
</div></div>



<h3 class="wp-block-heading">معماری Active-Active چیست؟</h3>



<p class="wp-block-paragraph">در معماری Active-Active، دو یا چند سایت به‌صورت همزمان فعال هستند و بار کاری (Workload) بین آن‌ها توزیع می‌شود. در این حالت، اگر یکی از سایت‌ها دچار اختلال شود، سایت دیگر بدون وقفه سرویس را ادامه می‌دهد. این معماری بیشتر در سازمان‌هایی استفاده می‌شود که حتی چند دقیقه اختلال می‌تواند خسارت جدی ایجاد کند.</p>



<h4 class="wp-block-heading">ویژگی‌های معماری Active-Active</h4>



<ul class="wp-block-list">
<li>هر دو سایت به‌صورت همزمان در حال سرویس‌دهی هستند</li>



<li>تقریباً بدون قطعی (Near Zero Downtime) عمل می‌کند</li>



<li>برای سیستم‌های بسیار حیاتی مناسب است.</li>
</ul>



<p class="wp-block-paragraph"><strong>مزایا</strong></p>



<ul class="wp-block-list">
<li>دسترس‌پذیری بسیار بالا</li>



<li>حداقل زمان بازیابی (RTO نزدیک به صفر)</li>



<li>کاهش ریسک از دست رفتن داده</li>
</ul>



<p class="wp-block-paragraph"><strong>چالش‌ها</strong></p>



<ul class="wp-block-list">
<li>هزینه پیاده‌سازی بالا</li>



<li>پیچیدگی در هماهنگ‌سازی داده‌ها</li>



<li>نیاز به زیرساخت و دانش فنی پیشرفته</li>
</ul>



<h3 class="wp-block-heading">معماری Active-Passive چیست؟</h3>



<p class="wp-block-paragraph">در معماری Active-Passive، یک سایت اصلی (Active) مسئول ارائه سرویس است و یک سایت پشتیبان (Passive) برای شرایط اضطراری آماده نگه داشته می‌شود. در صورت بروز مشکل، فرایند Fail-Over انجام شده و سایت پشتیبان جایگزین سایت اصلی می‌شود.</p>



<h4 class="wp-block-heading" id="h-ویژگی-های-معماری-active-passive">ویژگی‌های معماری Active-Passive</h4>



<ul class="wp-block-list">
<li>تنها یک سایت در حالت عادی فعال است</li>



<li>سایت دوم در حالت آماده‌باش قرار دارد</li>



<li>به انتقال سرویس در زمان بحران نیاز دارد</li>
</ul>



<p class="wp-block-paragraph"><strong>مزایا</strong></p>



<ul class="wp-block-list">
<li>هزینه کمتر نسبت به Active-Active</li>



<li>پیاده‌سازی ساده‌تر</li>
</ul>



<p class="wp-block-paragraph"><strong>چالش‌ها</strong></p>



<ul class="wp-block-list">
<li>وجود downtime در زمان Failover</li>



<li>وابستگی به سرعت انتقال و آماده‌سازی سیستم</li>
</ul>



<h3 class="wp-block-heading" id="h-انواع-standby-در-معماری-بازیابی-از-فاجعه-active-passive">انواع Standby در معماری بازیابی از فاجعه Active-Passive</h3>



<p class="wp-block-paragraph">در مدل Active-Passive، سطح آمادگی سایت پشتیبان می‌تواند متفاوت باشد. این تفاوت معمولاً در قالب سه نوع Standby تعریف می‌شود.</p>



<h4 class="wp-block-heading">مقایسه بازیابی از فاجعه راهکارهای Warm Standby ،Cold Standby و Hot Standby در یک نگاه</h4>



<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-constrained wp-block-group-is-layout-constrained">
<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>ویژگی</strong></td><td class="has-text-align-center" data-align="center"><strong>Cold Standby</strong></td><td class="has-text-align-center" data-align="center"><strong>Warm Standby</strong></td><td class="has-text-align-center" data-align="center"><strong>Hot Standby</strong></td></tr><tr><td><strong>وضعیت مرکز غیرفعال در حالت عادی</strong></td><td class="has-text-align-center" data-align="center">خاموش یا کاملا غیرفعال</td><td class="has-text-align-center" data-align="center">روشن اما با حداقل بار کاری</td><td class="has-text-align-center" data-align="center">همیشه در حال اجرا و همگام با سایت اصلی</td></tr><tr><td><strong>همگام‌سازی داده‌ها</strong></td><td class="has-text-align-center" data-align="center">انجام نمی‌شود یا بازیابی دستی از بکاپ</td><td class="has-text-align-center" data-align="center">زمان‌بندی‌شده (مثلا هر چند ساعت) یا نیمه‌هم‌زمان</td><td class="has-text-align-center" data-align="center">هم‌زمان یا تقریبا هم‌زمان</td></tr><tr><td><strong>اتوماسیون Fail-Over</strong></td><td class="has-text-align-center" data-align="center">معمولاً دستی</td><td class="has-text-align-center" data-align="center">نیمه‌خودکار یا دستی</td><td class="has-text-align-center" data-align="center">خودکار</td></tr><tr><td><strong>دسترسی به داده‌ها</strong></td><td class="has-text-align-center" data-align="center">نیازمند بازیابی دستی از نسخه پشتیبان</td><td class="has-text-align-center" data-align="center">همگام‌سازی دوره‌ای داده‌ها</td><td class="has-text-align-center" data-align="center">دسترسی لحظه‌ای یا تقریبا لحظه‌ای به داده‌ها</td></tr><tr><td><strong><strong>RPO</strong></strong></td><td class="has-text-align-center" data-align="center">چند ساعت تا چند روز</td><td class="has-text-align-center" data-align="center">چند دقیقه تا چند ساعت</td><td class="has-text-align-center" data-align="center">چند ثانیه تا چند دقیقه</td></tr><tr><td><strong>RTO</strong></td><td class="has-text-align-center" data-align="center">چند روز تا چند هفته</td><td class="has-text-align-center" data-align="center">چند ساعت</td><td class="has-text-align-center" data-align="center">چند دقیقه</td></tr><tr><td><strong>پیچیدگی</strong></td><td class="has-text-align-center" data-align="center">کم</td><td class="has-text-align-center" data-align="center">متوسط</td><td class="has-text-align-center" data-align="center">زیاد</td></tr><tr><td><strong>هزینه</strong></td><td class="has-text-align-center" data-align="center">کم</td><td class="has-text-align-center" data-align="center">متوسط</td><td class="has-text-align-center" data-align="center">زیاد</td></tr><tr><td><strong>نیاز به نگهداری</strong></td><td class="has-text-align-center" data-align="center">حداقل؛ تقریبا فقط در زمان بحران</td><td class="has-text-align-center" data-align="center">نیاز به تست و به‌روزرسانی دوره‌ای</td><td class="has-text-align-center" data-align="center">نیاز به مانیتورینگ و نگهداری دائمی</td></tr><tr><td><strong>کاربرد</strong></td><td class="has-text-align-center" data-align="center">سرویس‌های غیرحیاتی با حساسیت کم به زمان</td><td class="has-text-align-center" data-align="center">سرویس‌های با حساسیت متوسط به زمان و داده</td><td class="has-text-align-center" data-align="center">سیستم‌های حیاتی (بانک، پرداخت، سلامت و &#8230;)</td></tr></tbody></table></figure>
</div></div>
</div></div>



<h4 class="wp-block-heading"><strong>بازیابی از فاجعه Active-Passive از نوع Cold Standby چیست؟</strong></h4>



<p class="wp-block-paragraph">در Cold Standby، زیرساخت اولیه وجود دارد، اما سیستم‌ها و داده‌ها به‌صورت کامل آماده نیستند و بازیابی، نیاز به زمان قابل توجهی دارد. این مدل برای سیستم‌های غیر حیاتی مناسب است و زمان بازیابی بالا و هزینه پایینی دارد.</p>



<h4 class="wp-block-heading"><strong>بازیابی از فاجعه Active-Passive از نوع Warm Standby چیست؟</strong></h4>



<p class="wp-block-paragraph">در Warm Standby، سایت پشتیبان تا حدی آماده است، اما برای شروع سرویس‌دهی نیاز به انجام برخی تنظیمات یا راه‌اندازی‌ها دارد. در این مدل زمان بازیابی متوسط و هزینه‌‌ها متعادل است و برای بسیاری از سناریوهای سازمانی کاربرد دارد.</p>



<h4 class="wp-block-heading"><strong>بازیابی از فاجعه Active-Passive از نوع Hot Standby چیست؟</strong></h4>



<p class="wp-block-paragraph">در Hot Standby، سایت پشتیبان تقریباً به‌صورت کامل آماده است و داده‌ها به‌صورت لحظه‌ای یا نزدیک به لحظه‌ای همگام‌سازی می‌شوند. در این مدل زمان بازیابی (RTO) بسیار کوتاه است، حداقل داده‌ها از دست می‌رود و هزینه بالایی دارد.</p>



<h2 class="wp-block-heading" id="h-در-پایان">در پایان</h2>



<p class="wp-block-paragraph">بازیابی از فاجعه (DR) بخشی حیاتی از تداوم کسب‌وکار است و تضمین می‌کند که سازمان‌ها پس از وقوع بحران‌ها، داده‌ها و سیستم‌های حیاتی خود را سریع و امن بازیابی کنند. با انتخاب معماری مناسب (Active-Active یا Active-Passive)، تعیین اهداف RPO و RTO و بهره‌گیری از سرویس‌هایی مانند DRaaS، می‌توان زمان بازیابی را کاهش داد و ریسک از دست رفتن داده‌ها را به حداقل رساند. همچنین اجرای منظم، آزمایش و به‌روزرسانی برنامه DR، آمادگی سازمان را در مواجهه با حملات سایبری، خطاهای انسانی یا خرابی سخت‌افزار تضمین می‌کند.</p>



<p class="wp-block-paragraph">در صورت نیاز به راهکارهای بازیابی از فاجعه، با کارشناسان هم‌روش در تماس باشید تا بسته به نیاز سازمان شما، معماری مناسب، طراحی و به شما ارائه شود.</p>



<p class="wp-block-paragraph"></p>
<p>The post <a href="https://hamravesh.com/blog/what-is-disaster-recovery/">بازیابی از فاجعه یا Disaster Recovery چیست؟ آشنایی با انواع استراتژی‌ها</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-disaster-recovery/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Jenkins چیست؟ نحوه کار، ویژگی‌ها و کاربردهای جنکینز</title>
		<link>https://hamravesh.com/blog/what-is-jenkins/</link>
					<comments>https://hamravesh.com/blog/what-is-jenkins/#respond</comments>
		
		<dc:creator><![CDATA[علی باقرزاده]]></dc:creator>
		<pubDate>Wed, 18 Mar 2026 15:30:00 +0000</pubDate>
				<category><![CDATA[دواپس]]></category>
		<category><![CDATA[مقالات]]></category>
		<guid isPermaLink="false">https://hamravesh.com/blog/?p=2540</guid>

					<description><![CDATA[<p>در پروژه‌های نرم‌افزاری مدرن، توسعه‌دهندگان به طور مداوم کدهای جدیدی به مخزن پروژه اضافه می‌کنند. اگر فرایند ساخت (Build)، تست و استقرار نرم‌افزار به صورت دستی انجام شود، تیم توسعه با مشکلاتی مانند خطاهای انسانی، کند شدن انتشار نسخه‌ها و دشواری در مدیریت تغییرات روبه‌رو می‌شود. به همین دلیل در بسیاری از تیم‌های توسعه از [&#8230;]</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-jenkins/">Jenkins چیست؟ نحوه کار، ویژگی‌ها و کاربردهای جنکینز</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">در پروژه‌های نرم‌افزاری مدرن، توسعه‌دهندگان به طور مداوم کدهای جدیدی به مخزن پروژه اضافه می‌کنند. اگر فرایند ساخت (Build)، تست و استقرار نرم‌افزار به صورت دستی انجام شود، تیم توسعه با مشکلاتی مانند خطاهای انسانی، کند شدن انتشار نسخه‌ها و دشواری در مدیریت تغییرات روبه‌رو می‌شود. به همین دلیل در بسیاری از تیم‌های توسعه از ابزارهایی برای اتوماسیون فرایند توسعه نرم‌افزار استفاده می‌شود. این ابزارها معمولاً در چارچوب رویکرد DevOps استفاده می‌شوند. که هدف آن کوتاه‌تر کردن چرخه توسعه و انتشار نرم‌افزار است. یکی از شناخته‌شده‌ترین ابزارها در این حوزه Jenkins است. بسیاری از توسعه‌دهندگان هنگام آشنایی با DevOps با این سؤال روبه‌رو می‌شوند که جنکینز چیست و چه کاربردی دارد.</p>



<p class="wp-block-paragraph">در این مطلب بررسی می‌کنیم که جنکینز چگونه کار می‌کند، Jenkins Pipeline چه مفهومی دارد و مهم‌ترین کاربردها و ویژگی‌های Jenkins چیست.</p>



<h2 class="wp-block-heading" id="h-jenkins-چیست">Jenkins چیست؟</h2>



<p class="wp-block-paragraph">جنکینز یک سرور اتوماسیون متن‌باز است که برای خودکارسازی مراحل مختلف توسعه نرم‌افزار استفاده می‌شود. این ابزار به تیم‌های توسعه کمک می‌کند فرایندهایی مانند ساخت نرم‌افزار (Build)، اجرای تست‌ها و استقرار (Deployment) را به صورت خودکار انجام دهند.</p>



<p class="wp-block-paragraph">Jenkins یک برنامه مبتنی بر زبان جاوا است که روی سیستم‌عامل‌های مختلف مانند لینوکس، ویندوز و macOS اجرا می‌شود. این ابزار از طریق یک رابط کاربری وب مدیریت می‌شود و با استفاده از هزاران افزونه (Plugin) می‌تواند با ابزارهای مختلف توسعه نرم‌افزار یکپارچه شود.</p>



<p class="wp-block-paragraph">هدف اصلی جنکینز این است که مراحل تکراری در چرخه توسعه نرم‌افزار را خودکار کند. به عنوان مثال، زمانی که یک توسعه‌دهنده کدی را در مخزن پروژه ثبت می‌کند، جنکینز می‌تواند این مراحل را به طور خودکار انجام دهد:</p>



<ul class="wp-block-list">
<li>کد را دریافت کند</li>



<li>پروژه را Build کند</li>



<li>تست‌های خودکار را اجرا کند</li>



<li>در صورت موفق بودن مراحل قبلی، نرم‌افزار را در محیط مورد نظر مستقر کند</li>
</ul>



<p class="wp-block-paragraph">به این ترتیب، تیم توسعه سریع‌تر متوجه خطاها می‌شود و فرایند انتشار نسخه‌های جدید نرم‌افزار نیز قابل اعتمادتر می‌شود.</p>



<h2 class="wp-block-heading" id="h-jenkins-در-devops-چه-نقشی-دارد">Jenkins در DevOps چه نقشی دارد؟</h2>



<p class="wp-block-paragraph">جنکینز معمولاً در چارچوب فرایندهای <a href="https://hamravesh.com/blog/what-is-ci-cd" target="_blank" rel="noreferrer noopener">CI/CD</a> استفاده می‌شود. این اصطلاح به مجموعه‌ای از روش‌ها و ابزارها اشاره دارد که هدف آن‌ها خودکارسازی مراحل ادغام کد، تست و انتشار نرم‌افزار است.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="673" src="https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-jenkins-02-1024x673.webp" alt="نقش CI/CD در جنکینز چیست" class="wp-image-4663" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-jenkins-02-1024x673.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-jenkins-02-300x197.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-jenkins-02-768x505.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-jenkins-02-120x79.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-jenkins-02.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">در ادامه به صورت خلاصه سه مفهوم اصلی CI/CD و نقش جنکینز در آنها را بررسی می‌کنیم.</p>



<h3 class="wp-block-heading" id="h-continuous-integration-در-جنکینز">Continuous Integration در جنکینز</h3>



<p class="wp-block-paragraph">در روش <strong>Continuous Integration</strong> یا ادغام مداوم، توسعه‌دهندگان تغییرات کد خود را به صورت مکرر در یک مخزن مشترک ثبت می‌کنند. پس از هر تغییر، سیستم CI به صورت خودکار پروژه را Build می‌کند و تست‌ها را اجرا می‌کند. اگر مشکلی در کد وجود داشته باشد، خطا در همان مراحل اولیه شناسایی می‌شود. Jenkins یکی از ابزارهایی است که می‌تواند این فرایند را خودکار کند.</p>



<p class="wp-block-paragraph">برای مثال، وقتی یک برنامه‌نویس تغییر جدیدی را در مخزن Git ثبت می‌کند، Jenkins می‌تواند این مراحل را به طور خودکار انجام دهد:</p>



<ul class="wp-block-list">
<li>پروژه را Build کند</li>



<li>تست‌های واحد (Unit Test) را اجرا کند</li>



<li>نتیجه را به تیم توسعه گزارش دهد</li>
</ul>



<p class="wp-block-paragraph">این کار باعث می‌شود مشکلات خیلی زودتر شناسایی شوند.</p>



<h3 class="wp-block-heading" id="h-continuous-delivery-در-جنکینز">Continuous Delivery در جنکینز</h3>



<p class="wp-block-paragraph">مرحله بعدی <strong>Continuous Delivery</strong> است. در این روش، پس از Build و اجرای موفق تست‌ها، نسخه جدید نرم‌افزار آماده انتشار می‌شود. در این مرحله Jenkins می‌تواند نرم‌افزار را به صورت خودکار در محیط‌هایی مانند این موارد مستقر کند.</p>



<ul class="wp-block-list">
<li>محیط تست</li>



<li>محیط staging</li>



<li>یا محیط پیش‌تولید</li>
</ul>



<p class="wp-block-paragraph">در این حالت انتشار نهایی در محیط production معمولاً با تأیید انسانی انجام می‌شود.</p>



<h3 class="wp-block-heading" id="h-continuous-deployment-در-جنکینز">Continuous Deployment در جنکینز</h3>



<p class="wp-block-paragraph">در مدل <strong>Continuous Deployment</strong> کل فرایند انتشار نیز خودکار می‌شود. یعنی اگر تمام مراحل Build و تست با موفقیت انجام شوند، نسخه جدید نرم‌افزار بدون دخالت انسانی در محیط production منتشر می‌شود. جنکینز با استفاده از پایپ‌لاین‌ها و پلاگین‌های مختلف می‌تواند چنین فرایندی را پیاده‌سازی کند.</p>



<h2 class="wp-block-heading">نحوه کار Jenkins و معماری آن</h2>



<p class="wp-block-paragraph">Jenkins یک سرور اتوماسیون متن‌باز است که مراحل مختلف توسعه نرم‌افزار را به صورت خودکار اجرا می‌کند. این ابزار بر پایه زبان جاوا نوشته شده و روی سیستم‌عامل‌های مختلفی مانند لینوکس، ویندوز و macOS قابل اجرا است. Jenkins می‌تواند به شکل یک برنامه مستقل، یک servlet در سرورهای جاوا (مثل Tomcat یا Jetty) و یا در قالب کانتینر Docker راه‌اندازی شود.</p>



<h3 class="wp-block-heading">معماری Jenkins</h3>



<p class="wp-block-paragraph">معماری جنکینز بر اساس مدل Master/Agent طراحی شده است:</p>



<ul class="wp-block-list">
<li><strong>Master:</strong> بخش اصلی جنکینز و مسئول مدیریت پایپ‌لاین‌ها، زمان‌بندی Buildها، اجرای تست‌ها و جمع‌آوری گزارش‌ها است. Master همچنین وظیفه توزیع کارها به Agentها را بر عهده دارد.</li>



<li><strong>Agent:</strong><br>Agentها ماشین‌هایی هستند که جنکینز از طریق آن‌ها وظایف Build و تست را اجرا می‌کند. Agent می‌تواند روی سرور محلی یا روی ماشین‌های از راه دور قرار گیرد و به Jenkins Master متصل شود. این معماری اجازه می‌دهد Jenkins در مقیاس بزرگ، پروژه‌های متعدد را به صورت موازی و بهینه اجرا کند.</li>
</ul>



<p class="wp-block-paragraph">مزیت این مدل معماری این است که حتی اگر تعداد پروژه‌ها یا حجم Buildها زیاد شود، Jenkins با استفاده از Agentها می‌تواند بار پردازشی را توزیع کرده و عملکرد سیستم را حفظ کند.</p>



<h3 class="wp-block-heading">جریان کار Jenkins</h3>



<p class="wp-block-paragraph">فرایند اجرای یک Build یا پایپ‌لاین در جنکینز معمولاً شامل مراحل زیر است:</p>



<ol class="wp-block-list">
<li><strong>دریافت کد منبع:</strong> جنکینز تغییرات کد را از مخزن‌های Git ،SVN یا سایر سیستم‌های کنترل نسخه دریافت می‌کند.</li>



<li><strong>Build یا ساخت پروژه:</strong> جنکینز با استفاده از ابزارهای Build مانند Maven ،Gradle یا Ant پروژه را ساخته و بسته‌بندی می‌کند.</li>



<li><strong>اجرای تست‌ها:</strong> جنکینز تست‌های واحد (Unit Test) و تست‌های یکپارچه (Integration Test) را اجرا می‌کند. در صورت بروز خطا، تیم توسعه بلافاصله مطلع می‌شود.</li>



<li><strong>انتشار یا استقرار موقت:</strong> پس از موفقیت Build و تست‌ها، جنکینز می‌تواند نسخه نرم‌افزار را در محیط staging یا پیش‌تولید مستقر کند تا آماده انتشار نهایی شود.</li>



<li><strong>گزارش‌دهی و مانیتورینگ:</strong> جنکینز نتایج Build و تست‌ها را به صورت گزارش و نمودار ارائه می‌دهد و هرگونه خطا یا هشدار را ثبت می‌کند.</li>
</ol>



<h3 class="wp-block-heading" id="h-نقش-jenkinsfile-در-نحوه-کار-jenkins-چیست">نقش Jenkinsfile در نحوه کار Jenkins چیست؟</h3>



<p class="wp-block-paragraph">یک بخش کلیدی در نحوه کار Jenkins، فایل Jenkinsfile است. این فایل به صورت متن ساده نوشته می‌شود و تمام مراحل پایپ‌لاین را تعریف می‌کند. Jenkins این فایل را می‌خواند و Buildها و تست‌ها را طبق دستورالعمل‌های آن اجرا می‌کند.</p>



<p class="wp-block-paragraph">مزیت استفاده از Jenkinsfile این است که در آن پایپ‌لاین به صورت کد تعریف می‌شود، قابل نسخه‌بندی در مخزن پروژه است و تغییرات پایپ‌لاین با کد پروژه همگام می‌شوند.</p>



<p class="wp-block-paragraph">به این ترتیب، جنکینز نه تنها اجرای خودکار Build و تست را ممکن می‌کند، بلکه قابلیت کنترل و نگهداری پایپ‌لاین‌ها را نیز برای تیم توسعه فراهم می‌سازد.</p>



<h2 class="wp-block-heading" id="h-پایپ-لاین-jenkins-چیست">پایپ‌لاین Jenkins چیست؟</h2>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="668" src="https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-jenkins-03-1024x668.webp" alt="پایپ‌لاین جنکینز از توسعه تا پروداکشن" class="wp-image-4664" srcset="https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-jenkins-03-1024x668.webp 1024w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-jenkins-03-300x196.webp 300w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-jenkins-03-768x501.webp 768w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-jenkins-03-120x78.webp 120w, https://hamravesh.com/blog/wp-content/uploads/2026/03/hamravesh-what-is-jenkins-03.webp 1201w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>



<p class="wp-block-paragraph">Jenkins Pipeline مجموعه‌ای از مراحل و تسک‌ها است که جنکینز برای اجرای فرایندهای خودکار CI/CD اجرا می‌کند. به عبارت ساده، پایپ‌لاین مانند یک نقشه راه برای Jenkins است که مشخص می‌کند کدها چگونه Build، تست و در نهایت منتشر شوند. پایپ‌لاین‌ها این امکان را فراهم می‌کنند که:</p>



<ul class="wp-block-list">
<li>چندین مرحله مختلف به ترتیب مشخص اجرا شوند</li>



<li>وابستگی بین مراحل رعایت شود</li>



<li>خطاها سریع شناسایی و گزارش شوند</li>



<li>تمام مراحل به صورت خودکار و قابل تکرار انجام شوند</li>
</ul>



<h3 class="wp-block-heading">Pipeline as Code</h3>



<p class="wp-block-paragraph">برای مدیریت بهتر پایپ‌لاین‌ها، جنکینز از مفهوم Pipeline as Code استفاده می‌کند. این یعنی کل پایپ‌لاین در قالب یک فایل متنی به نام Jenkinsfile تعریف می‌شود و می‌توان آن را هم‌زمان با کد پروژه نسخه‌بندی کرد.</p>



<p class="wp-block-paragraph"><strong>مزایای Pipeline as Code</strong></p>



<ul class="wp-block-list">
<li>پایپ‌لاین برای همه اعضای تیم قابل مشاهده و بررسی است</li>



<li>تغییرات پایپ‌لاین با تغییرات کد پروژه همگام می‌شود</li>



<li>امکان اجرای پایپ‌لاین به صورت خودکار در محیط‌های مختلف فراهم است</li>
</ul>



<p class="wp-block-paragraph">مثال: در یک پروژه وب، Jenkinsfile می‌تواند شامل مراحل زیر باشد:</p>



<ol class="wp-block-list">
<li>ساخت پروژه با Gradle</li>



<li>اجرای تست واحد برای بررسی عملکرد هر بخش کوچک از کد</li>



<li>اجرای تست یکپارچه‌سازی برای بررسی عملکرد بخش‌ها در کنار هم</li>



<li>بسته‌بندی نهایی و آماده‌سازی برای استقرار</li>



<li>استقرار در محیط staging</li>
</ol>



<p class="wp-block-paragraph">جنکینز با خواندن Jenkinsfile، این مراحل را به ترتیب اجرا می‌کند و در صورت بروز خطا، فرایند متوقف و گزارش صادر می‌شود.</p>



<h3 class="wp-block-heading">Multibranch Pipeline</h3>



<p class="wp-block-paragraph">جنکینز می‌تواند پایپ‌لاین‌ها را برای چندین شاخه (Branch) مختلف پروژه اجرا کند. این قابلیت که به آن <strong>Multibranch Pipeline</strong> می‌گویند، باعث می‌شود:</p>



<ul class="wp-block-list">
<li>هر شاخه از مخزن کد، پایپ‌لاین مستقل خود را داشته باشد</li>



<li>هنگام اضافه شدن شاخه جدید، جنکینز به صورت خودکار آن را شناسایی و پایپ‌لاین مربوطه را اجرا کند</li>



<li>تست و Build برای هر شاخه به طور جداگانه انجام شود، بدون آنکه شاخه‌های دیگر تحت تاثیر قرار گیرند</li>
</ul>



<h3 class="wp-block-heading" id="h-سرعت-پایپ-لاین-و-بهینه-سازی-آن">سرعت پایپ‌لاین و بهینه‌سازی آن</h3>



<p class="wp-block-paragraph">جنکینز امکاناتی برای مدیریت سرعت اجرای پایپ‌لاین و پایداری آن دارد. به عنوان مثال، می‌توان متغیرها را در محدوده اجرای پایپ‌لاین ذخیره کرد تا مراحل بعدی از آن‌ها استفاده کنند. با این روش، حتی پایپ‌لاین‌های بزرگ و پیچیده نیز سریع‌تر اجرا می‌شوند و منابع بهینه مصرف می‌شوند.</p>



<h2 class="wp-block-heading" id="h-کاربردهای-اصلی-جنکینز-چیست">کاربردهای اصلی جنکینز چیست؟</h2>



<p class="wp-block-paragraph">جنکینز به تیم‌های توسعه نرم‌افزار کمک می‌کند تا مراحل تکراری و زمان‌بر توسعه را خودکار کنند و فرایند انتشار نرم‌افزار را سریع‌تر و قابل اعتمادتر بسازند. مهم‌ترین کاربردهای جنکینز عبارتند از:</p>



<h3 class="wp-block-heading">خودکارسازی ساخت پروژه</h3>



<p class="wp-block-paragraph">جنکینز می‌تواند پروژه‌ها را به صورت خودکار بسازد. هر زمان که توسعه‌دهندگان کد جدیدی به مخزن اضافه کنند، جنکینز تغییرات را دریافت کرده، پروژه را Build و آماده تست می‌کند. این کار باعث می‌شود تیم توسعه دیگر مجبور نباشد هر بار پروژه را دستی بسازد و به این ترتیب از خطاهای انسانی جلوگیری می‌شود.</p>



<h3 class="wp-block-heading">اجرای تست‌های خودکار</h3>



<p class="wp-block-paragraph">جنکینز توانایی اجرای انواع تست‌ها را دارد؛ از جمله تست‌های واحد که بخش‌های کوچک کد را بررسی می‌کنند و تست‌های یکپارچه‌سازی که عملکرد بخش‌ها در کنار هم را ارزیابی می‌کنند. اجرای خودکار تست‌ها باعث می‌شود مشکلات، به‌سرعت شناسایی شوند و کیفیت نرم‌افزار افزایش یابد.</p>



<h3 class="wp-block-heading">استقرار خودکار نرم‌افزار</h3>



<p class="wp-block-paragraph">پس از Build و اجرای موفق تست‌ها، جنکینز می‌تواند نرم‌افزار را در محیط‌های staging یا پیش‌تولید مستقر کند. این فرایند باعث می‌شود نسخه جدید، آماده انتشار در محیط تولید باشد و در صورت تمایل تیم توسعه، به سرعت منتشر شود.</p>



<h3 class="wp-block-heading">یکپارچه‌سازی با سیستم‌های کنترل نسخه و ابزارهای DevOps</h3>



<p class="wp-block-paragraph">جنکینز با مخزن‌های کد مانند Git و ابزارهای دیگر <a href="https://hamravesh.com/blog/what-is-devops" target="_blank" rel="noreferrer noopener">DevOps</a> یکپارچه می‌شود. این قابلیت باعث می‌شود که ادغام مداوم تغییرات کد با محیط‌های تست و تولید بدون دخالت دستی انجام شود.</p>



<h3 class="wp-block-heading">نظارت و گزارش‌دهی</h3>



<p class="wp-block-paragraph">جنکینز گزارش‌های دقیق از وضعیت Buildها، نتایج تست‌ها و عملکرد پایپ‌لاین ارائه می‌دهد. این گزارش‌ها به تیم توسعه کمک می‌کند مشکلات را سریع شناسایی و رفع کنند و فرآیند توسعه را شفاف‌تر مدیریت کنند.</p>



<h2 class="wp-block-heading" id="h-jenkins-چه-زمانی-استفاده-می-شود">Jenkins چه زمانی استفاده می‌شود؟</h2>



<p class="wp-block-paragraph" id="h-jenkins-چه-زمانی-استفاده-می-شود-جنکینز-معمولا-در-پروژه-هایی-استفاده-می-شود-که-تیم-توسعه-می-خواهد-فرایند-ساخت-تست-و-انتشار-نرم-افزار-را-تا-حد-امکان-خودکار-کند-در-چنین-پروژه-هایی-تغییرات-کد-به-طور-مداوم-در-مخزن-پروژه-ثبت-می-شود-و-لازم-است-هر-تغییر-سریع-بررسی-و-آزمایش-شود-تا-از-ایجاد-خطا-در-نسخه-های-جدید-جلوگیری-شود">جنکینز معمولاً در پروژه‌هایی استفاده می‌شود که تیم توسعه می‌خواهد فرایند ساخت، تست و انتشار نرم‌افزار را تا حد امکان خودکار کند. در چنین پروژه‌هایی، تغییرات کد به‌طور مداوم در مخزن پروژه ثبت می‌شود و لازم است هر تغییر سریع بررسی و آزمایش شود تا از ایجاد خطا در نسخه‌های جدید جلوگیری شود.</p>



<p class="wp-block-paragraph">یکی از رایج‌ترین موقعیت‌هایی که در آن از جنکینز استفاده می‌شود، پروژه‌هایی است که تیم توسعه به‌طور مرتب نسخه‌های جدیدی از نرم‌افزار منتشر می‌کند. در این شرایط، اجرای دستی مراحل ساخت پروژه، اجرای تست‌ها و استقرار نسخه جدید می‌تواند زمان‌بر و مستعد خطا باشد. جنکینز با خودکارسازی این مراحل به تیم‌ها کمک می‌کند روند انتشار نرم‌افزار را سریع‌تر و قابل اعتمادتر کنند.</p>



<p class="wp-block-paragraph">جنکینز همچنین در تیم‌هایی که از روش‌های توسعه مبتنی بر DevOps استفاده می‌کنند کاربرد زیادی دارد. در این تیم‌ها، هدف این است که فاصله بین نوشتن کد و انتشار آن در محیط عملیاتی تا حد ممکن کوتاه شود. جنکینز با اجرای خودکار پایپ‌لاین‌های ساخت و تست، این فرایند را ساده‌تر می‌کند.</p>



<p class="wp-block-paragraph">از طرف دیگر، در پروژه‌هایی که تعداد توسعه‌دهندگان زیاد است یا چند شاخه مختلف از کد به‌طور هم‌زمان در حال توسعه هستند، استفاده از جنکینز می‌تواند به مدیریت بهتر تغییرات کمک کند. در این حالت، هر تغییر کد می‌تواند به‌طور خودکار Build و تست شود تا مشکلات احتمالی سریع شناسایی شوند.</p>



<p class="wp-block-paragraph" id="h-jenkins-چه-زمانی-استفاده-می-شود">به طور خلاصه، جنکینز بیشتر در پروژه‌هایی استفاده می‌شود که در آن‌ها سرعت انتشار نسخه‌ها، کیفیت نرم‌افزار و خودکارسازی فرایندهای توسعه اهمیت زیادی دارد.</p>



<h2 class="wp-block-heading" id="h-ویژگی-های-کلیدی-جنکینز-چیست">ویژگی‌های کلیدی جنکینز چیست؟</h2>



<p class="wp-block-paragraph">جنکینز با چند ویژگی اصلی شناخته می‌شود:</p>



<p class="wp-block-paragraph"><strong>متن‌باز و رایگان</strong></p>



<p class="wp-block-paragraph">جنکینز یک پروژه اوپن‌سورس است و استفاده از آن کاملاً رایگان است. این موضوع باعث می‌شود تیم‌های توسعه بتوانند بدون محدودیت فرایندهای توسعه و انتشار نرم‌افزار خود را خودکار کنند و از منابع گسترده جامعه جنکینز برای یادگیری و حل مشکلات بهره ببرند.</p>



<p class="wp-block-paragraph"><strong>اکوسیستم پلاگین گسترده</strong></p>



<p class="wp-block-paragraph">جنکینز بیش از هزار پلاگین دارد که امکان یکپارچه‌سازی با ابزارهای مختلف توسعه نرم‌افزار، تست، کنترل نسخه و استقرار را فراهم می‌کند. این پلاگین‌ها باعث می‌شوند جنکینز بسیار انعطاف‌پذیر باشد و بتوان آن را برای نیازهای مختلف تیم‌ها سفارشی کرد.</p>



<p class="wp-block-paragraph"><strong>قابلیت تعریف پایپ‌لاین به صورت کد</strong></p>



<p class="wp-block-paragraph">با استفاده از Jenkinsfile، تیم توسعه می‌تواند کل مراحل Build، تست و استقرار را به صورت کد تعریف کند. این قابلیت باعث می‌شود پایپ‌لاین‌ها قابل نسخه‌بندی باشند و تغییرات به راحتی با کد پروژه همگام شوند.</p>



<p class="wp-block-paragraph"><strong>مقیاس‌پذیری</strong></p>



<p class="wp-block-paragraph">جنکینز با استفاده از معماری Master/Agent امکان اجرای همزمان پروژه‌های متعدد را دارد. این ویژگی به تیم‌های بزرگ اجازه می‌دهد که بار کاری را بین چند سرور توزیع کنند و عملکرد سیستم حفظ شود.</p>



<p class="wp-block-paragraph"><strong>امنیت مبتنی بر سرور</strong></p>



<p class="wp-block-paragraph">جنکینز قابلیت مدیریت دسترسی کاربران و استفاده از روش‌های احراز هویت امن را دارد. این ویژگی تضمین می‌کند که تنها افراد مجاز بتوانند به اجرای پایپ‌لاین‌ها و تغییرات دسترسی داشته باشند.</p>



<h3 class="wp-block-heading" id="h-مزایای-جنکینز">مزایای جنکینز</h3>



<p class="wp-block-paragraph">جنکینز به دلیل انعطاف‌پذیری بالا و جامعه کاربری گسترده، یکی از پرکاربردترین ابزارها در فرایندهای CI/CD محسوب می‌شود. بسیاری از تیم‌های توسعه از این ابزار برای ساده‌تر کردن فرایند ساخت، تست و انتشار نرم‌افزار استفاده می‌کنند. مهم‌ترین مزایای جنکینز عبارتند از:</p>



<ul class="wp-block-list">
<li>متن‌باز و رایگان</li>



<li>انعطاف‌پذیری بالا و اکوسیستم پلاگین گسترده</li>



<li>پشتیبانی از Pipeline as Code</li>



<li>مقیاس‌پذیر و قابل اجرا در محیط‌های مختلف</li>



<li>قابلیت یکپارچه‌سازی با ابزارهای DevOps</li>
</ul>



<h3 class="wp-block-heading" id="h-معایب-جنکینز">معایب جنکینز</h3>



<p class="wp-block-paragraph">در کنار مزایای متعدد، استفاده از جنکینز در برخی شرایط می‌تواند چالش‌هایی نیز ایجاد کند. به‌ویژه در پروژه‌های بزرگ یا سازمان‌هایی که زیرساخت پیچیده‌ای دارند، مدیریت و نگهداری این ابزار ممکن است نیازمند زمان و تخصص بیشتری باشد. برخی از محدودیت‌های جنکینز عبارتند از:</p>



<ul class="wp-block-list">
<li>پیکربندی و نگهداری در محیط‌های بزرگ می‌تواند پیچیده باشد</li>



<li>وابستگی زیاد به پلاگین‌ها ممکن است باعث مشکلات سازگاری شود</li>



<li>رابط کاربری کلاسیک ممکن است برای کاربران جدید کمی گیج‌کننده باشد</li>
</ul>



<h2 class="wp-block-heading" id="h-جمع-بندی">جمع‌بندی</h2>



<p class="wp-block-paragraph">در این مقاله بررسی کردیم که جنکینز چیست و چرا یکی از ابزارهای مهم در فرایندهای CI/CD محسوب می‌شود. جنکینز یک سرور اتوماسیون متن‌باز است که به تیم‌های توسعه کمک می‌کند مراحل مختلف توسعه نرم‌افزار مانند ساخت پروژه، اجرای تست‌ها و استقرار نسخه‌های جدید را به صورت خودکار انجام دهند.</p>



<p class="wp-block-paragraph">با استفاده از پایپ‌لاین‌ها در جنکینز می‌توان فرایند ساخت و انتشار نرم‌افزار را به شکل قابل تکرار و قابل مدیریت تعریف کرد. این موضوع باعث می‌شود خطاها زودتر شناسایی شوند و انتشار نسخه‌های جدید نرم‌افزار سریع‌تر و قابل اعتمادتر انجام شود.</p>



<p class="wp-block-paragraph">در عین حال، مانند هر ابزار دیگری، استفاده از جنکینز نیز چالش‌هایی دارد و راه‌اندازی و نگهداری آن در پروژه‌های بزرگ ممکن است نیازمند تجربه و پیکربندی دقیق باشد. با این حال، به دلیل انعطاف‌پذیری بالا و جامعه کاربری گسترده، جنکینز همچنان یکی از پرکاربردترین ابزارها برای خودکارسازی فرایندهای توسعه نرم‌افزار به شمار می‌رود.</p>
<p>The post <a href="https://hamravesh.com/blog/what-is-jenkins/">Jenkins چیست؟ نحوه کار، ویژگی‌ها و کاربردهای جنکینز</a> appeared first on <a href="https://hamravesh.com/blog">بلاگ هم‌روش</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://hamravesh.com/blog/what-is-jenkins/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
