اصول SSH: کار با سرورها، کلاینت‌ها و کلیدها

Secure Shell یا SSH پروتکل استاندارد صنعتی برای مدیریت امن سیستم‌های راه دور است. هنگام اتصال به یک سرور، اولین و مهم‌ترین مرحله احراز هویت است. در حالی که رمزعبورها روش رایجی هستند، در برابر حملات جست‌وجوی فراگیر (brute-force) آسیب‌پذیرند و می‌توانند امنیت سرور شما را به خطر بیندازند. برای ایجاد دفاعی مستحکم‌تر و قابل‌اطمینان‌تر باید از کلیدهای SSH استفاده کنید. این روش مبتنی بر رمزنگاری کلید عمومی است و راهی امن و راحت برای دسترسی به سرور فراهم می‌کند و به‌عنوان یک عمل پایه‌ای امنیتی برای هر مدیر سیستم مطرح است.

این آموزش چه چیزی به شما می‌آموزد

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

نکات کلیدی

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

چگونه کار می‌کند

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

مزایا

  • امنیت بالاتر: کلیدها بسیار سخت‌تر از رمزعبور قابل حدس یا حمله هستند—مثلاً کلید Ed25519 یا RSA 4096 بیتی.
  • راحتی: پس از تنظیم، می‌توانید بدون وارد کردن رمز وارد سرورها شوید. با افزودن passphrase به کلید خصوصی و استفاده از ssh-agent، تنها یک‌بار رمز را وارد می‌کنید.
  • اتوماسیون: برای CI/CD، مدیریت پیکربندی و اسکریپت‌های پشتیبان، کلیدهای SSH احراز هویت غیرتعاملی و امن فراهم می‌کنند.

الگوریتم‌ها

الگوریتم‌های رایج شامل RSA، ECDSA و Ed25519 هستند. برای بیشتر کاربردها Ed25519 توصیه می‌شود: ترکیبی از امنیت و عملکرد بهتر. تنها در صورت نیاز به اتصال به سیستم‌های بسیار قدیمی از RSA (۴۰۹۶ بیتی) استفاده کنید.

پیش‌نیازها

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

  • دسترسی به ماشین محلی برای تولید کلید
  • دسترسی موقت با رمز به سرور (برای روش ساده ssh-copy-id) یا کنسول وب برای روش دستی
  • sshd روی سرور نصب و در حال اجرا باشد

برای بررسی وضعیت سرویس ssh (مدیریت‌شده توسط openssh-server) از دستورات سیستم‌عامل خود استفاده کنید. اگر نصب نیست، پکیج‌های openssh-server و openssh-client را نصب کنید. پس از نصب، سرویس به‌طور خودکار شروع خواهد شد.

تولید جفت کلید روی ماشین محلی

قدم اول تولید جفت کلید است: یک کلید خصوصی محرمانه و یک کلید عمومی که قابل اشتراک است. برای تولید از ssh-keygen استفاده کنید. استاندارد مدرن Ed25519 است.

ssh-keygen -t ed25519

پس از اجرا، اولین پرامپت مسیر و نام فایل را نشان می‌دهد؛ Enter را فشار دهید تا مقدار پیش‌فرض (~/.ssh/id_ed25519) پذیرفته شود یا مسیر دیگری وارد کنید. اگر قبلاً کلیدی در مسیر وجود داشته باشد، از شما پرسیده می‌شود که آیا می‌خواهید آن را بازنویسی کنید—هشدار: بازنویسی دسترسی با کلید قبلی را از کار می‌اندازد.

سپس از شما خواسته می‌شود یک passphrase وارد کنید. passphrase لایه‌ای اضافی از امنیت فراهم می‌کند. برای استفاده تعاملی همیشه passphrase قوی در نظر بگیرید و از ssh-agent برای سهولت استفاده کنید. برای سیستم‌های خودکار که کاربر حضور ندارد ممکن است لازم باشد passphrase خالی باشد، اما در این موارد دسترسی‌ها را به‌شدت محدود کنید.

پس از تکمیل، خروجی تولید کلید را تأیید می‌کند و دو فایل جدید در ~/.ssh خواهید داشت:

  • id_ed25519 — کلید خصوصی
  • id_ed25519.pub — کلید عمومی

انتقال کلید عمومی به سرور

برای فعال‌سازی احراز هویت مبتنی بر کلید، باید کلید عمومی را به سرور کپی کنید و آن را به حساب کاربری موردنظر اضافه کنید. ساده‌ترین و توصیه‌شده‌ترین روش استفاده از ssh-copy-id است. این ابزار در بیشتر لینوکس‌ها، macOS و Windows (از طریق WSL) موجود است و نیاز به دسترسی موقتی با رمز به سرور دارد.

ssh-copy-id username@remote_host

در اولین اتصال ممکن است هشدار host authenticity ببینید؛ yes را تایپ کنید و Enter بزنید. سپس از شما رمز عبور کاربر خواسته می‌شود. ابزار ssh-copy-id دایرکتوری ~/.ssh و فایل authorized_keys را در صورت نبودن ایجاد کرده و کلید شما را با مجوزهای صحیح اضافه می‌کند.

اگر ssh-copy-id در دسترس نیست یا ورود با رمز قبلاً غیرفعال است، باید کار را دستی انجام دهید:

  1. کلید عمومی خود را نمایش دهید:
    cat ~/.ssh/id_ed25519.pub

    کامل رشته خروجی را کپی کنید (شروع با ssh-ed25519 AAAA...).

  2. با هر روشی که دارید وارد سرور شوید (مثلاً از کنسول وب).
  3. در سرور این دستورات را اجرا کنید تا دایرکتوری و فایل لازم ساخته و مجوزها تنظیم شوند، سپس کلید را به authorized_keys اضافه کنید:
    mkdir -p ~/.ssh
    chmod 700 ~/.ssh
    touch ~/.ssh/authorized_keys
    chmod 600 ~/.ssh/authorized_keys
    
    # Use >> to append, not > to overwrite
    echo "ssh-ed25519 AAAA..." >> ~/.ssh/authorized_keys

آزمایش اتصال کلید

پس از استقرار کلید، از ماشین محلی تلاش به اتصال کنید:

ssh username@remote_host

اگر وارد شدید، تنظیمات شما کامل است و می‌توانید سراغ سخت‌سازی سرور بروید.

مدیریت چندین سرور: فایل کانفیگ و ssh-agent

با کار کردن روی چند سرور و سرویس (مثل GitHub یا GitLab) معمولاً نیاز به مدیریت چندین جفت کلید دارید. فایل پیکربندی SSH و ssh-agent این کار را ساده می‌کنند.

می‌توانید فایل ~/.ssh/config را ایجاد و برای هر میزبان تنظیمات خاص از جمله نام کاربری و کلید خصوصی را تعیین کنید:

touch ~/.ssh/config
# Edit the file and add host entries, for example:
Host myserver
    HostName 203.0.113.10
    User youruser
    IdentityFile ~/.ssh/id_ed25519

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

اگر برای کلیدهایتان passphrase گذاشته‌اید، ssh-agent برای سهولت ضروری است. ssh-agent برنامه‌ای پس‌زمینه است که کلیدهای رمزگشایی‌شده را در حافظه نگه می‌دارد تا فقط یک‌بار per-session رمز را وارد کنید.

# Start the agent
eval "$(ssh-agent -s)"

# Add your key to the agent
ssh-add ~/.ssh/id_ed25519

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

سخت‌سازی سرور: غیرفعال‌سازی رمز و ورود مستقیم root

بعد از تأیید عملکرد ورود با کلید، باید پیکربندی SSH سرور را سخت‌تر کنید: مهم‌ترین اقدامات غیرفعال‌سازی PasswordAuthentication و جلوگیری از ورود مستقیم root است.

این تغییرات در فایل پیکربندی sshd، /etc/ssh/sshd_config انجام می‌شود. با دسترسی sudo آن را باز کنید:

sudo nano /etc/ssh/sshd_config

مهم: قبل از اعمال تغییرات، از وجود یک اتصال کلیدی برای یک کاربر غیر-root با امتیاز sudo مطمئن شوید تا از قفل شدن خارج از سرور جلوگیری کنید.

PasswordAuthentication را پیدا کرده، اگر با # کامنت شده آن را uncomment کرده و مقدار را به no تغییر دهید:

PasswordAuthentication no
PubkeyAuthentication yes

همچنین PermitRootLogin را بیابید و مقدار آن را به no تنظیم کنید:

PermitRootLogin no

فایل را ذخیره کرده و خارج شوید. سپس سرویس SSH را ریستارت کنید:

sudo systemctl restart ssh

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

ویژگی‌های پیشرفته و سخت‌افزاری

برای امنیت بیشتر می‌توانید از کلید سخت‌افزاری مانند YubiKey یا دیگر دستگاه‌های سازگار FIDO2/U2F استفاده کنید. در این حالت کلید خصوصی روی دستگاه سخت‌افزاری نگهداری می‌شود و فرایند احراز هویت نیازمند عمل فیزیکی (touch) است.

برای تولید کلید سخت‌افزاری:

ssh-keygen -t ed25519-sk

این فرایند از شما می‌خواهد دستگاه سخت‌افزاری را لمس کنید. خروجی شامل کلید عمومی (id_ed25519_sk.pub) و یک private key handle است که اشاره‌گری به کلید ذخیره‌شده روی دستگاه است.

کلید عمومی را همانند کلیدهای استاندارد به ~/.ssh/authorized_keys روی سرور منتقل کنید. هنگام اتصال از شما خواسته می‌شود دستگاه را لمس کنید تا جلسه احراز شود.

محدودسازی استفاده از کلیدها (options در authorized_keys)

می‌توانید محدودیت‌های دقیقی را برای هر کلید با افزودن گزینه‌ها در ابتدای خط مربوط به آن در فایل ~/.ssh/authorized_keys اعمال کنید. قالب کلی:

options public-key-string

گزینه‌های کاربردی شامل:

  • command="..." — اجرای یک دستور خاص هنگام استفاده از کلید
  • from="ip,ip" — محدود کردن استفاده به آدرس‌های IP مشخص
  • no-pty, no-agent-forwarding, no-X11-forwarding — غیرفعال‌سازی ویژگی‌های خاص SSH

نمونه عملی: فرض کنید کلیدی برای یک اسکریپت پشتیبان‌گیری خودکار استفاده می‌شود و تنها باید از آدرس 198.51.100.5 قابل استفاده باشد:

from="198.51.100.5" command="/usr/local/bin/backup.sh",no-pty,no-agent-forwarding,no-X11-forwarding ssh-ed25519 AAAA...

این تنظیمات تضمین می‌کنند که کلید تنها برای اجرای دستور پشتیبان از آن IP خاص مجاز باشد و سایر قابلیت‌های SSH غیرفعال شده‌اند.

Agent Forwarding

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

مثال معمول: اتصال از ماشین محلی (A) به یک bastion یا jump host (B) و از آنجا اتصال به سرور داخلی (C). با فعال‌سازی agent forwarding، می‌توانید از کلید روی A برای ورود به C استفاده کنید.

برای فعال‌سازی موقت:

ssh -A user@bastion-host

سپس از داخل bastion-host به سرور داخلی متصل شوید و عامل محلی احراز هویت را انجام می‌دهد:

ssh internal-server

ملاحظات امنیتی: اگر سرور میانی (bastion-host) تحت کنترل مهاجم قرار گیرد و او دسترسی root داشته باشد، می‌تواند socket عامل شما را ربوده و به‌مدت session فعال از امتیازهای کلید استفاده کند. فقط به سرورهایی که کاملاً به آن‌ها اعتماد دارید agent forwarding را اعمال کنید. جایگزین امن‌تر و مدرن‌تر استفاده از ProxyJump در ~/.ssh/config است.

تونلینگ SSH (Port Forwarding)

تونلینگ SSH یا port forwarding کانالی رمزنگاری‌شده برای هدایت ترافیک شبکه بین ماشین محلی و سرور راه دور ایجاد می‌کند. کاربردی برای دسترسی به سرویس‌هایی که مستقیماً در اینترنت قرار ندارند یا رمزنگاری ترافیک برنامه‌های قدیمی.

Local Port Forwarding (-L)

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

مثال: دسترسی به دیتابیس روی سرور راه دور که فقط از localhost قابل اتصال است.

ssh -L 8888:localhost:3306 user@remote_server

حالا می‌توانید کلاینت دیتابیس محلی را به localhost:8888 متصل کنید و ترافیک به شکل امن به پورت 3306 روی سرور راه دور هدایت می‌شود.

Remote Port Forwarding (-R)

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

ssh -R 9999:localhost:3000 user@remote_server

همکار شما می‌تواند به http://remote_server:9999 دسترسی یابد و درخواست‌ها به سرویس محلی شما در پورت 3000 منتقل می‌شود. مراقب باشید زیرا ممکن است سرویس‌های محلی را به شبکه راه دور در معرض بگذارید.

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

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

هر دو کلاینت و سرویس sshd بررسی‌های سختگیرانه‌ای بر مجوز فایل‌ها اعمال می‌کنند. مجوزهای نادرست یکی از متداول‌ترین دلایل عدم احراز هویت هستند.

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

  • ~/.ssh — 700
  • ~/.ssh/authorized_keys — 600
  • ~/.ssh/id_ed25519 (کلید خصوصی) — 600
  • ~/.ssh/id_ed25519.pub (کلید عمومی) — 644

برای اعمال:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub

گردش کلید (Key Rotation)

گردش کلید به معنی بازنشانی دوره‌ای کلیدهای SSH و جایگزینی آن‌ها با کلیدهای جدید است تا دامنه آسیب در صورت افشای کلید کاهش یابد. سیاست گردش به حساسیت زیرساخت شما بستگی دارد—مثلاً سالی یک‌بار یا برای زیرساخت‌های حساس‌تر هر سه‌ماهه.

فرآیند معمول گردش:

  1. تولید کلید جدید
  2. استقرار کلید جدید در سرورها (بدون حذف قدیمی)
  3. تأیید عملکرد کلید جدید
  4. حذف کلید قدیمی از authorized_keys

پشتیبان‌گیری از کلید

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

رفع اشکال رایج

با اینکه تنظیم SSH ساده به نظر می‌رسد، اغلب مشکلاتی رخ می‌دهد. اغلب خطاها در مجوزها، اتصال شبکه یا ناسازگاری کلید هستند.

خطای Permissions are too open

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

Permissions 0644 for '/home/user/.ssh/id_ed25519' are too open.

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

chmod 600 ~/.ssh/id_ed25519
chmod 700 ~/.ssh

در سرور هم:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Connection refused / Connection timed out

این خطاها معمولاً شبکه‌ای یا مربوط به سرویس SSH هستند.

  • فایروال پورت را مسدود کرده است—برای مثال در اوبونتو UFW را بررسی کنید و پورت SSH (پیش‌فرض 22) را مجاز کنید.
  • سرویس sshd در سرور فعال نیست—وضعیت را چک کنید:
    sudo systemctl status ssh

    اگر غیرفعال است، آن را راه‌اندازی یا ریستارت کنید:

    sudo systemctl start ssh
    sudo systemctl restart ssh
  • آدرس IP یا پورت اشتباه است—در صورت استفاده از پورت غیرپیش‌فرض، پارامتر -p را اضافه کنید:
ssh -p 2222 user@remote_host

اشکالات کلید (Key Mismatch)

ممکن است کلید عمومی روی سرور با کلید خصوصی محلی مطابقت نداشته باشد. مطمئن شوید محتوای کامل فایل .pub به‌صورت یک خط در authorized_keys قرار دارد.

استفاده از حالت verbose برای دیباگ

ابزار قدرتمند برای تشخیص هر خطای اتصال، خروجی وِربُز SSH است:

ssh -v user@remote_host

با افزایش سطح verbosity به -vv یا -vvv، جزئیات بیشتری نمایش داده می‌شود و معمولاً نقطه‌ی دقیق شکست احراز هویت را نشان می‌دهد.

کاربردهای SSH در پردازش ابری و یادگیری ماشین

SSH تنها یک ابزار خط فرمان برای لاگین نیست؛ برای حرفه‌ای‌های AI و ML پایه‌ای برای گردش‌کارهای ایمن و خودکار است. چه Jupyter Notebook را روی یک سرور GPU-enabled اجرا کنید، چه یک pipeline آموزش مدل را اتوماسیون کنید یا یک AI agent را برای مدیریت زیرساخت تعیین کنید، SSH ستون فقرات امن این فعالیت‌هاست.

کار توسعه AI اغلب به توان محاسباتی بالاتری نسبت به لپ‌تاپ محلی نیاز دارد. اجرا کردن محیط‌های توسعه مانند Jupyter یا VS Code روی سرورهای قدرتمند و دسترسی امن به این ابزارها چالش‌برانگیز است. تونلینگ SSH این کار را ممکن می‌کند—پورت محلی شما را به پورت سرور راه دور متصل می‌کند تا سرویس راه دور مانند اینکه محلی اجرا می‌شود در دسترس قرار گیرد.

مثال: دسترسی امن به Jupyter

فرض کنید Jupyter Notebook روی سرور راه دور روی پورت 8888 اجرا می‌شود. برای ایجاد تونل محلی:

ssh -L 8888:localhost:8888 user@remote_server

سپس در مرورگر محلی به http://localhost:8888 مراجعه کنید؛ تونل SSH درخواست‌ها را به Jupyter روی سرور راه دور منتقل می‌کند. همچنان برای اولین ورود نیاز به توکن Jupyter دارید.

VS Code Remote – SSH

افزونه Remote – SSH در VS Code اتصال امن را خودکار می‌کند و تجربه IDE را روی سرور فراهم می‌آورد. برای برنامه‌های وب مانند Jupyter یا Streamlit که به‌صورت جداگانه اجرا می‌شوند، از قابلیت Port Forwarding در VS Code برای منتقل کردن پورت‌ها استفاده کنید که معادل فلگ -L در کلاینت خط فرمان است.

اتوماسیون گردش‌کارهای AI با SSH

برای تکرارپذیری و کارایی در ML، اسکریپت‌نویسی pipeline از انتقال داده تا آموزش مدل و بازیابی نتایج ضروری است. سه مرحله اصلی که می‌توان با SSH اسکریپت کرد:

  1. آپلود کد و داده: برای فایل منفرد scp مناسب است، اما برای همگام‌سازی پوشه‌ها rsync ترجیح داده می‌شود:
    rsync -avz --progress ./local_dir/ user@remote_server:/path/to/remote_dir

    برای داده‌های بزرگتر ابزارهایی مانند Rclone یا DVC پیشنهاد می‌شوند.

  2. راه‌اندازی آموزش یا inference: می‌توانید یک اسکریپت را بدون باز کردن شل تعاملی اجرا کنید:
    ssh user@remote_server "python3 /path/to/train.py"
  3. دانلود نتایج: پس از اتمام کار از scp یا rsync برای گرفتن خروجی‌ها استفاده کنید:
    scp user@remote_server:/path/to/model.pt ./model.pt

عامل‌های هوش مصنوعی و SSH

یکی از کاربردهای پیشرفته SSH به عامل‌های AI امکان تعامل با زیرساخت راه دور را می‌دهد. عامل‌های خودگردان که با فریم‌ورک‌هایی مثل LangChain یا AutoGPT ساخته می‌شوند می‌توانند به‌عنوان ابزاری که از طریق SSH کار می‌کند، وظایف مدیریت زیرساخت را اجرا کنند. با این حال در محیط تولیدی معمولاً عامل‌ها به APIهای سطح بالاتر (مثل Kubernetes API، SDKهای ارائه‌دهنده ابر یا job schedulerها) دسترسی دارند تا امنیت و قابلیت ممیزی بهتر حفظ شود.

نمونه کارها:

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

ملاحظات امنیتی: هرگز عامل AI را با دسترسی root تجهیز نکنید. اصل حداقل امتیاز را رعایت کنید، بررسی‌های دستی و سیاست‌های بازگردانی و ممیزی را پیاده کنید.

خلاصه و گام‌های بعدی

شما اکنون نحوه پیکربندی احراز هویت مبتنی بر کلید SSH روی سرور اوبونتو را یاد گرفته‌اید. با تولید یک جفت کلید امن و غیرفعال‌سازی ورود با رمز، امنیت سرور در برابر حملات brute-force به‌طور قابل‌توجهی افزایش می‌یابد و دسترسی بدون رمز برای مدیریت و اتوماسیون فراهم می‌شود. این دسترسی مبتنی بر کلید یک مهارت پایه‌ای برای مدیریت سیستم‌ها و اتوماسیون امن است.

برای گسترش دانش خود، به ویژگی‌های پیشرفته مانند فایل پیکربندی ~/.ssh/config برای مدیریت چند اتصال یا ssh-agent برای نگهداری passphraseها بپردازید.

از همراهی شما با ParminCloud سپاسگزاریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

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

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