nginx location regex

Fórumok

Üdv mindenkinek,

Nginx beállításával kapcsolatban lenne kérdésem.

Szeretném kezelni az ilyen típusú kéréseket is:


185.219.83.63 - - [29/Dec/2017:08:18:52 +0100] "POST /index.php?option=com_users&view=registration HTTP/1.1" 303 - "-" ""
185.219.83.63 - - [29/Dec/2017:08:18:53 +0100] "GET /component/users/?view=registration&layout=complete HTTP/1.1" 200 10560 "-" ""

Az alábbi reguláris kifejezések nem működnek. Mit rontok el?

 location ~* ( ... |registration) { ... } 

vagy

 location ~* ( ... |.*registration.*) { ... } 

A válaszokat előre is köszönöm.

Hozzászólások

Az már query paraméter (GET request).

--
Gábriel Ákos

Ismét elővettem a témát és sajnos nem tudom, hogyan lehetne megoldani az alábbi problémát.

Szeretném az uri (regex) alapján tiltani a tartalom elérést de bizonyos ip címek/tartományok esetén továbbra is elérhetővé tenni.

- Sajnos a location nem tartalmazza a teljes url-t így ott nem működik a regex.
- Az IF direktíva (ahol vizsgálhatnám a teljes url-t) blokkja nem tartalmazhat allow/deny/try_files -t így ott nem lehet ip alapján engedélyezni vagy tiltani a tartalom kiszolgálást.

Hogyan kell/lehet ezt fajta a tartalom szűrést kulturáltan megoldani?

A válaszokat előre is köszönöm.

Két feltétel egyidejű teljesülése esetén kell elutasítani a kérést.

(1) az url illeszkedik egy/több reguláris kifejezésre
(2) a látogató ip címe nem szerepel az engedélyezett ip/ip tartomány listán.

location esetén így néz ki


location ~* (regex1|regex2)
{
   allow 1.2.3.4;
   allow 11.12.13.14;
   allow 21.22.23.24/24;

   ...

   deny  all;
   proxy_pass         http://10.10.10.1:8080;
   proxy_set_header   Host            $host;
   proxy_set_header   X-Real-IP       $remote_addr;
   proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
}

Ez csak korlátozottan jó megoldás mert a location nem vonatkozik a teljes url-re.

Ezt a megoldást szeretném lecserélni egy olyanra ahol a teljes url vizsgálható regex-el.

Tehát IF használatával hogyan néz ki a szintaxis?

Nem (vagy nem értem a kérdést), annyit szeretnék amit a példa konfig részlet csinál. Ha az url illeszkedik valamelyik reguláris kifejezésre és nincs külön engedélyezve a látogató ip címe akkor meg kell tagadni a tartalom kiszolgálását.

A példa konfig jelenleg működik de csak abban az esetben ha a szűrés (regex) a location által lefedett url részlettel egyezik.

Szerintem valahogy elbeszélünk egymás mellett, ami valószínű, hogy az én tudásom felületességén (pontatlanságán) múlik.

Szóval ezt írtad: "Ez csak korlátozottan jó megoldás mert a location nem vonatkozik a teljes url-re."
Ezért kérdezem, hogy mit akarsz még vizsgálni, ami az url-nek része, és a(z nginx-es) location-nek nem.

Pl. a www.example.com/foo/bar esetén a location a /foo/bar-t fogja vizsgálni.
Azaz neked kellhet a www.example.com is (server_name) a tiltáshoz?
Vagy esetleg a www.example.com/foo/bar?variable=value-ből a variable=value kell?

légyszi' az emberiség kedvéért ne error_page-dzsel bűvölj


server {
  location / {
    set $ip_permit 0;
    if ($remote_addr = 1.2.3.4) { set $ip_permit 1; }
    if ($remote_addr = 1.2.3.5) { set $ip_permit 1; }
    if ($remote_addr = 1.2.3.6) { set $ip_permit 1; }
    if ($ip_permit$args ~ ^0.*registration)
    {
      return 403;
    }
    proxy_pass ...
  }
}

a megannyi

if ($remote_addr = )

helyett lehetne valami

map

.

~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack

mert a hibaoldalakhoz találták ki. lehet h egy bizonyos nginx verziónál ki lehet úgy sakkozni a konfigot h ne legyen váraltan mellékhatása, de mivel homlokegyenest nem arra használod amire való, lehet h egy igazi 404-es hibára valami tök más oldalt szolgál ki - jó látom h próbált nem használt hibakódokat felhasználni, de akkor is "beláthatatlan" következményei lehetnek. és aki olvassa a konfigot annak is megtévesztő.

~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack

Egyesvel akarod beengedni az internetrol a gepeket???? Vagy honnan lenne sok ezer IP ebben az esetben?

A whitelist ertelme az lenne, hogy par IP-cimen kivul minden mast tiltasz, azaz ide csak tenyleg 10-es nagysagrendu IP kellene. De a javasolt map eseten meg szepen megadhato lenne, hogy mondjuk csak magyar IP-k, stb, stb.

Ha meg tenlyeg egyesvel akarod eldonteni egy IP-rol, hogy johet e vagy sem, akkor inkabb a tuzfalirany es a manualis vagy automatikus engedelyezes a jo megoldas. Eldobsz mindent elsore, aztan meg egyesevel engedelyezed a tobb ezer(!!!) ip cimet. :D

Sajnos nincs geoip modul...


nginx version: nginx/1.13.6
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_ssl_module
--with-http_ssl_module --with-http_v2_module --with-http_realip_module
--with-http_flv_module --with-http_mp4_module --with-ipv6 --with-http_stub_status_module

rebuild ezzel az opcioval?

Tudom, hogy utana neked kell majd a package-t mainten-elni, de lehet megerne. Nem tudom, hogy ez egy deb vagy rpm alapu distro e, de mindegyiknek pikk-pakk megoldhato a spec atirasa. Utana mar csak egy repo-t kell generalni.

A kerdes, hogy problema orientalt vagy e (midnenaron megoldani valami bonyolult modon), vagy problema megoldo:
* geoip modul (rpm/deb + valamilyen artifactory/repository)
* CDN (by bAndie9100)

Lehet valaki feldob egy harmadik megoldast is. :D

ok. ebbe az nginx telepítésbe csak config szinten nyúlhatsz bele.

mi lenne ha áttennéd egy másik portra és bekonfigolnál reverse proxy-zásra egy másik nginx-et, egy akármilyet, ami az eredeti porton hallgat.
a reverse proxy-n szűröd a dolgokat, esetleg plusz request header-eket teszel rá és proxy_pass-szal átdobod a zárt nginx-nek amiket ki akarsz szolgálni.

~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack

- végy egy CIDR listát
- /8, /16, /24 -ből lesz ^aa\., ^aa\.bb\., ^aa\.bb\.cc\.
- a (k*8)+n maszkok esetén is meg lehet konstruálni egy-egy regexpet, ami lefedi

vagy tedd a site-ot CDN mögé, az berakja header-be hogy milyen országból jön a látogató, pl Cloudflare-nél

CF-IPCountry: HU

~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack

oké, ilyen range-ek legrosszabb esetben ugyanannyi regexp-es if-et adnak, mint amennyi range-ed van.

de én először arra reagáltam, hogy nem kell egy adott range minden egyes ip-jét egyenlőséggel vizsgálni, hanem egy range-ből generálható regexp (ld. https://gist.github.com/bAndie91/e566fcdf3e364716ff9bfb2927bc365f ).

aztán a range-nyi if-et le lehet redukálni egy okos algoritmussal, ami mergeli a mergelhetőt, pl. 1.2.3.0/14, 1.2.4.0/24 => első körben két regexp lesz, merge után meg egy: ^1\.2\.[34]\.

~~~~~~~~
deb http://deb.uucp.hu/ wheezy yazzy repack

pl.:
if ($request_uri = "/index.php?option=com_users&view=registration") {
return 403;
}