Przewiń do głównej treści

#018 - Uzyskiwanie rzeczywistych adresów IP użytkowników za CloudFlare i Nginx w Laravel

·264 słów·2 min· loading · loading ·

Wyzwanie
#

Podczas korzystania z CloudFlare lub Nginx Reverse Proxy z Laravel, często otrzymujemy adresy IP proxy CloudFlare lub serwera proxy zamiast rzeczywistych adresów IP użytkowników. Naprawmy to.

Przegląd rozwiązania
#

  1. Skonfiguruj Nginx do przekazywania nagłówków rzeczywistego IP
  2. Skonfiguruj Laravel do zaufania proxy
  3. Zaktualizuj kod, aby otrzymywać prawidłowe adresy IP

Konfiguracja Nginx
#

Użyłem npm - Nginx Proxy Manager do skonfigurowania Nginx uruchomionego w Dockerze. Link: Nginx Proxy Manager

Dodaj do swojego npm:

obraz

proxy_set_header CF-Connecting-IP $http_cf_connecting_ip;

Zaufane proxy w Laravel
#

Zaktualizuj app/Http/Middleware/TrustProxies.php dodając zaufane proxy CloudFlare

protected $proxies = [
   '173.245.48.0/20',
        '103.21.244.0/22',
        '103.22.200.0/22',
        '103.31.4.0/22',
        '141.101.64.0/18',
        '108.162.192.0/18',
        '190.93.240.0/20',
        '188.114.96.0/20',
        '197.234.240.0/22',
        '198.41.128.0/17',
        '162.158.0.0/15',
        '104.16.0.0/13',
        '104.24.0.0/14',
        '172.64.0.0/13',
        '131.0.72.0/22',
];

protected $headers = Request::HEADER_X_FORWARDED_FOR | 
                    Request::HEADER_X_FORWARDED_HOST | 
                    Request::HEADER_X_FORWARDED_PORT | 
                    Request::HEADER_X_FORWARDED_PROTO;

Pobieranie rzeczywistych adresów IP
#

// Najlepsza metoda
$realIP = request()->ip();

Przykład implementacji
#

Pozwól użytkownikom firmowym z określonych zakresów IP na dostęp do tablicy informacyjnej firmy. Dodaj do routes/web.php

Route::get('/company-board', function (Request $request) {
   // Pobierz rzeczywisty IP 
   $currentIp = request()->ip();
   
   // Pobierz dozwolone adresy IP
   $allowedIps = array_filter(
       array_map('trim', explode(',', env('COMPANY_IPS', ''))), 
       fn($ip) => !empty($ip)
   );

   // Sprawdź dostęp IP
   if (!in_array($currentIp, $allowedIps)) {
       abort(403, 'Ta tablica jest dostępna tylko z sieci firmowej');
   }
 return view('company.board');
})->name('company.board');

Dodaj firmowe adresy IP do .env:

COMPANY_IPS=<company_ip_1>, <company_ip_2>, <company_ip_3>

Utwórz prosty widok dla tablicy firmowej resources/views/company/board.blade.php

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="card">
        <div class="card-header">
            <h3 class="card-title">Witaj na tablicy firmowej</h3>
        </div>
        
        <div class="card-body">
            <div class="text-center p-4">
                <h4>Witaj Firmo!</h4>
                <p class="text-muted">Przeglądasz to z firmowego adresu IP</p>
            </div>
        </div>
    </div>
</div>
@endsection

Podsumowanie
#

Dzięki odpowiedniej konfiguracji Laravel, CloudFlare i Nginx możesz bezpiecznie zarządzać rzeczywistymi adresami IP użytkowników w swojej aplikacji.