چرا فایروال مهمترین خط دفاعی سرور شماست؟
وقتی یک سرور را برای اولین بار بالا میآورید، بهطور پیشفرض همه پورتها در حالت گوش دادن (listening) هستند. این یعنی هر کسی در اینترنت میتواند به سرویسهای شما متصل شود؛ مگر اینکه خودتان جلویش را بگیرید. اینجاست که فایروال وارد بازی میشود. فایروال نه یک ابزار لوکس، بلکه ضرورت اولیه هر سروری است که به اینترنت متصل است. بدون آن، سرور شما مثل خانهای است که درِ ورودی دارد اما قفل ندارد.
در این مقاله قرار نیست تئوریهای انتزاعی بخوانید. قرار است یاد بگیرید چطور با فایروال پورتهای ضروری را باز کنید، بقیه را ببندید و مهمتر از همه، خودتان را در سرور قفل نکنید. این آخرین مورد، یعنی خطای قفلشدن، یکی از رایجترین اشتباهاتی است که مدیران تازهکار (و حتی باتجربه!) مرتکب میشوند.
اصل کمترین دسترسی؛ نقطه شروع هر قاعده فایروال
قبل از اینکه حتی یک دستور اجرا کنید، باید یک اصل را بپذیرید: هر چیزی که لازم نیست، باید بسته باشد. این یعنی بهجای اینکه فکر کنید «کدام پورتها را باز کنم؟»، باید فکر کنید «کدام پورتها را مجبورم باز کنم؟». این طرز فکر، همان اصل کمترین دسترسی (Principle of Least Privilege) است که در امنیت شبکه بنیادی محسوب میشود.
برای یک سرور وب معمولی، حداقل پورتهای ضروری معمولاً اینها هستند:
- پورت 22 (SSH) برای مدیریت سرور
- پورت 80 (HTTP) برای ترافیک وب
- پورت 443 (HTTPS) برای ترافیک رمزنگاریشده
- پورت 53 (DNS) فقط اگر سرور شما DNS سرویس میدهد
- پورت 25 (SMTP) فقط اگر سرور ایمیل ارسال میکند
بقیه پورتها، از 3306 برای MySQL تا 5432 برای PostgreSQL و 6379 برای Redis، باید فقط برای آدرسهای IP مشخص باز شوند، نه برای کل اینترنت. اگر دیتابیس و وبسرور روی یک ماشین هستند، حتی نیازی به باز کردن پورت دیتابیس به بیرون ندارید؛ اتصال از طریق localhost کافی است.
قبل از شروع؛ شناسایی پورتهای باز فعلی
اولین قدم، دیدن وضعیت فعلی است. با این دستور میتوانید ببینید چه پورتهایی در حال گوش دادن هستند:
ss -tulpn
خروجی این دستور لیستی از پورتهای TCP و UDP بههمراه پروسهای که روی آن گوش میدهد نشان میدهد. اگر سرویسهای ناشناختهای میبینید، وقت آن است که تحقیق کنید چرا روی سرور شما در حال اجرا هستند. این کار را قبل از هر تغییری انجام دهید تا تصویر دقیقی از سطح حمله فعلی داشته باشید.
پیادهسازی عملی فایروال با UFW
اگر سرور شما اوبونتو یا دبیان است، UFW (مخفف Uncomplicated Firewall) سادهترین و امنترین راه برای مدیریت قواعد فایروال است. UFW در واقع یک رابط کاربری برای iptables است که پیچیدگیهای آن را پنهان میکند.
اول، UFW را نصب و فعال کنید:
sudo apt update
sudo apt install ufw -y
sudo ufw enable
حالا قاعده پیشفرض را روی deny بگذارید تا هر اتصال ورودی که صریحاً اجازه نگرفته، رد شود:
sudo ufw default deny incoming
sudo ufw default allow outgoing
این دو خط، قلب اصل کمترین دسترسی هستند. ورودیها بسته، خروجیها باز. حالا پورتهای ضروری را باز کنید:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
اگر میخواهید SSH فقط از یک IP خاص در دسترس باشد (که شدیداً توصیه میشود)، بهجای خط اول بنویسید:
sudo ufw allow from 203.0.113.10 to any port 22 proto tcp
در این مثال، 203.0.113.10 را با آدرس IP واقعی خودتان جایگزین کنید. این کار سطح حمله SSH را از کل اینترنت به یک آدرس واحد کاهش میدهد.
بررسی وضعیت فایروال
بعد از اعمال قواعد، وضعیت را بررسی کنید:
sudo ufw status verbose
خروجی باید چیزی شبیه این باشد:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN 203.0.113.10
80/tcp ALLOW IN Anywhere
443/tcp ALLOW IN Anywhere
اگر قاعدهای را اشتباه وارد کردید، با sudo ufw delete allow 80/tcp حذفش کنید.
مدیریت فایروال با iptables برای سناریوهای پیشرفته
UFW برای ۹۰٪ موارد کافی است، اما اگر نیاز به قواعد پیچیدهتر دارید — مثل محدود کردن نرخ اتصال یا فوروارد پورت — باید مستقیم با iptables کار کنید. iptables زنجیرههای INPUT، OUTPUT و FORWARD را مدیریت میکند.
مثال ساده: بستن پورت 3306 (MySQL) برای همه بهجز یک IP خاص:
sudo iptables -A INPUT -p tcp --dport 3306 -s 198.51.100.20 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP
ترتیب قواعد در iptables حیاتی است. قاعده اول که اجازه میدهد، باید قبل از قاعده دوم که رد میکند بیاید. iptables قواعد را به ترتیب بررسی میکند و اولین قاعده منطبق، اجرا میشود.
برای محدود کردن نرخ اتصال به SSH (جلوگیری از brute force):
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
این قواعد اجازه میدهند در هر ۶۰ ثانیه حداکثر ۳ اتصال جدید به SSH برقرار شود. اتصال چهارم در همان بازه زمانی، بیصدا حذف میشود.
ذخیرهسازی قواعد iptables
نکته مهم: قواعد iptables با ریبوت سرور از بین میروند. برای ذخیرهسازی دائمی، بسته به توزیع لینوکس، از یکی از این روشها استفاده کنید:
# در اوبونتو و دبیان
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
# در CentOS و RHEL
sudo yum install iptables-services -y
sudo systemctl enable iptables
sudo service iptables save
خطای قفلشدن از سرور؛ چطور رخ میدهد و چطور نجات پیدا کنید
معروفترین سناریوی ترسناک برای هر مدیر سروری این است: یک قاعده فایروال را اعمال میکنید و بلافاصله اتصال SSH شما قطع میشود. دیگر هیچ راهی برای برگشتن ندارید. این اتفاق معمولاً به یکی از این دو دلیل رخ میدهد:
- قاعده پیشفرض را روی deny گذاشتهاید اما پورت 22 را باز نکردهاید.
- پورت 22 را باز کردهاید اما فقط برای یک IP اشتباه (مثلاً IP آفیس بهجای IP خانه).
راه نجات اول: اگر به سرور از طریق کنسول وب (مثل VNC یا noVNC در پنل مدیریت) دسترسی دارید، از آنجا وارد شوید و قاعده اشتباه را حذف کنید. این کار را با sudo ufw delete deny 22/tcp یا sudo iptables -D INPUT -p tcp --dport 22 -j DROP انجام دهید.
راه نجات دوم: اگر کنسول ندارید، از پنل مدیریت سرور، گزینه «دسترسی به سرور» یا «rescue mode» را فعال کنید. در این حالت، سرور با یک سیستمعامل موقت بالا میآید و شما میتوانید دیسک اصلی را mount کرده و قواعد فایروال را از فایل پیکربندی حذف کنید.
نکته پیشگیرانه: قبل از اعمال هر قاعده جدید، یک تایمر برای خودتان بگذارید:
sudo shutdown -r +5
این دستور سرور را ۵ دقیقه دیگر ریبوت میکند. اگر قاعده اشتباه بود و اتصال قطع شد، صبر کنید تا سرور ریبوت شود و قواعد موقت (که ذخیره نشدهاند) از بین بروند. بعد از اطمینان از درستی قواعد، با sudo shutdown -c ریبوت را لغو کنید.
یک اشتباه رایج دیگر: باز کردن پورت دیتابیس به کل اینترنت
خیلی از توسعهدهندهها برای اینکه از خانه به دیتابیس وصل شوند، پورت 3306 یا 5432 را برای همه باز میکنند. این کار تقریباً همیشه به یک فاجعه امنیتی ختم میشود. رباتها مدام در حال اسکن این پورتها هستند و اگر دیتابیس شما رمز ضعیف داشته باشد، در کمتر از ۲۴ ساعت هک میشود.
راه درست: یا از SSH Tunnel استفاده کنید، یا پورت را فقط برای IP خودتان باز کنید. SSH Tunnel به این شکل کار میکند:
ssh -L 3306:localhost:3306 user@your-server-ip
این دستور پورت 3306 روی ماشین محلی شما را به پورت 3306 روی سرور (از طریق SSH) متصل میکند. حالا میتوانید با localhost:3306 به دیتابیس وصل شوید، بدون اینکه حتی یک پورت اضافی روی فایروال باز کنید.
تست نهایی و پایش مستمر فایروال
بعد از اعمال قواعد، حتماً از بیرون سرور تست کنید. از یک ماشین دیگر (یا گوشی موبایل با اینترنت همراه) این دستور را اجرا کنید:
nc -zv your-server-ip 22
nc -zv your-server-ip 3306
اولی باید موفق باشد، دومی باید با خطای Connection refused یا timeout مواجه شود. اگر پورت 3306 از بیرون جواب داد، یعنی قاعدهتان درست کار نکرده است.
پایش مستمر هم مهم است. لاگهای فایروال را بررسی کنید تا ببینید چه کسی به پورتهای بسته دسترسی میگیرد. در UFW، لاگها در /var/log/ufw.log هستند. تعداد زیاد تلاشهای ناموفق به یک پورت خاص، نشانه اسکن یا حمله است.
در نهایت، بهخاطر داشته باشید که فایروال فقط یک لایه از امنیت است. آن را با SSH Key بهجای رمز عبور، بهروزرسانی منظم سیستمعامل و مانیتورینگ منابع ترکیب کنید. اگر به دنبال زیرساختی هستید که این اصول در آن بهصورت پیشفرض رعایت شده باشد، سرویسهای ابری سرورنت میتوانند نقطه شروع مناسبی باشند؛ اما صرفنظر از انتخابتان، قواعد فایروال را جدی بگیرید. این سادهترین و مؤثرترین کاری است که برای امنیت سرورتان میتوانید انجام دهید.
دیدگاهها ۰
هنوز دیدگاهی ثبت نشده؛ اولین نفر باشید!