آموزش تنظیم UFW firewall در VPS
یاد بگیرید چگونه با UFW در VPS خود فایروال تنظیم کنید و با دستورات ساده، پورتهای مورد نیاز را باز کنید بدون اینکه دسترسی SSH خود را از دست بدهید.
UFW چیست و چرا به آن نیاز دارید
UFW مخفف Uncomplicated Firewall است و نام آن کاملاً صادقانه انتخاب شده است. این ابزار یک رابط کاربری ساده برای فایروال موجود در هسته (kernel) لینوکس است؛ بنابراین به جای نوشتن قوانین پیچیده، دستورات کوتاهی مانند ufw allow 22/tcp را تایپ میکنید. در یک VPS تازه، تمام سرویسهای در حال شنود (listening) به صورت پیشفرض از طریق اینترنت قابل دسترسی هستند. یک فایروال وضعیت را تغییر میدهد: شما ابتدا همه چیز را مسدود میکنید و سپس فقط پورتهای معدودی را که واقعاً استفاده میکنید، مجاز میکنید. با انجام همین یک تغییر و تنها با حدود 4 دستور، بیشتر نقاط آسیبپذیر شما از بین میرود.
قبل از هر اقدامی، بدانید چه سرویسی در حال شنود است، زیرا فایروال بر سرنوشت همین سرویسها تصمیم میگیرد. خواندن وضعیت سرویسهای در حال شنود با استفاده از ss -tlnp، اولین قدم صحیح است.
تنها قانونی که مانع از دسترسی مجدد شما میشود
این اشتباهی است که باعث ترس کاربران از استفاده از فایروال میشود. شما UFW را با سیاست default-deny فعال میکنید، اما هرگز اجازه دسترسی به SSH را صادر نکردهاید؛ در این صورت به محض فعال شدن فایروال، اتصال شما قطع شده و امکان بازگشت نخواهید داشت. برای جلوگیری از این مشکل، همیشه قبل از فعالسازی UFW، اجازه دسترسی به SSH را صادر کنید. کل ترفند همین است و مراحل زیر این کار را با ترتیب ایمن انجام میدهند.
اگر این اتفاق برای شما افتاد، راه حل وجود دارد: کنسول وب ارائهدهنده شما، از طریق VNC یا serial، از طریق SSH کار نمیکند، بنابراین میتوانید از آن طریق وارد شوید و دستور ufw disable را اجرا کنید یا قانون (rule) فراموش شده را اضافه کنید.
Step 1: Set the default policies
Start by telling UFW to deny everything coming in and allow everything going out:
sudo ufw default deny incoming
sudo ufw default allow outgoingdeny incoming is the important half. It means any port with no explicit allow rule is closed to the outside, even if a service is listening on it. allow outgoing lets your server reach the internet normally for updates and the like. These two commands change policy only; nothing is enforced until you enable UFW in step 3.
Step 2: پورتهای مورد نیاز خود را مجاز کنید
پیش از فعالسازی، پورت SSH را باز کنید تا اتصال خود را حفظ کنید:
sudo ufw allow 22/tcpUFW میتواند برای SSH محدودیت نرخ (rate-limit) اعمال کند: sudo ufw limit 22/tcp اجازه دسترسی به پورت را میدهد اما هر آدرسی که 6 اتصال یا بیشتر در 30 ثانیه ایجاد کند را مسدود میکند؛ این کار بدون نیاز به نرمافزار اضافی، اثر اسکریپتهای brute-force را کاهش میدهد.
اگر وبسرور اجرا میکنید، HTTP و HTTPS را نیز مجاز کنید:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcpفقط مواردی را مجاز کنید که قرار است در دسترس عموم قرار گیرند. دیتابیسی مانند Postgres روی پورت 5432 تقریباً هرگز نباید قانون allow داشته باشد. در عوض، آن را به 127.0.0.1 bind کنید تا فقط از طریق خودِ ماشین قابل دسترسی باشد. هر پورت باز شده، دری است که اکنون باید از آن دفاع کنید، بنابراین لیست را کوتاه نگه دارید.
همچنین میتوانید توالی کامل دستورات ufw را برای سرور خود در اینجا بسازید و سپس آنها را به ترتیب اجرا کنید:
Step 3: Enable, and confirm it is on
sudo ufw enableاین دستور هشدار میدهد که ممکن است باعث قطع شدن اتصالات SSH فعلی شود. از آنجایی که در مرحله 2 اجازه دسترسی 22/tcp را دادهاید، نشست (session) شما پابرجا میماند. نتیجه را تأیید کنید:
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 به این معناست که فایروال در حال اجرا است. همچنین هر قانون (rule) دو بار نمایش داده میشود؛ یک بار به صورت ساده و یک بار همراه با (v6)، که نشان میدهد UFW هم IPv4 و هم IPv6 را پوشش میدهد. اگر خطوط (v6) وجود نداشته باشند، بخش IPv6 شما مدیریت نمیشود؛ این موضوع مشکلی است که در the IPv6 firewall post به آن پرداخته شده است.
مدیریت بعدی قوانین
برای مشاهده قوانین به همراه شماره آنها جهت حذف یک مورد:
sudo ufw status numbered
sudo ufw delete 3برای محدود کردن دسترسی به یک پورت فقط برای یک آدرس خاص (روشی مناسب برای در دسترس قرار دادن یک سرویس مدیریت برای IP خودتان):
sudo ufw allow from 10.0.0.24 to any port 5432 proto tcpدیواره آتش (firewall) تنها یک لایه است. این ابزار کنترل میکند چه چیزی میتواند به یک پورت دسترسی داشته باشد، اما مانع از حملات تکرارشونده (hammering) به پورتی که باز گذاشتهاید، مانند SSH، نمیشود. برای این منظور، از Fail2ban در مقابل SSH برای مسدود کردن مهاجمان تکراری استفاده کنید. مفهوم Defence in depth یعنی هر لایه، آنچه را که لایههای دیگر پوشش نمیدهند، پوشش دهد.
استفاده از دیوار آتش تنها زمانی منطقی است که بدانید پورتها چه هستند و سرویسها چگونه گوش میدهند، و پیکربندی آن بخشی از 10 دقیقه اول در یک VPS جدید است.
FAQ
آیا فعالسازی UFW باعث قطع شدن نشست SSH من میشود؟
اگر ابتدا SSH را مجاز کنید، خیر. دستور sudo ufw allow 22/tcp را قبل از sudo ufw enable اجرا کنید؛ در این صورت اتصال شما برقرار میماند زیرا فایروال اکنون اجازه دسترسی به port 22 را میدهد. خطر اصلی، فعال کردن یک فایروال با سیاست default-deny (رد کردن پیشفرض) بدون داشتن یک rule برای SSH است که باعث قطع دسترسی شما میشود. اگر این اتفاق افتاد، از طریق VNC یا کنسول سریال ارائهدهنده خود وارد شوید و دستور ufw disable را اجرا کنید.
چه پورتهایی را باید در یک VPS باز کنم؟
فقط پورتهایی که برای عموم سرویسدهی میکنند. SSH (22/tcp) برای مدیریت سرور، و HTTP و HTTPS (80/tcp, 443/tcp) در صورتی که وبسایت اجرا میکنید. سایر موارد را در حالت deny باقی بگذارید. سرویسهای داخلی مانند پایگاههای داده باید به 127.0.0.1 bind شوند و هیچ rule فایروالی نداشته باشند تا از طریق شبکه قابل دسترسی نباشند.
آیا UFW از IPv6 پشتیبانی میکند؟
در نسخههای مدرن Ubuntu، بله: مقدار IPV6=yes در /etc/default/ufw تنظیم شده است، بنابراین هر rule برای هر دو پروتکل اعمال میشود و دستور ufw status قوانین IPv6 را با پسوند (v6) نمایش میدهد. روشهای بروز خطا در این مورد در تله فایروال IPv6 بررسی شدهاند.
چگونه یک rule در UFW را حذف کنم؟
ابتدا دستور sudo ufw status numbered را برای لیست کردن قوانین به همراه شماره index اجرا کنید، سپس دستور sudo ufw delete N را اجرا کنید که در آن N شماره قانونی است که میخواهید حذف شود. همچنین میتوانید با استفاده از مشخصات، مانند sudo ufw delete allow 80/tcp، آن را حذف کنید.
چگونه یک پورت را فقط برای یک IP مشخص مجاز کنم؟
به جای یک rule سادهی allow، از یک rule با from استفاده کنید. برای اینکه فقط آدرس دفتر کار شما به PostgreSQL دسترسی داشته باشد، دستور sudo ufw allow from 10.0.0.10 to any port 5432 proto tcp را اجرا کنید. در سیاست default-deny، پورت برای همه بسته است تا زمانی که یک rule آن را باز کند؛ بنابراین این rule from تنها راه ورود است: کل اینترنت مسدود میماند و فقط آدرسی که مشخص کردهاید اجازه عبور دارد. یک rule سادهی allow 5432/tcp اضافه نکنید، زیرا پورت را برای همه باز میکند. این امنترین روش برای در معرض قرار دادن یک database یا پنل مدیریت است. با دستور sudo ufw status verbose که آدرس منبع را در کنار پورت نشان میدهد، وضعیت را تایید کنید.