Mirror محلی packageها برای قطعی اینترنت، بخش ۲: Mirror packageهای سیستم‌عامل با apt

در بخش اول میزبان Mirror را راه انداختیم که یک پوشه را روی HTTP سرو می‌کند. حالا مهم‌ترین بخش را می‌سازیم: یک مخزن apt روی همین سرور، تا packageها و وصله‌های امنیتی سیستم‌عامل حتی بدون اینترنت روی کلاینت‌ها نصب شوند.

یک مخزن apt از چه ساخته شده است؟

یک مخزن apt دو بخش اصلی دارد:

  • pool: خود فایل‌های package (فایل‌های .deb).
  • dists: فهرست و امضای مخزن؛ فایل Packages که مشخصات هر package را دارد و فایل Release که با کلید GPG امضا می‌شود.

امضای GPG مهم است: کلاینت با آن مطمئن می‌شود packageها دست‌کاری نشده‌اند. بنابراین مخزن را امضا می‌کنیم و کلید عمومی را در اختیار کلاینت‌ها می‌گذاریم.

ساخت مخزن روی سرور Mirror

روی سرور Mirror (که به اینترنت دسترسی دارد) ابتدا فایل‌های .deb موردنیاز را دانلود می‌کنیم، سپس فهرست مخزن را می‌سازیم و آن را امضا می‌کنیم. ابزارها: dpkg-scanpackages برای ساخت Packages، apt-ftparchive برای ساخت Release، و gpg برای امضا:

cd /srv/mirror/apt/pool/main
apt-get download hello tree

cd /srv/mirror/apt
dpkg-scanpackages pool /dev/null > dists/stable/main/binary-amd64/Packages
gzip -kf dists/stable/main/binary-amd64/Packages
apt-ftparchive release dists/stable > dists/stable/Release

gpg --clearsign -o dists/stable/InRelease dists/stable/Release
gpg -abs -o dists/stable/Release.gpg dists/stable/Release
gpg --export mirror@obsernetics.local > obsernetics-mirror.gpg
ساخت و امضای مخزن apt روی سرور Mirror
ساخت مخزن apt: دانلود فایل‌های .deb، ساخت فهرست Packages، ساخت و امضای Release، و استخراج کلید عمومی برای کلاینت‌ها.

برای Mirror کامل مخازن رسمی

اینجا یک مخزن کوچک و کنترل‌شده ساختیم. برای Mirror کامل مخازن رسمی Ubuntu یا Debian (از جمله pocket امنیتی مانند noble-security) ابزار apt-mirror کل ساختار و امضاها را یکجا همگام می‌کند؛ اما حجم آن زیاد است و به دیسک کافی نیاز دارد. سمت کلاینت دقیقاً همین روش است.

معرفی Mirror به کلاینت

حالا سراغ کلاینت می‌رویم؛ همان ماشینی که در بخش قبل ساختیم و هیچ دسترسی‌ای به اینترنت ندارد. ابتدا مخازن پیش‌فرض (که بدون اینترنت در دسترس نیستند) را غیرفعال می‌کنیم، کلید عمومی Mirror را نصب می‌کنیم و مخزن محلی را اضافه می‌کنیم. سپس apt-get update و نصب package مثل حالت عادی کار می‌کند، فقط این‌بار همه‌چیز از Mirror محلی می‌آید:

curl -fsSL http://10.10.0.1/apt/obsernetics-mirror.gpg \
  | sudo tee /etc/apt/keyrings/obsernetics.gpg > /dev/null

echo "deb [signed-by=/etc/apt/keyrings/obsernetics.gpg] http://10.10.0.1/apt stable main" \
  | sudo tee /etc/apt/sources.list.d/obsernetics.list

sudo apt-get update
sudo apt-get install -y tree hello
به‌روزرسانی و نصب package روی کلاینت بدون اینترنت از Mirror محلی
کلاینت بدون اینترنت: apt-get update فهرست امضاشده را از 10.10.0.1 می‌گیرد و apt-get install packageها را از Mirror محلی نصب می‌کند. خروجی Hello, world! یعنی نصب کامل و موفق بوده است.

همین الگو برای وصله‌های امنیتی هم صادق است: کافی است pocket امنیتی را در Mirror نگه دارید تا کلاینت‌ها بتوانند حتی هنگام قطعی اینترنت، آخرین به‌روزرسانی‌های امنیتی را نصب کنند.

معادل این کار در dnf و yum

برای توزیع‌های مبتنی بر RPM (مانند RHEL، Rocky یا Fedora) همین ایده با ابزارهای دیگری انجام می‌شود: با reposync فایل‌های package را از بالادست می‌گیرید و با createrepo_c فهرست مخزن را می‌سازید. سپس همان پوشه را با nginx سرو می‌کنید و در سمت کلاینت یک فایل .repo با آدرس Mirror محلی تعریف می‌کنید.

جمع‌بندی و بخش بعد

در این بخش یک مخزن apt امضاشده روی Mirror ساختیم و نشان دادیم یک کلاینت کاملاً بدون اینترنت می‌تواند از آن package و وصله‌ی امنیتی نصب کند. این همان قطعه‌ای است که قطعی اینترنت را از یک بحران به یک اتفاق بی‌اثر تبدیل می‌کند.

در بخش بعد سراغ کانتینرها می‌رویم: یک رجیستری محلی با Harbor می‌سازیم تا ایمیج‌های کانتینر هم بدون اینترنت در دسترس باشند.

← بازگشت به وبلاگ