Routing ruchu przez Apache do usług za Tailscale
Kompletna ściąga do Twojego układu: VPS OVH → Tailscale → serwer domowy → Apache → aplikacja. Certyfikat leży na Apache, więc żadna aplikacja nie musi sama umieć HTTPS.
| Usługa | Publiczny adres | HTTPS na serwerze domowym | Aplikacja |
|---|---|---|---|
| Crafty | https://mikolajfiuk.pl:8443 | 9444 | 127.0.0.1:8443 |
| Strona / panel na porcie 81 | https://mikolajfiuk.pl:81 | 9445 | 127.0.0.1:81 |
| Nextcloud | https://mikolajfiuk.pl:8080 | 8080 | Nextcloud |
Najważniejsza zasada
Dla każdej kolejnej strony robimy dokładnie to samo:
Czyli np. dla Crafty:
Certyfikat Let's Encrypt
Certyfikat mamy dla: mikolajfiuk.pl
sudo certbot certificates
Certyfikat znajduje się tutaj:
/etc/letsencrypt/live/mikolajfiuk.pl/fullchain.pem /etc/letsencrypt/live/mikolajfiuk.pl/privkey.pem
sudo systemctl status certbot.timer
sudo certbot renew --dry-run
Moduły Apache
Na serwerze domowym:
sudo a2enmod ssl proxy proxy_http headers
Możemy też mieć:
sudo a2enmod proxy_wstunnel
Nie zaszkodzi mieć go włączonego, szczególnie przy aplikacjach korzystających z WebSocketów.
Po zmianach:
sudo apache2ctl configtest
Jeżeli jest: Syntax OK to:
sudo systemctl restart apache2
Sprawdzanie, jakie porty są zajęte
Bardzo przydatne polecenie:
sudo ss -ltnp
Albo tylko konkretne:
sudo ss -ltnp | grep -E ':(81|8080|8443|9444|9445)\b'
To pokazuje, co faktycznie nasłuchuje na poszczególnych portach.
Crafty — HTTPS na 8443
sudo nano /etc/apache2/sites-available/crafty.conf
<IfModule mod_ssl.c>
<VirtualHost *:9444>
ServerName mikolajfiuk.pl
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/mikolajfiuk.pl/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mikolajfiuk.pl/privkey.pem
ProxyRequests Off
ProxyPreserveHost On
ProxyTimeout 3600
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "8443"
ProxyPass / http://127.0.0.1:8443/ upgrade=websocket retry=0 timeout=3600
ProxyPassReverse / http://127.0.0.1:8443/
ErrorLog ${APACHE_LOG_DIR}/crafty-error.log
CustomLog ${APACHE_LOG_DIR}/crafty-access.log combined
</VirtualHost>
</IfModule>sudo a2ensite crafty.conf
sudo apache2ctl configtest
sudo systemctl restart apache2
Crafty — przekierowanie na VPS
Na VPS:
sudo iptables -t nat -I PREROUTING 1 -d 57.128.255.40/32 -p tcp --dport 8443 -j DNAT --to-destination 100.96.49.10:9444
Sprawdzenie:
sudo iptables -t nat -L PREROUTING -n -v --line-numbers
Test:
curl.exe -v https://mikolajfiuk.pl:8443/login -o NUL
Docelowo: https://mikolajfiuk.pl:8443/login
Strona na porcie 81 — HTTPS
sudo nano /etc/apache2/sites-available/app81.conf
<IfModule mod_ssl.c>
<VirtualHost *:9445>
ServerName mikolajfiuk.pl
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/mikolajfiuk.pl/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mikolajfiuk.pl/privkey.pem
ProxyRequests Off
ProxyPreserveHost On
ProxyTimeout 3600
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "81"
ProxyPass / http://127.0.0.1:81/ upgrade=websocket retry=0 timeout=3600
ProxyPassReverse / http://127.0.0.1:81/
ErrorLog ${APACHE_LOG_DIR}/app81-error.log
CustomLog ${APACHE_LOG_DIR}/app81-access.log combined
</VirtualHost>
</IfModule>sudo a2ensite app81.conf
sudo apache2ctl configtest
sudo systemctl restart apache2
sudo iptables -t nat -I PREROUTING 1 -d 57.128.255.40/32 -p tcp --dport 81 -j DNAT --to-destination 100.96.49.10:9445
Sprawdzenie:
sudo iptables -t nat -L PREROUTING -n -v --line-numbers
Test:
curl.exe -v https://mikolajfiuk.pl:81/ -o NUL
Adres: https://mikolajfiuk.pl:81/#/login
https://, nie http://.Nextcloud — HTTPS na 8080
Tutaj sytuacja jest trochę inna, bo Apache już obsługuje Nextcloud na porcie 8080.
Edytujemy istniejącą konfigurację:
sudo nano /etc/apache2/sites-available/nextcloud.conf
W VirtualHoście <VirtualHost *:8080> powinno być:
<VirtualHost *:8080>
ServerName mikolajfiuk.pl
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/mikolajfiuk.pl/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mikolajfiuk.pl/privkey.pem
...
</VirtualHost>Potem:
sudo a2enmod ssl
sudo apache2ctl configtest
sudo systemctl restart apache2
Test:
curl -v --resolve mikolajfiuk.pl:8080:127.0.0.1 https://mikolajfiuk.pl:8080/status.php
Nextcloud — zaufana domena
Sprawdzenie:
sudo -u www-data php /var/www/nextcloud/occ config:system:get trusted_domains
Dodanie:
sudo -u www-data php /var/www/nextcloud/occ config:system:set trusted_domains 8 --value="mikolajfiuk.pl:8080"
8 jest właściwy tylko jeśli indeks 8 jest wolny. Najpierw zawsze warto wykonać get.Adres publiczny:
sudo -u www-data php /var/www/nextcloud/occ config:system:set overwrite.cli.url --value="https://mikolajfiuk.pl:8080"
Adres Nextcloud: https://mikolajfiuk.pl:8080/
VPS — zapisanie reguł
Po dodaniu wszystkich reguł:
sudo netfilter-persistent save
Sprawdzenie:
sudo iptables -t nat -L PREROUTING -n -v --line-numbers
I dobrze również zrobić kopię:
sudo iptables-save | sudo tee /root/iptables-backup.rules >/dev/null
Najważniejsze testy
sudo apache2ctl configtest
sudo systemctl restart apache2
sudo systemctl status apache2
sudo ss -ltnp
sudo certbot certificates
curl.exe -v https://mikolajfiuk.pl/ -o NUL
curl.exe -v https://mikolajfiuk.pl:8443/login -o NUL
curl.exe -v https://mikolajfiuk.pl:81/ -o NUL
curl.exe -v https://mikolajfiuk.pl:8080/status.php
Logi Apache — bardzo ważne przy problemach
sudo tail -f /var/log/apache2/crafty-error.log
sudo tail -f /var/log/apache2/app81-error.log
sudo tail -f /var/log/apache2/error.log
Możesz też sprawdzić wszystkie ostatnie błędy:
sudo journalctl -u apache2 -n 100 --no-pager
Uniwersalny przepis dla kolejnej strony
Jeżeli kiedyś powiesz: „Mam aplikację na porcie 1234 i chcę ją wystawić jako https://mikolajfiuk.pl:1234” — robimy to samo, co zawsze.
<VirtualHost *:9450>
ServerName mikolajfiuk.pl
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/mikolajfiuk.pl/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mikolajfiuk.pl/privkey.pem
ProxyRequests Off
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"
ProxyPass / http://127.0.0.1:1234/ upgrade=websocket retry=0
ProxyPassReverse / http://127.0.0.1:1234/
</VirtualHost>Potem:
sudo a2ensite nazwa.conf sudo apache2ctl configtest sudo systemctl restart apache2
sudo iptables -t nat -I PREROUTING 1 -d 57.128.255.40/32 -p tcp --dport 1234 -j DNAT --to-destination 100.96.49.10:9450
I:
sudo netfilter-persistent save
Jedna bardzo ważna rzecz
Natomiast po zakończeniu konfiguracji wszystkich usług można zrobić jeden końcowy przegląd bezpieczeństwa: HTTP → HTTPS, HSTS, firewall, Tailscale, dostępność portów z Internetu i automatyczne odnawianie Let's Encrypt. To będzie już „ostatni szlif” całej konfiguracji.