Przejdź do treści

Automatyzacja – NPM – Access List

  • przez

W przypadku gdy w zdalnej lokalizacji znajduje się modem LTE, adres IP przydzielany przez operatora jest często dynamiczny i może zmieniać się przy każdym połączeniu. Standardowo dostęp do serwisów udostępnianych w centrali, ograniczony jest poprzez mechanizmy access lists. Dodanie IP do Access List w Nginx Proxy Manager umożliwia czasowy dostęp z tej lokalizacji, jednak trzeba mieć świadomość, że po zmianie IP przez operatora konieczna będzie ponowna aktualizacja listy. Skrypt automatyzujący proces sprawdzania, usunięcia poprzedniego oraz dodania nowego adresu IP do bazy, może być uruchamiany cyklicznie (cron) lub według potrzeb, zapewniając ciągłość dostępu z mobilnych lub nietrwałych połączeń LTE.

Oprócz aktualizacji nowego adresu IP w bazie danych, wymagane są także zmiany w plikach conf dla odpowiednich hostów, dla których używana jest linia allow <adres IP>.

Dzięki temu rozwiązaniu, bez działania administratora, połączenia zdalne, uzyskują dostęp do serwisów w centrali, pomimo zmieniającego się adresu IP (np. z modemu LTE).

#!/bin/bash
REMOTE="....................."
ACCESS_LIST_ID="1"
SQLITE_PATH="/data/database.sqlite"
SAVE_IP_FILE="/data/last_remote_ip.txt"
CONFIG_DIR="/data/nginx/proxy_host"


IP=$(ssh $REMOTE "curl -s --max-time 8 ifconfig.me")
[[ -z "$IP" || "$IP" =~ [^0-9.] ]] && { echo "Nie pobrano IP"; exit 1; }

echo "Zdalny Nowy IP: $IP"

LAST_IP=$(cat "$SAVE_IP_FILE")

echo "Zdalny Stary IP: $LAST_IP"

if [ -f "$SAVE_IP_FILE" ]; then
    if [ "$LAST_IP" != "$IP" ]; then
        cp $SQLITE_PATH $SQLITE_PATH.backup
        sqlite3 "$SQLITE_PATH" \
        "DELETE FROM access_list_client WHERE access_list_id=$ACCESS_LIST_ID AND address='$LAST_IP';"
        echo "Stary IP $LAST_IP usunity."

        EXISTS=$(sqlite3 "$SQLITE_PATH" "SELECT COUNT(*) FROM access_list_client WHERE access_list_id=$ACCESS_LIST_ID AND address='$IP';")

        if [ "$EXISTS" -eq 0 ]; then
             # 3. Dodaj jeli brak
          sqlite3 "$SQLITE_PATH" \
              "INSERT INTO access_list_client (access_list_id, address, directive, meta, created_on, modified_on) \
              VALUES ($ACCESS_LIST_ID, '$IP', 'allow', '{}', datetime('now'), datetime('now'));"
          echo "IP $IP dodane do access_list_id $ACCESS_LIST_ID."
        else
          echo "IP $IP już istnieje na access list $ACCESS_LIST_ID."
        fi

        echo "Szukam i podmieniam stare IP ($LAST_IP) na nowe ($IP)..."
        for file in "$CONFIG_DIR"/*.conf; do
            [ ! -f "$file" ] && continue
            if grep -q "allow.*$LAST_IP" "$file"; then
                echo "   podmieniam w: $(basename "$file")"

                sed \
                    -e "s|allow $LAST_IP;|allow $IP;|g" \
                    -e "s|allow $LAST_IP/32;|allow $IP/32;|g" \
                    -e "s|allow $LAST_IP |allow $IP |g" \
                    "$file" > "$file.tmp" && mv "$file.tmp" "$file"
            fi
        done
        echo "$IP" > "$SAVE_IP_FILE"

        sudo nginx -s reload
    else
      echo "IP zgodnie - nic nie robie"
    fi
fi