آموزش UFW برای امنسازی فایروال VPS
با UFW روی VPS سیاست پیشفرض deny را تنظیم کنید، فقط portهای لازم را باز بگذارید و پیش از فعالسازی، SSH را مجاز کنید تا دسترسیتان قطع نشود.
UFW چیست و چرا به آن نیاز دارید
UFW مخفف Uncomplicated Firewall است و نام آن بهخوبی گویای ماهیت آن است. این ابزار یک رابط کاربری ساده برای فایروالی است که هسته لینوکس بهصورت پیشفرض دارد؛ بنابراین بهجای نوشتن قوانین پیچیده، دستورات کوتاهی مانند ufw allow 22/tcp را وارد میکنید. در یک VPS تازه، هر سرویسی که در حال گوشدادن (listening) باشد، بهصورت پیشفرض از اینترنت در دسترس است. فایروال این وضعیت را تغییر میدهد: شما همه چیز را مسدود (deny) میکنید و سپس تنها پورتهایی را که واقعاً استفاده میکنید، مجاز (allow) میسازید. همین یک تغییر، بخش بزرگی از سطح دسترسی غیرمجاز را تنها با حدود 4 دستور حذف میکند. UFW ابزار استاندارد در Ubuntu و Debian است؛ بنابراین اگر VPS شما از Rocky یا AlmaLinux استفاده میکند، باید از firewalld استفاده کنید که قوانین را در قالب زونها (zones) سازماندهی میکند.
پیش از هر تغییری، بررسی کنید چه سرویسهایی در حال گوشدادن هستند، زیرا فایروال سرنوشت همین سرویسها را تعیین میکند. مشاهده سرویسهای در حال گوشدادن با استفاده از ss -tlnp اولین گام درست است.
قانونی که مانع از قفلشدن دسترسی شما میشود
این همان اشتباهی است که باعث ترس کاربران از فایروال میشود. شما UFW را با سیاست پیشفرض deny فعال میکنید، اما SSH را مجاز نکردهاید؛ در نتیجه به محض فعالشدن فایروال، اتصال خودتان قطع میشود و دیگر نمیتوانید وارد شوید. برای جلوگیری از این اتفاق، همیشه پیش از فعالکردن UFW، دسترسی SSH را مجاز کنید. این تمام نکته کار است و مراحل زیر این کار را با ترتیب ایمن انجام میدهند.
اگر به هر دلیلی این اتفاق برای شما افتاد، نگران نباشید: کنسول وب ارائهدهنده سرور شما (از طریق VNC یا سریال) از مسیر SSH عبور نمیکند؛ بنابراین میتوانید از آن طریق وارد شوید و دستور ufw disable را اجرا کنید یا قانون فراموششده را اضافه کنید. قفلشدن توسط فایروال یک نشانه مشخص دارد: اگر بسته (packet) توسط فایروال drop شود، کلاینت SSH شما تا زمان timeout منتظر میماند، اما اگر سرویس SSH متوقف شده باشد، اتصال بلافاصله رد میشود؛ این همان تفاوت بین connection refused و connection timed out است.
گام 1: تنظیم سیاستهای پیشفرض
ابتدا به UFW بگویید همه اتصالات ورودی را رد کند و همه اتصالات خروجی را مجاز بداند:
sudo ufw default deny incoming
sudo ufw default allow outgoingdeny incoming بخش مهم این تنظیم است. این گزینه یعنی هر پورتی که قانون صریحی برای مجاز بودن آن وجود نداشته باشد، از خارج بسته است؛ حتی اگر سرویسی روی آن در حال گوش دادن باشد. allow outgoing به سرور اجازه میدهد برای دریافت بهروزرسانیها و موارد مشابه، بهطور معمول به اینترنت دسترسی داشته باشد. این دو فرمان فقط سیاستها را تغییر میدهند؛ تا زمانی که UFW را در گام 3 فعال نکنید، هیچ قانونی اعمال نمیشود.
گام 2: پورتهایی را که واقعاً نیاز دارید مجاز کنید
پیش از فعالسازی، دسترسی SSH را باز کنید تا اتصال شما حفظ شود:
sudo ufw allow 22/tcpUFW میتواند برای SSH محدودسازی نرخ را نیز انجام دهد: sudo ufw limit 22/tcp پورت را مجاز میکند، اما هر نشانی را که در مدت سی ثانیه شش اتصال یا بیشتر ایجاد کند، مسدود میکند. این کار بدون نیاز به نرمافزار اضافی، اثر اسکریپتهای brute-force را کاهش میدهد.
اگر وبسرور اجرا میکنید، HTTP و HTTPS را نیز مجاز کنید:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcpفقط سرویسهایی را مجاز کنید که بهصورت عمومی ارائه میدهید. پایگاه دادهای مانند Postgres روی پورت 5432 تقریباً هرگز نباید قانون allow داشته باشد. آن را به 127.0.0.1 متصل کنید تا فقط روی همان ماشین قابل دسترسی باشد. هر پورتی که باز میکنید، نیازمند حفاظت است؛ بنابراین فهرست پورتها را کوتاه نگه دارید.
همچنین میتوانید توالی کامل فرمانهای ufw را برای سرور خود در اینجا ایجاد کنید و سپس آنها را بهترتیب اجرا کنید:
گام 3: فعالسازی و تأیید فعال بودن آن
sudo ufw enableاین فرمان هشدار میدهد که ممکن است اتصالهای SSH موجود را مختل کند. چون در گام 2، 22/tcp را مجاز کردید، نشست شما برقرار میماند. نتیجه را تأیید کنید:
sudo ufw status verboseStatus: active
Default: deny (incoming), allow (outgoing)
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)
80/tcp ALLOW IN Anywhereدر اینجا دو مورد را بررسی کنید. Status: active نشان میدهد که firewall در حال اجرا است. همچنین هر قانون دو بار نمایش داده میشود؛ یک بار بهصورت ساده و یک بار همراه با (v6). این مورد نشان میدهد که UFW علاوه بر IPv4، IPv6 را نیز پوشش میدهد. اگر خطوط (v6) وجود نداشته باشند، بخش IPv6 شما مدیریت نمیشود؛ این مسئله خود یک دام جداگانه است که در مقاله firewall برای IPv6 پوشش داده شده است.
مدیریت قوانین در آینده
برای مشاهده قوانین همراه با شماره آنها جهت حذف یک قانون خاص:
sudo ufw status numbered
sudo ufw delete 3برای مجاز کردن یک پورت تنها از یک آدرس IP خاص، که روشی مناسب برای در دسترس قرار دادن یک سرویس مدیریتی فقط برای IP خودتان است:
sudo ufw allow from 10.0.0.24 to any port 5432 proto tcpاین رویکرد زمانی که آدرس IP شما تغییر کند یا چندین دستگاه نیاز به دسترسی داشته باشند، کارایی خود را از دست میدهد. راهکار معمول این است که پورت را بهطور عمومی باز نگذارید و به جای آن از طریق یک شبکه خصوصی به سرویس متصل شوید؛ این همان کاری است که معرفی زیرشبکه خصوصی سرور به tailnet برای آن انجام میشود.
فایروال تنها یک لایه امنیتی است. این ابزار کنترل میکند چه چیزی به یک پورت برسد، اما سرعت کسی که در حال تلاش برای نفوذ به یک پورت باز (مانند SSH) است را کاهش نمیدهد. برای این منظور، Fail2ban را در مقابل SSH قرار دهید تا متخلفان تکراری را مسدود کند. دفاع لایهبندیشده (Defence in depth) یعنی هر لایه، نقاط ضعف لایههای دیگر را پوشش دهد.
فایروال تنها زمانی معنا پیدا میکند که بدانید پورتها چیستند و سرویسها چگونه گوش میدهند، و پیکربندی آن یکی از مراحل 10 دقیقه اول در یک VPS جدید است.
FAQ
آیا فعالسازی UFW نشست SSH من را قطع میکند؟
اگر ابتدا دسترسی SSH را مجاز کنید، خیر. sudo ufw allow 22/tcp را پیش از sudo ufw enable اجرا کنید. اتصال شما برقرار میماند، زیرا فایروال اکنون پورت 22 را مجاز میکند. خطر زمانی ایجاد میشود که فایروال با سیاست پیشفرض deny را بدون قانون allow برای SSH فعال کنید؛ در این حالت دسترسی شما قطع میشود. اگر این اتفاق افتاد، از طریق VNC یا کنسول سریال ارائهدهنده خود وارد شوید و ufw disable را اجرا کنید.
چه پورتهایی را باید روی VPS باز کنم؟
فقط پورتهایی را باز کنید که بهصورت عمومی ارائه میکنید. برای مدیریت سرور، SSH (22/tcp) را باز کنید. اگر وبسایت اجرا میکنید، HTTP و HTTPS (80/tcp، 443/tcp) را نیز باز کنید. دسترسی به همه موارد دیگر را مسدود نگه دارید. سرویسهای داخلی مانند پایگاههای داده باید به 127.0.0.1 متصل شوند و اصلاً قانون فایروالی نداشته باشند تا هرگز از شبکه قابل دسترسی نباشند.
آیا UFW از IPv6 پشتیبانی میکند؟
در نسخههای جدید Ubuntu، بله. مقدار IPV6=yes در /etc/default/ufw تنظیم شده است. بنابراین هر قانون برای هر دو پشته اعمال میشود و ufw status قوانین IPv6 را با پسوند (v6) نشان میدهد. روشهایی که همچنان میتوانند باعث بروز مشکل شوند، در دام فایروال IPv6 توضیح داده شدهاند.
چگونه یک قانون UFW را حذف کنم؟
برای فهرستکردن قوانین همراه با شماره شاخص، sudo ufw status numbered را اجرا کنید. سپس sudo ufw delete N را اجرا کنید؛ در این دستور، N شماره قانونی است که میخواهید حذف شود. همچنین میتوانید قانون را بر اساس مشخصات آن حذف کنید؛ برای مثال، sudo ufw delete allow 80/tcp.
چگونه دسترسی به یک پورت را فقط از یک آدرس IP مجاز کنم؟
بهجای allow معمولی، از یک قانون from استفاده کنید. برای اینکه فقط آدرس دفتر شما بتواند به PostgreSQL دسترسی پیدا کند، sudo ufw allow from 10.0.0.10 to any port 5432 proto tcp را اجرا کنید. با سیاست پیشفرض deny، پورت برای همه بسته است تا زمانی که یک قانون آن را باز کند. بنابراین این قانون from تنها مسیر دسترسی است: کل اینترنت مسدود میماند و فقط آدرسی که مشخص کردهاید اجازه عبور دارد. allow 5432/tcp معمولی را نیز اضافه نکنید، زیرا پورت را برای همه باز میکند. این روش امنترین راه برای در معرض شبکه قرار دادن یک پایگاه داده یا پنل مدیریتی است. نتیجه را با sudo ufw status verbose بررسی کنید؛ این دستور آدرس مبدأ را در کنار پورت نشان میدهد.