Geo Blocking

Rád bych se zeptal, jestli je možné na VPS nějak nasadit geo blocking?

Mám tam “gateway”/reverzní proxy, která pak typicky posílá po VPN traffic na endpointy u mě doma za NATem. A pak tam mám také DNS server (AdGuard Home, běží přímo na VPS, a dokud jsem měl vystavený port 53, byl poměrně intenzivně zneužíván).

Myslel jsem, že když si poladím iptables (OS je Debian 12), tak si geo blocking zařídim sám.

Jenže jak jsem to teď zkoušel, tak to vypadá, že před VPS je ještě NAT (nebo nějaký jiný prvek), a traffic na VPS teče vždy z privátního rozsahu. Privátní rozsahy ale musím nechat povolené minimálně kvůli Dockeru a VPN, a předpokládám, že jsou také potřeba pro funkčnost v rámci VPSFree infrastruktury.

Takže ale realisticky mi blokování na úrovni iptables nefunguje, protože i když NAT před VPS posílá správně “X-Forwarded-For”, tak ale traffic samotný vypadá, že přichází z privátního rozsahu (např. 172.18.0.1:47492).

Chápu situaci správně? Napadá vás nějaké řešení?

Nejspis ne, my s trafficem nic takoveho za tebe nedelame, to si musis nejakym zpusobem delat sam :slight_smile:

1 Like

Je pravda, ze to vevnitr routujeme po privatnich adresach, to jo, ale 172.18/16 je pridelene na VPSkach, ktere chteji mit privatni adresy, konkretne tu 172.18.0.1 nekdo ma, takze pokud z ni neco chodi a neni zrovna tvoje a nechces to tam, muzeme mu napsat :slight_smile:

Routuje se pres 172.16.{254,253}/24 a v brne pres 172.19.0.0/24 (subject to change), to by ale nemelo mit vliv na charakter trafficu, co pres to plave.

@ Geoblocking, jaky to ma use-case? Jestli to vubec ma cenu resit, protoze pri fragmentaci ipv4 adresniho prostoru, jaka je, to bude hodne pravidel, aby se spolehlive vyblokovala nejaka konkretni zeme - a taky to bude chtit pravidelne aktualizovat - no a ta zadarmo dostupna verze GeoIP DB na to zas tak uplne nestaci.

Já mám podezření, že ta 172.18.0.1:47492 bude nějaká proxyna Dockeru. Budu si s tím muset ještě hrát.

To, co jsem z ní viděl, bylo iniciovaný ode mně, takže pravděpodobně v tom nemá prsty nikdo z jiné VPSky :slight_smile:

Ten geo blocking by mě lákal po tom, co jsem viděl, co mi chodí na ten AdGuard, spíš si to vyzkoušet tak nějak principiálně :slightly_smiling_face: Vyzkoušet, naučit se to (konečně mě to nutí učit se iptables :smiley: ) a ochránit si rovnou i ostatní věci, co mam za tou reverzní proxynou.

Cesta, zdá se, by mohlo být pravidelné stahování DB z country-ip-blocks/ipv4 at master · herrbischoff/country-ip-blocks · GitHub a vytvoření a implementace ipsetu do iptables.

Ale tam ještě nejsem, zatím jsem chtěl jenom povolit ty privátní range, povolit svojí IP, ostatní dropovat a myslel jsem, že pak se tam z VPNky (z UK) nedostanu, ale bohužel jsem se tam dostal :smiley:

Díky moc za reakce, pokračovat s hraním budu zase až tak koncem týdne.

1 Like

nebylo by lepší mít whitelist než blacklist? to by ten seznam pravidel pro iptables mohl být možná menší při blokaci mnoho zemí. pokud jen nějaké země(pár zemí) tak spíš ten blacklist. Nevím jak máš řešený server a věci v něm, ale pokud používáš docker, tak to vypadá, že se ti provoz z venku NATuje do privátního rozsahu, ale je to jen spekulace.

1 Like

Podle toho rozsahu to temer urcite nebude vina vpsFree, ale Dockeru :)) V zakladu, pokud kontejnery nijak nenastavis, tak jsou za NATem. Muzes teoreticky pouzit network_mode: host (--net=host u docker run), ale tim prijdes o nektere “bezpecnostni” benefity toho NATovani, ze. X-Forwarded-For, kterej muze neco nekde nastavovat, je HTTP (L7), takze L3 iptables o tom nema ani paru. Asi bych doporucil se v tomhle pripade vykaslat na iptables a resit to nejak na aplikacni vrstve (nginx s nejakym GeoIP modulem jako reverzni proxy). Kazdopadne i tak je zvlastni, ze tam vubec tu hlavicku mas. Neni uz soucasti toho adguardu nejaka proxyna?

1 Like

Díky všem za reakce

Posunul jsem se dál, zjistil jsem, že nastavením INPUT chainu jsem schopen zablokovat např. SSH, ale HTTP/S mi pořád fungovalo.

Tak jsem pátral, jak fungují ty iptables s Dockerem a vskutku - Docker si managuje pravidla sám a výchozí INPUT obchází.

Když jsem stejný pravidla nasadil do DOCKER-USER chainu, začalo se to chovat, jak jsem očekával.

DOCKER-USER chain by měl údajně být určenej pro implementaci takovýhle custom rules, prý se vyhodnocuje dřív, než ty další Docker chainy.

@rhscz Ano, chci to udělat jako whitelist.

@lukastesar Jako rproxy používam Traefik a zatím bych se ho chtěl držet, a nenašel jsem tam uspokojivej způsob tý geoblokace. Existuje plugin, ale ten funguje pouze na HTTP(S) “routery”, jenže já potřebuju pokrýt i TCP a UDP “routery”, což jsem nenašel, jak nějak rozumně udělat.

Kromě toho, ten AdGuard přes Traefik ani prakticky neproxuju. Pro 443 mam TCP passthrough, kam geoblokaci nemůžu implementovat, a 853 je exposnutej přímo a Traefik obchází.

Ale hlavně principiálně mi přijde, vzhledem k tomu, že tim chci chránit např. i to SSH, tak tohle by přeci mělo být správně implmentovaný už na úrovni těch iptables (L3), které mají dělat firewall a chránit všechno, ať už na serveru běží jakákoliv aplikace :slight_smile: