در پایان این راهنما، فایروال سرور آپ‌استریم (سرور وب‌سایت) را طوری تنظیم می‌کنیم که فقط ترافیک IP لبه‌های CDN ستون را بپذیرد و فهرست ipset را روزانه از منبع رسمی به‌روز کنیم.

لبه‌ (Edge) CDN برای اتصال به آپ‌استریم از IPهای منتشرشده در فهرست IPهای لبه استفاده می‌کند. این IPها با Anycast مورد استفاده برای ترافیک ورودی کاربران متفاوت‌اند. اگر فایروال آپ‌استریم این IPها را مجاز نکند، Edge نمی‌تواند به آپ‌استریم متصل شود. فهرست رسمی:


پیش‌نیازها

  • دسترسی root یا sudo روی سرور آپ‌استریم
  • امکان اجرای curl، iptables و ipset روی همان سرور
  • دسترسی خروجی HTTPS به edge.sotoon.ir برای دریافت فهرست

سیستم‌عامل

مراحل و اسکریپت زیر برای توزیع‌های لینوکس مبتنی بر Debian است. روی توزیع دیگر، نصب بسته و مسیر فایروال ممکن است فرق کند.


مراحل

  1. اسکریپت زیر را روی سرور ذخیره می‌کنیم؛ مثلا در /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
  1. اجازه اجرا می‌دهیم:
chmod +x /usr/local/sbin/update-sotoon-edge-ips.sh
  1. یک‌بار به‌صورت دستی اجرا می‌کنیم:
/usr/local/sbin/update-sotoon-edge-ips.sh
  1. برای به‌روزرسانی روزانه، در crontab ریشه این خط را می‌گذاریم:
0 0 * * * /usr/local/sbin/update-sotoon-edge-ips.sh > /dev/null 2>&1
  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 لبه باشد.


ادامه مسیر