Jakiś czas temu opublikowałem poradnik jak ustawić serwer Nginx i Apache2 tak, by w przypadku korzystania z usługi Cloudflare serwer prawidłowo rozpoznawał (m.in. w logach/statystykach) prawdziwe adresy IP użytkowników, a nie należące do Cloudflare.

O ile w przypadku webserwera Apache2 wystarczy relatywnie prosta modyfikacja konfiguracji by dalej wszystko działało bez naszej dalszej ingerencji, to w przypadku Nginx „raz na jakiś czas” warto/trzeba zaktualizować listę wykorzystywanych przez Cloudflare adresów IP.

Dlatego sam posiłkuje się skryptem który robi to za mnie, a który właśnie dziś chciałbym Wam przedstawić…

Nginx i automatyczne pobieranie adresów IP Cloudflare

Nie będę tutaj rozpisywał się nad tym dlaczego w ogóle taka operacja jest potrzebna – zainteresowanych odsyłam do wcześniejszego wpisu na ten temat, w którym opisałem „co i dlaczego”.

W tym wpisie będzie tylko o skrypcie który pobiera listę adresów IP należących do Cloudflare i tworzy plik cloudflare.conf, który jest wykorzystywany przez Nginx do „demaskowania” prawdziwych adresów IP użytkowników:

#!/bin/bash

# Skrypt pobiera listę IP używanych przez Cloudflare
# i zapisuje je do pliku zgodnego z Nginx.
# Plik należy zapisać /etc/nginx/conf.d/cloudflare.conf
# i zrestartować Nginx (restart lub reload).
# Skrypt może to zrobić automatycznie (parametr: auto),
# lub dopiero gdy sami zdecydujemy (start bez parametru).

CF_IP4="/tmp/cf_ipv4"
CF_IP6="/tmp/cf_ipv6"
CF_TEMP_IP_LIST="/tmp/cf_temp_ip_list"
CF_NGINX_IP_LIST="/etc/nginx/conf.d/cloudflare.conf"

if [ "$CF_IP4" ]
then
sudo rm $CF_IP4
fi

if [ "$CF_IP6" ]
then
sudo rm $CF_IP6
fi

if [ "$CF_TEMP_IP_LIST" ]
then
sudo rm $CF_TEMP_IP_LIST
fi


sudo wget -U "Download IP4" https://www.cloudflare.com/ips-v4 -O $CF_IP4
sudo wget -U "Download IP6" https://www.cloudflare.com/ips-v6 -O $CF_IP6


echo "# Cloudflare MyRealIP" | sudo tee $CF_TEMP_IP_LIST > /dev/null

while read line; do
echo "set_real_ip_from "$line";"
done < $CF_IP4 | sudo tee -a $CF_TEMP_IP_LIST > /dev/null

while read line; do
echo "set_real_ip_from "$line";"
done < $CF_IP6 | sudo tee -a $CF_TEMP_IP_LIST > /dev/null

echo "real_ip_header CF-Connecting-IP;" | sudo tee -a $CF_TEMP_IP_LIST > /dev/null
echo "real_ip_recursive on;" | sudo tee -a $CF_TEMP_IP_LIST > /dev/null

echo "# /Cloudflare MyRealIP" | sudo tee -a $CF_TEMP_IP_LIST > /dev/null
echo "# $(date +"%Y.%m.%d")" | sudo tee -a $CF_TEMP_IP_LIST > /dev/null

if [ "$1" = "auto" ]
then
echo "AutoMode, start za 10 sekund..."
sleep 10
if [ "$CF_NGINX_IP_LIST" ]
then
sudo rm $CF_NGINX_IP_LIST
fi
sudo cp $CF_TEMP_IP_LIST $CF_NGINX_IP_LIST
sudo service nginx reload
echo "OK"
else
echo "----- PLIK -----"
sudo cat $CF_TEMP_IP_LIST
echo "----- /PLIK -----"

read -p "[Enter] -> Podmiana pliku"

if [ "$CF_NGINX_IP_LIST" ]
then
sudo rm $CF_NGINX_IP_LIST
fi

sudo cp $CF_TEMP_IP_LIST $CF_NGINX_IP_LIST

read -p "[Enter] -> Test Nginx"
sudo nginx -t

echo "Nginx: jeśli OK - 1, jeśli błąd - 0"
read NGINX_RESTART
fi


if [ "$NGINX_RESTART" = "0" ]
then
echo "0: Wyjscie"
exit
fi

if [ "$NGINX_RESTART" = "1" ]
then
echo "1: restart za 10 sekund..."
sleep 10
sudo service nginx reload
fi

exit 0

Skrypt możecie skopiować z “listingu” powyżej, lub – chyba bezpieczniej – pobrać z tego adresu. Ew możecie pobrać do bezpośrednio na serwer za pomocą komendy:

wget https://webinsider.pl/add/download/?link=nginx-cloudflare-autoscript -O /ścieżka/do/zapisania/nginx-cloudflare-autoscript

Skrypt możecie uruchamiać ręcznie „raz na jakiś czas”, lub np. za pomocą systemowego harmonogramu zadań (CRON) proces całkowicie zautomatyzować, dodając parametr „auto”, np. o 3 w nocy:

0 3 * * * root /usr/sbin/nginx-cloudflare-autoscript auto

 

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej
Patryk