در پایان این راهنما، فایروال سرور آپاستریم (سرور وبسایت) را طوری تنظیم میکنیم که فقط ترافیک IP لبههای CDN ستون را بپذیرد و فهرست ipset را روزانه از منبع رسمی بهروز کنیم.
لبه (Edge) CDN برای اتصال به آپاستریم از IPهای منتشرشده در فهرست IPهای لبه استفاده میکند. این IPها با Anycast مورد استفاده برای ترافیک ورودی کاربران متفاوتاند. اگر فایروال آپاستریم این IPها را مجاز نکند، Edge نمیتواند به آپاستریم متصل شود. فهرست رسمی:
پیشنیازها
- دسترسی root یا sudo روی سرور آپاستریم
- امکان اجرای
curl،iptablesوipsetروی همان سرور - دسترسی خروجی HTTPS به
edge.sotoon.irبرای دریافت فهرست
سیستمعامل
مراحل و اسکریپت زیر برای توزیعهای لینوکس مبتنی بر Debian است. روی توزیع دیگر، نصب بسته و مسیر فایروال ممکن است فرق کند.
مراحل
- اسکریپت زیر را روی سرور ذخیره میکنیم؛ مثلا در
/usr/local/sbin/update-sotoon-edge-ips.sh:
#!/bin/bash
set -euo pipefail
if ! [ -f /etc/debian_version ]; then
echo "This script supports Debian-based systems only."
exit 1
fi
if ! command -v ipset >/dev/null 2>&1; then
apt-get update
if ! apt-get install -y ipset netfilter-persistent ipset-persistent; then
echo "Could not install ipset. Install packages manually and retry."
exit 1
fi
fi
if ! curl -fsS -o /tmp/sotoon-ips.txt https://edge.sotoon.ir/ip-list.txt; then
echo "Could not download IP list from edge.sotoon.ir."
exit 1
fi
ipset create sotoon-ips nethash -exist
ipset flush sotoon-ips
while IFS= read -r ip; do
[ -n "$ip" ] || continue
ipset add sotoon-ips "$ip"
done < /tmp/sotoon-ips.txt- اجازه اجرا میدهیم:
chmod +x /usr/local/sbin/update-sotoon-edge-ips.sh- یکبار بهصورت دستی اجرا میکنیم:
/usr/local/sbin/update-sotoon-edge-ips.sh- برای بهروزرسانی روزانه، در crontab ریشه این خط را میگذاریم:
0 0 * * * /usr/local/sbin/update-sotoon-edge-ips.sh > /dev/null 2>&1- در قوانین
iptables، ترافیک ورودی از مجموعهsotoon-ipsرا مجاز میکنیم:
-A INPUT -m set --match-set sotoon-ips src -j ACCEPTنمونه ترتیب ساده (قبل از اعمال روی سرور production، دسترسی SSH خود را از دست نمیدهیم):
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -m set --match-set sotoon-ips src -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
-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قفل شدن دسترسی
قبل از بستن بقیه ترافیک ورودی، از باز بودن پورت مدیریت (مثلا SSH) و اجرای موفق اسکریپت اطمینان حاصل میکنیم.
بررسی صحت
ipset list sotoon-ips | headباید اعضای مجموعه دیده شوند و با محتوای ip-list.txt همخوان باشند.
سپس یک درخواست به دامنه پشت CDN میزنیم. در مشاهده لحظهای لاگ درخواستها فیلدهای upstream_status و upstream_name را بررسی میکنیم؛ خطای اتصال لبه به مبدا نباید بهخاطر مسدود بودن IP لبه باشد.
