در بخش اول میزبان 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
.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
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 میسازیم تا ایمیجهای کانتینر هم بدون اینترنت در دسترس باشند.
بخشهای این مجموعه
- بخش ۱: مفاهیم، معماری و راهاندازی میزبان Mirror
- بخش ۲: Mirror packageهای سیستمعامل (apt و dnf) (همین بخش)
- بخش ۳: رجیستری کانتینر محلی
- بخش ۴: packageهای زبانها؛ PyPI و npm
- بخش ۵: چارتهای Helm و ایمیجهای سیستم
- بخش ۶: اتوماسیون همگامسازی و بهروزرسانی خودکار