WIUNIX ACADEMY
آموزش راهاندازی Traefik با Let’s Encrypt و HTTP/3 در اوبونتو و دبیان
صفحهٔ 3 از 6؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من11 مقدار قابلتغییر
قدم بعدی
فایل روتهای پویا را باز کنید
file provider یک پوشه را دنبال میکند؛ این سناریوی سرویس میزبان، bind mount کانتینری ندارد. تغییر روت پویا معمولاً خودکار بارگذاری میشود، ولی تغییر entrypoint و ACME به راهاندازی مجدد کنترلشده نیاز دارد. فایل JSON تولیدشدهٔ ACME را دستی ویرایش نکنید.
سرور لینوکسی اختصاصی
sudoedit '/etc/traefik-academy/dynamic/routes.yml'
ویرایشگر فایل روت پویا باز است.
روت برنامه و مدیریت خصوصی
محتوای فایل: فقط Host دقیق دامنه از مسیر TLS به بکاند میرسد. قانون API و داشبورد به entrypoint مدیریت روی loopback محدود است. کلاینت با فرستادن URL دلخواه، بکاند انتخاب نمیکند و به هدرهای forwarded هم اعتماد عمومی ندادهایم. برای بکاند روی میزبان دیگر، HTTPS با احراز هویت و اعتبارسنجی گواهی و روت بررسیشده لازم است؛ insecureSkipVerify را روشن نکنید.
http:
routers:
app:
rule: "Host(`app.example.com`)"
entryPoints: [websecure]
service: marker
tls:
certResolver: le
options: modern
admin:
rule: "PathPrefix(`/api`) || PathPrefix(`/dashboard`)"
entryPoints: [admin]
service: api@internal
services:
marker:
loadBalancer:
servers:
- url: "http://127.0.0.1:8081"
tls:
options:
modern:
minVersion: VersionTLS12
قدم بعدی
فایل سرویس محدودشدهٔ پروکسی را باز کنید
فقط قابلیت لازم برای اتصال به پورتهای زیر 1024 داده میشود. پردازه با کاربر اختصاصیِ بدون ورود اجرا میشود، تنظیمات root را میخواند و فقط در پوشهٔ ACME مینویسد. به آن حساب root، عضویت گروههای پرقدرت یا Docker socket ندهید.
سرور لینوکسی اختصاصی
test ! -e /etc/systemd/system/traefik-academy.service &&
sudoedit /etc/systemd/system/traefik-academy.service
ویرایشگر سرویس تازهٔ پروکسی باز است.
محتوای سرویس پروکسی
محتوای فایل: systemd فایلسیستم را محدود میکند و فقط CAP_NET_BIND_SERVICE را نگه میدارد. ReadWritePaths جای مالکیت معمول فایل را نمیگیرد؛ پوشهٔ وضعیت همچنان باید متعلق به کاربر سرویس باشد. جداسازی کامل شبکه فعال نیست، چون DNS، ACME، شنوندههای عمومی و بکاند همان میزبان لازماند.
[Unit]
Description=Academy Traefik HTTPS and HTTP3 edge
Wants=network-online.target
After=network-online.target academy-traefik-origin.service
[Service]
Type=simple
User=traefik-academy
Group=traefik-academy
ExecStart=/usr/local/bin/traefik --configFile=/etc/traefik-academy/traefik.yml
Restart=on-failure
RestartSec=5s
UMask=0077
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/var/lib/traefik-academy
[Install]
WantedBy=multi-user.target
قدم بعدی
سرویس را با staging بالا بیاورید
مجوز خواندن تنظیمات را اعمال و نحو unitهای systemd را پیش از اجرا بررسی کنید. این ابزار YAML خود Traefik را بررسی نمیکند؛ بارگذاری آن را از لاگ شروع و وضعیت روت در API خصوصی کنترل کنید. اجرای این مرحله با CA آزمایشی تماس میگیرد و ممکن است حساب و سفارش بسازد؛ پیش از اجرای عمومی خود، توافقنامهٔ جاری صادرکننده را بررسی کنید. برای تکرار صدور، سرویس را در حلقه ریاستارت نکنید. پورت 80 برای چالشهای آینده باز میماند.
سرور لینوکسی اختصاصی
sudo chown root:traefik-academy '/etc/traefik-academy/traefik.yml' '/etc/traefik-academy/dynamic/routes.yml'
sudo chmod 0640 '/etc/traefik-academy/traefik.yml' '/etc/traefik-academy/dynamic/routes.yml'
sudo systemd-analyze verify /etc/systemd/system/academy-traefik-origin.service /etc/systemd/system/traefik-academy.service
sudo systemctl daemon-reload
sudo systemctl enable --now academy-traefik-origin.service
curl --fail --silent --show-error --noproxy '*' 'http://127.0.0.1:8081/health.txt'
sudo systemctl enable --now traefik-academy.service
sudo systemctl status traefik-academy.service --no-pager
sudo journalctl -u traefik-academy.service --since '10 minutes ago' --no-pager
sudo ss -lntup
متن دقیق آزمایشی، پروکسی فعال و بدون خطای YAML یا provider یا ACME؛ مدیریت و بکاند فقط loopback و پورتهای عمومی مطابق طرح هستند.
قدم بعدی
گواهی آزمایشی را بدون اعتماد دائمی بررسی کنید
از کلاینت مستقل، نامها، صادرکننده و تاریخ گواهی را ببینید. ریشههای staging عمداً مورد اعتماد عمومی نیستند. فقط برای همین فایل فاقد اطلاعات حساس، درخواست دوم موقتاً بررسی اعتماد را کنار میگذارد تا روت مشخص شود؛ رمز وارد نکنید، ریشهٔ آزمایشی نصب نکنید، هشدار مرورگر را دور نزنید و این پرچم را برای production به کار نبرید. گواهی باید دامنهٔ app.example.com و صادرکنندهٔ آزمایشی را نشان دهد؛ TRAEFIK DEFAULT CERT یعنی هنوز صدور موفق نشده است. این بررسیِ زنجیرهٔ نامعتبر، تأیید TLS مورد اعتماد نیست.
کلاینت مستقل خارج از سرور
openssl s_client -connect 'app.example.com:443' -servername 'app.example.com' </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates -ext subjectAltName
curl --insecure --fail --silent --show-error --noproxy '*' 'https://app.example.com/health.txt'
curl --silent --show-error --head --noproxy '*' 'http://app.example.com/health.txt'
SAN و صادرکنندهٔ staging درستاند، پاسخ academy-traefik-origin-ok است و HTTP به همان دامنه با HTTPS میرود.