آپاچی؛ شب ۲۴: پراکسی معکوس اولین برنامه
فهرست نوشته
پراکسی معکوس درخواست عمومی را میگیرد و به یک برنامهٔ داخلی میفرستد. امشب TLS در Apache تمام میشود و یک backend محلی بدون پورت عمومی پاسخ میدهد.
این جلسه بخشی از دورهٔ آپاچی در ۵۰ شب است. قرارداد نامها، مسیرها و روش اعمال تغییر را در راهنمای دوره بخوان.
محیط: Python 3 روی VM وب، ماژولهای proxy و proxy_http، گواهی دارای app.example.test و سیاست شبکهٔ پایه.
backend قابل تشخیص#
در یک ترمینال وبسرور:
mkdir -p ~/apache-lab/backend-a
printf '%s\n' 'backend A' > ~/apache-lab/backend-a/index.html
python3 -m http.server 8080 --bind 127.0.0.1 --directory ~/apache-lab/backend-a
این سرور صرفاً ابزار lab است. در ترمینال دوم curl http://127.0.0.1:8080/ باید متن backend A بدهد. پورت روی loopback است؛ از کلاینت نباید اتصال مستقیم به IP وبسرور روی 8080 ممکن باشد.
در Debian sudo a2enmod proxy proxy_http را اجرا کن. فایل سایت APP_CONF را مطابق راهنما بساز و در Debian فعال کن:
<VirtualHost *:443>
ServerName app.example.test
SSLEngine on
Protocols h2 http/1.1
SSLCertificateFile /etc/apache-lab/tls/www.crt
SSLCertificateKeyFile /etc/apache-lab/tls/www.key
ProxyRequests Off
Header onsuccess unset X-Content-Type-Options
Header always set X-Content-Type-Options "nosniff"
Header onsuccess unset Referrer-Policy
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header onsuccess unset Strict-Transport-Security
Header always set Strict-Transport-Security "max-age=300"
ProxyPass / http://127.0.0.1:8080/ connectiontimeout=3 timeout=15
ProxyPassReverse / http://127.0.0.1:8080/
<Location />
Require all granted
</Location>
ErrorLog /var/log/apache2/app-error.log
CustomLog /var/log/apache2/app-access.log combined
</VirtualHost>
مسیر لاگ RHEL را تغییر بده. ProxyRequests Off forward proxy را خاموش میکند؛ ProxyPass همچنان کار میکند. ProxyPassReverse هدرهای redirect مرتبط را اصلاح میکند؛ بدنهٔ HTML را بازنویسی نمیکند.
در Alma/Rocky اگر SELinux اتصال را رد کرد، AVC را بررسی کن. برای این VM دارای نقش پراکسی، sudo setsebool -P httpd_can_network_connect on مجوز اتصال شبکه را گسترش میدهد؛ این boolean را بینیاز روی همهٔ سرورها فعال نکن.
آزمون و خرابی#
از کلاینت با --cacert و --resolve app.example.test:443:IP پاسخ HTTPS بگیر. سپس backend را با Ctrl-C متوقف کن؛ انتظار یک خطای 5xx و شاهد در app-error.log داریم. دوباره آن را راهاندازی کن و پاسخ سالم را ببین.
بازگشت: سایت app را غیرفعال و boolean قبلی را، اگر تغییر کرده بود، بازیابی کن. www باید مستقل سالم بماند.
منبع: راهنمای پراکسی معکوس Apache .