آنچه در این مقاله میخوانید
چطور یک فایروال Iptables راهاندازی کنیم تا از ترافیک بین سرورها محافظت کنیم؟
۸ اردیبهشت ۱۴۰۴
استقرار اجزای مجزا در تنظیمات برنامه شما بر روی نودهای مختلف، یک روش رایج برای کاهش بار و شروع مقیاسگذاری افقی است. یک مثال معمول این است که پایگاه داده را روی یک سرور جداگانه از برنامه خود تنظیم کنید. با وجود اینکه این راهاندازی مزایای زیادی دارد، اتصال از طریق شبکه شامل مجموعه جدیدی از مسائل امنیتی میشود.
در این مقاله ما نحوه تنظیم یک فایروال روی هر یک از سرورهای شما در یک راهاندازی توزیعشده را نشان خواهیم داد. ما سیاست خود را به گونهای تنظیم میکنیم که ترافیک مورد نظر بین اجزای مختلف برنامه را مجاز کرده و سایر ترافیک ها را مسدود کنیم.
برای نمایش، از دو سرور Ubuntu 22.04 استفاده خواهیم کرد. یکی از این سرورها یک برنامه وب را با Nginx سرو میکند و دیگری با پایگاه داده MySQL را برای برنامه میزبانی خواهد کرد. اگرچه ما از این تنظیمات به عنوان مثال استفاده میکنیم، شما باید قادر باشید تکنیکهای موجود را برای مطابقت با نیازهای سرور خود به کار ببرید.
در ادامه خواهید خواند:
- پیش نیاز
- راه اندازی فایروال
- شناسایی پورتهای مورد استفاده توسط سرویسهایتان
- تنظیم قوانین فایروال برای وبسرور
- تنظیم قوانین فایروال برای سرور پایگاه داده
- جمع بندی
پیش نیاز
برای شروع به دو سرور تازه Ubuntu 22.04 نیاز خواهیم داشت. یک حساب کاربری معمولی با دسترسیهای sudo در هر یک از سرورها اضافه کنید. برای انجام این کار، راهنمای تنظیمات اولیه سرور Ubuntu 22.04 را دنبال کنید.
تنظیمات برنامهای که قصد داریم ایمن سازی کنیم، بر اساس این راهنما است. اگر میخواهید با آن مثال پیشبروید، سرورهای برنامه و پایگاه داده خود را مطابق با دستورالعمل آن آموزش راهاندازی کنید. در غیر این صورت میتوانید از این مقاله به عنوان یک مرجع عمومی استفاده کنید.

راه اندازی فایروال
شما با پیادهسازی یک پیکربندی پایه فایروال برای هر یک از سرورهای خود شروع خواهید کرد. سیاستی که ما پیادهسازی خواهد شد، رویکردی امنیتی محور دارد. تقریبا همه چیز به جز ترافیک SSH قفل خواهد شد و سپس حفرههایی در فایروال برای برنامه خاص خود باز خواهید کرد.
این مقاله از دستورالعملهای iptables
استفاده میکند. iptables
به صورت پیشفرض در Ubuntu 22.04 با استفاده از backend nftables
نصب میشود، بنابراین شما نیازی به نصب بستههای اضافی نخواهید داشت.
با استفاده از nano
یا ویرایشگر متن دلخواه خود، فایل /etc/iptables/rules.v4
را باز کنید.
sudo nano /etc/iptables/rules.v4
پیکربندی را از الگوی فایروال در راهنما کپی کرده و در فایل قرار دهید.
*filter
# Allow all outgoing, but drop incoming and forwarding packets by default
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
# Custom per-protocol chains
:UDP - [0:0]
:TCP - [0:0]
:ICMP - [0:0]
# Acceptable UDP traffic
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
# Acceptable ICMP traffic
# Boilerplate acceptance policy
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
# Drop invalid packets
-A INPUT -m conntrack --ctstate INVALID -j DROP
# Pass traffic to protocol-specific chains
## Only allow new connections (established and related should already be handled)
## For TCP, additionally only allow new SYN packets since that is the only valid
## method for establishing a new TCP connection
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --syn -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
# Reject anything that's fallen through to this point
## Try to be protocol-specific w/ rejection message
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
# Commit the changes
COMMIT
*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*security
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
سپس فایل را ذخیره و ببندید. اگر از nano
استفاده میکنید، برای خروج Ctrl+X
را فشار دهید و سپس هنگام درخواست، Y
و بعد Enter
را بزنید.
اگر در حال پیادهسازی این تغییرات در یک محیط زنده هستید، هنوز قوانین فایروال را بارگذاری نکنید. بارگذاری مجموعه قوانین ذکر شده، ارتباط بین سرور برنامه و پایگاه داده شما را بلافاصله قطع میکند. شما باید قوانین را به گونهای تنظیم کنید که نیازهای عملیاتی شما را قبل از بارگذاری منعطف کند.
بیشتر بخوانید: فایروال Iptables چگونه کار میکند؟
شناسایی پورتهای مورد استفاده توسط سرویسهایتان
برای اجازه دادن به ارتباط بین اجزای مختلف، شما باید پورتهای شبکهای که استفاده میشوند را شناسایی کنید. شما میتوانید پورتهای صحیح شبکه را با بررسی فایلهای پیکربندی خود پیدا کنید، اما یک روش غیر وابسته به برنامه برای پیداکردن پورتهای صحیح این است که فقط بررسی کنید کدام سرویس در حال گوش دادن به اتصالات روی هر یک از ماشینهای شما هستند.
برای این کار میتوانید از ابزار netstat استفاده کنید. از آنجا که برنامه شما فقط از طریق IPv4 ارتباط برقرار میکند، پارامتر -4
را اضافه شده است، میتوانید این گزینه را حذف کنید. دیگر پارامترهایی که برای پیدا کردن سرویسهای در حال اجرا نیاز دارید، شامل -p
, -l
, -u
, -n
, و -t
هستند که میتوانید آنها را به صورت -plunt
وارد کنید.
این پارامترها به شرح زیر هستند.
p
: نمایش PID و نام برنامهای که هر سوکت به آن تعلق دارد.l
: فقط نمایش سوکتهای در حال گوش دادن.u
: نمایش ترافیک UDP.n
: نمایش خروجی عددی به جای نام سرویسها.t
:نمایش ترافیک TCP.
sudo netstat -4plunt
در سرور وب شما، خروجی ممکن است به صورت زیر باشد.
Output
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1058/sshd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4187/nginx
ستون اول که هایلایت شده، آدرس IP و پورت سرویس را نشان میدهد که در انتهای خط مشخص شده است. آدرس خاص 0.0.0.0
به این معنی است که سرویس مربوطه بر روی تمام آدرسهای در دسترس گوش میدهد.
در سرور پایگاه داده شما، خروجی ممکن است به این صورت باشد.
sudo netstat -4plunt
Output
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1097/sshd
tcp 0 0 192.0.2.30:3306 0.0.0.0:* LISTEN 3112/mysqld
شما میتوانید این ستونها را به همین صورت بخوانید. در این مثال، آدرس 192.0.2.30
نمایانگر آدرس IP خصوصی سرور پایگاه داده است. در قسمت پیشنیاز، شما MySQL را به صورت خاص به رابط خصوصی محدود کردهاید تا از نظر امنیتی محافظت شود.
نکاتی که در این مرحله پیدا میکنید را یادداشت کنید. این جزئیات شبکهای هستند که برای تنظیم پیکربندی فایروال خود نیاز دارید.
در سرور وب خود، باید اطمینان حاصل کنید که پورتهای زیر قابل دسترسی هستند.
- پورت 80 بر روی تمام آدرسها
- پورت 22 بر روی روی تمام آدرسها (که قبلا در قوانین فایروال لحاظ شده است)
سرور پایگاه داده شما باید اطمینان حاصل کند که پورتهای زیر قابل دسترسی هستند.
- پورت 3306 بر روی آدرس
192.0.2.30
(یا رابط مرتبط با آن) - پورت 22 بر روی تمام آدرسها (که قبلا در قوانین فایروال لحاظ شده است.)
با سرور ابونتو لیارا، بدون دردسر سرور خود را تنها با چند کلیک مدیریت کنید.
✅ منابع کاملاً اختصاصی و پایدار✅ سرعت بالا و ترافیک نامحدود✅ امنیت پیشرفته و پشتیبانی 24/7
خرید و راهاندازی سرور اوبونتو ساعتی لیارا
تنظیم قوانین فایروال برای وبسرور
حالا که اطلاعات پورت مورد نیاز را دارید، شما باید مجموعه قوانین فایروال سرور وب خود را تنظیم کنید. فایل قوانین را با دسترسی sudo
در ویرایشگر خود باز کنید.
sudo nano /etc/iptables/rules.v4
در سرور وب، شما باید پورت 80 را به لیست ترافیکهای قابل قبول اضافه کنید. از آنجا که سرور بر روی تمام آدرسهای موجود گوش میدهد سرورهای وب معمولا انتظار دارند که از هر جایی قابل دسترسی باشند شما نیاز ندارید که این قانون را بر اساس رابط یا آدرس مقصد محدود کنید.
بازدیدکنندگان وبسایت شما از پروتکل TCP برای اتصال به سرور استفاده میکنند. فریمورک شما قبلاً یک زنجیره (Chain) به نام TCP برای مدیریت استثنائات ترافیک TCP دارد. شما میتوانید پورت 80 را به این زنجیره اضافه کنید، دقیقاً زیر استثنای پورت SSH که قبلاً در آن تعریف شده است.
*filter
. . .
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp --dport 80 -j ACCEPT
. . .
سرور وب شما ارتباط را با سرور پایگاه داده آغاز خواهد کرد. ترافیک خروجی شما در فایروال محدود نشده است و ترافیک ورودی مربوط به اتصالات برقرار شده مجاز است، بنابراین نیازی به بازکردن پورتهای اضافی در این سرور برای اجازه دادن به این اتصال نیست.
پس از اتمام، فایل را ذخیره و ببندید. حالا سرور وب شما دارای یک سیاست فایروال است که ترافیکای قانونی را مجاز میکند و همه چیز دیگری را مسدود میکند.
برای آزمایش فایل قوانین خود برای خطاهای نحوی، از دستور زیر استفاده کنید.
sudo iptables-restore -t < /etc/iptables/rules.v4
اگر هیچ خطای نحوی نمایش داده نشد، فایروال را بارگذاری کنید تا مجموعه قوانین جدید را اعمال شود.
sudo service iptables-persistent reload
تنظیم قوانین فایروال برای سرور پایگاه داده
در سرور پایگاه داده خود، شما باشد دسترسی به پورت 3306
را برای آدرس IP خصوصی سرور خود مجاز کنید. در این مثال، آن آدرس 192.0.2.30
است. شما میتوانید دسترسی را به صورت خاص برای این آدرس محدود کنید، یا میتوانید دسترسی را بر اساس رابط شبکهای که به این آدرس اختصاص دارد، محدود کنید.
برای پیدا کردن رابط شبکهای مرتبط با این آدرس دستور زیر را اجرا کنید.
ip -4 addr show scope global
Output
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 203.0.113.5/24 brd 104.236.113.255 scope global eth0
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.0.2.30/24 brd 192.0.2.255 scope global eth1
valid_lft forever preferred_lft forever
در اینجا قسمتهای هایلایت شده نشان میدهد که رابط eth1
به آدرس 192.0.2.30
اختصاص دارد.
حالا شما باید قوانین فایروال را در سرور پایگاه داده تنظیم کنید. فایل قوانین را با دسترسی sudo
در سرور پایگاه داده باز کنید.
sudo nano /etc/iptables/rules.v4
دوباره شما باید یک قانون جدید به زنجیره TCP اضافه کنید تا برای اتصال بین سرور وب و پایگاه داده استثنا قائل شوید.
برای محدود کردن دسترسی بر اساس آدرس واقعی، شما باید قانون را به این صورت اضافه کنید.
*filter
. . .
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp --dport 3306 -d 192.0.2.30 -j ACCEPT
. . .
اگر ترجیح میدهید که استثنا را بر اساس رابط شبکهای که آدرس را در خود جای داده است، مجاز کنید، میتوانید قانون مشابه زیر را اضافه کنید.
*filter
. . .
# Acceptable TCP traffic
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp --dport 3306 -i eth1 -j ACCEPT
. . .
پس از پایان، فایل را ذخیره کرده و ببندید.
برای بررسی خطاهای نحوی از این دستور استفاده کنید.
sudo iptables-restore -t < /etc/iptables/rules.v4
وقتی آماده بودید، قوانین فایروال را بارگذاری کنید.
sudo service iptables-persistent reload
حالا هر دو سرور شما باشد محافظت شوند بدون اینکه جریان دادههای ضروری بین آنها محدود شود.
همچنین بخوانید: راهنمای انتخاب بهترین سیاست فایروال برای حفاظت از سرورها
همینطور بخوانید: نحوه بررسی و تست پیکربندی فایروال با Nmap و Tcpdump

جمع بندی
راهاندازی صحیح فایروال، باید همیشه یکی از بخشهای اصلی برنامهی استقرار هر اپلیکیشنی باشد. در این مقاله، پیکربندی فایروال با استفاده از دو سرور یکی برای اجرای Nginx و دیگری برای اجرای MySQL ارائه شده است. البته روشهایی که در اینجا توضیح داده شد، به دو نوع نرمافزار محدود نیست و در پروژههایی با فناوریهای مختلف هم قابل استفاده است.