GNU/Linux >> Znalost Linux >  >> Linux

Linux:směrování založené na názvech domén

Směrování na základě cílové domény není nemožné a se správnými nástroji není tak těžké.

Uvedu několik metod, které vyžadují malou nebo žádnou speciální konfiguraci na straně klienta. To vše předpokládá, že k připojení používáte OpenVPN. Toho by mělo být dosažitelné s jinými VPN, ale po spuštění VPN může vyžadovat další ruční konfiguraci.

Pro účely například použiji domény „example.com“, „us1.example.com“, „us2.example.com“ a „geoblocked.com“ pro domény, které chceme směrovat přes síť bez VPN. rozhraní.

Všechny příkazy by měly být spouštěny jako root.

Metoda 1 – OpenVPN

Doporučil bych to pouze tehdy, pokud jste si jisti, že IP adresy, které směrujete, mají statické IP adresy, které se nikdy nemění.

Výhody:

  • Extrémně jednoduché

Nevýhody:

  • Spolehlivé pouze pro domény s adresami IP, které nikdy změnit
  • Potřebujete explicitní záznam pro každou doménu a subdoménu

Metoda:

Přidejte do své konfigurace OpenVPN následující řádky:

route example.com     255.255.255.255 net_gateway
route us1.example.com 255.255.255.255 net_gateway
route us2.example.com 255.255.255.255 net_gateway
route geoblocked.com  255.255.255.255 net_gateway

Restartujte OpenVPN.

To je vše, ale pokud se tyto IP adresy někdy změní, budete muset znovu restartovat VPN.

POZNÁMKA :Některé zdroje uvádějí, že je také nutné zadat allow-pull-fqdn , ale podle mých zkušeností tomu tak nebylo. YMMV.

Metoda 2 – směrování založené na zásadách

Směrování založené na zásadách je schopnost směrovat na základě určitých kritérií; obvykle zdrojovou adresu nebo protokol, ale v tomto případě před směrováním zkontrolujeme název cílové domény a použijeme označené pakety ("fwmark").

Nejprve tedy musíme vytvořit samostatnou tabulku pro vaše VPN směrované pakety, abychom mohli označit ty, které procházejí přes VPN, a předat označené pakety přes rozhraní bez VPN. (Mějte na paměti, že toto je jeden přístup a existuje mnoho dalších způsobů, jak k tomu přistoupit, například nechat VPN, aby směrovala jako obvykle přes hlavní tabulku a vytvořit samostatnou tabulku pro provoz mimo VPN.)

Vaše jádro musí být dostatečně aktuální a mít správné moduly, ačkoli moderní systémy je pravděpodobně mají ve výchozích jádrech.

Název "vpn_table" (název směrovací tabulky) a čísla "201" (ID směrovací tabulky) a "3" (fwmark) jsou zvoleny libovolně.

Vytvořte novou směrovací tabulku (jako root):

echo 201 vpn_table >> /etc/iproute2/rt_tables

Nakonfigurujte OpenVPN:

Někde vytvořte následující skript (já mu říkám "/etc/openvpn/client/setup-routing") a udělejte jej spustitelný:

#!/bin/bash
ip route add 0.0.0.0/1 via $route_vpn_gateway dev $dev scope global table vpn_table
ip route add 128.0.0.0/1 via $route_vpn_gateway dev $dev scope global table vpn_table
sysctl -w net.ipv4.conf.$dev.rp_filter=2

# You can optionally leave the next two lines out but run the `ip rule add`
# command at each boot instead
ip rule del fwmark 3 table vpn_table &>/dev/null # This might fail but that's ok
ip rule add fwmark 3 table vpn_table

Proměnné ve výše uvedeném skriptu vyplní OpenVPN jako proměnné prostředí. Všimněte si také, že se tím nastaví směrování na vše adresy přes bránu VPN ve směrovací tabulce "vpn_table". Pokud vaše nastavení VPN vyžaduje složitější směrování, podívejte se do dokumentace OpenVPN a podle toho upravte.

Přidejte do své konfigurace OpenVPN následující:

## Policy routing
route-noexec
script-security 2
route-up /etc/openvpn/client/setup-routing

Řádek „route-noexec“ umožňuje OpenVPN načíst trasu ze serveru, ale brání mu ve skutečném naplnění tras. Místo toho je zavolán směrovací skript. "script-security 2" je nezbytný pro volání skriptu definovaného uživatelem.

To je vše potřebné pro směrování označených paketů, ale musíme nastavit způsob, jak pakety skutečně označit. Dvě možnosti jsou použití dnsmasq s ipsetem nebo nastavení squid proxy.

Metoda 2a – směrování založené na zásadách pomocí ipset a dnsmasq

Tuto metodu bych doporučil, pokud ji již používáte na routeru založeném na dnsmasq nebo vaši klienti nepodporují konfiguraci proxy. To je v podstatě stejné jako cache DNS, která aktualizuje směrovací tabulku při každém vyhledání názvu domény.

Výhody:

  • Zpracovává subdomény
  • Funguje na zařízeních, která nemají přístup k serverům proxy (existují?)

Nevýhody:

  • Nezpracovává pole referrer (viz metoda 2b)
  • Potřebuje složité konfigurace ipset a iptables
  • Vyžaduje, aby byl systém připojený k síti VPN nastaven jako směrovač (vyžaduje vyhrazené rozhraní)
  • Nemám ponětí, jak škálovatelný je ipset (můj případ použití je pro celou ccTLD)

To předpokládá, že již máte dnsmasq nakonfigurovaný a nastavený a funguje jako brána a DNS server pro klienty připojené k vyhrazenému rozhraní "eth1".

Vytvořte soubor ipset:

ipset create SKIP_VPN_IPSET iphash

Řekněte iptables, aby označili pakety ipset (pozn. toto musí provést po vytvoření seznamu ipset):

# Mark ALL packets coming in on eth1 - change this to the interface dnsmasq listens on
iptables -A PREROUTING -i eth1 -t mangle -j MARK --set-mark 3

# REMOVE mark on any addresses that match our ipset
iptables -A PREROUTING -t mangle -m set --match-set SKIP_VPN_IPSET dst -j MARK --set-mark 0/3

POZNÁMKA :Výše ​​uvedené příkazy (ipset a iptables ) musí být spuštěn při každém spuštění. Alternativně může váš operační systém poskytovat některé možnosti pro ukládání/obnovu pravidel iptable a sad ips.

POZNÁMKA 2 :Je zdokumentován inverzní ! --match-set ale to vedlo k tomu, že všechny pakety zmizely, když jsem to zkusil.

Přidejte do svého dnsmasq.conf následující:

ipset=/example.com/geoblocked.com/SKIP_VPN_IPSET

Samozřejmě upravte i tento řádek podle toho, která doménová jména chcete směrovat. Tím také přidáte VŠE subdomény k ipsetu, takže je nemusíte výslovně specifikovat. I použití TLD bude fungovat.

Restartujte dnsmasq a nastavte své klienty tak, aby používali systém připojený k VPN jako bránu i DNS (což by mělo být zahrnuto, pokud je nastaven jako server DHCP).

Metoda 2b – Směrování založené na zásadách pomocí squid

Toto je můj oblíbený způsob a funguje dobře s mým PS4 a dalšími zařízeními, která používám k připojení.

Výhody:

  • Zpracovává subdomény
  • Zpracovává pole referrer
  • Nevyžaduje výměnu stávajícího směrovače
  • Klienti (prohlížeče) jej mohou volitelně používat nebo ne

Nevýhody:

  • Klienti musí podporovat připojení proxy

To předpokládá, že máte funkční nastavení olihně a základní znalosti konfigurace olihně.

Přidejte následující řádky do squid.conf:

# redirect example domains
acl domain_to_remote_proxy dstdomain .example.com
acl ref_to_remote_proxy referer_regex [^.]*\.example.com.*

# redirect geoblocked domain
acl domain_to_remote_proxy dstdomain .geoblocked.com
acl ref_to_remote_proxy referer_regex [^.]*\.geoblocked.com.*

# mark packets that we want routed through the VPN
tcp_outgoing_mark 0x03 !ref_to_remote_proxy !domain_to_remote_proxy

Všimněte si, že na doménu jsou 2 řádky a subdomény se shodují. První řádek kontroluje cílovou doménu a druhý odpovídá záhlaví „Referer“. To je užitečné, protože prohlížeče odesílají referer při načítání obsahu na webové stránce, jako jsou obrázky, CSS nebo javascript; to znamená, že obsah požadovaný webem bude také směrován přes jinou adresu než VPN, i když je hostován na jiné doméně (např. example-cdn.com).

Na klientech nastavte připojení jako normální, ale nastavte proxy server tak, aby pro tento systém používal proxy server a port. Většina zařízení (včetně herních konzolí) umožňuje konfiguraci celého systému. Na počítačích lze většinu prohlížečů nakonfigurovat tak, aby používaly proxy nezávisle na nastavení systému.

Závěrečná poznámka – Můj případ použití je ve skutečnosti směrovat konkrétní domény přes VPN a vše ostatní přes non-VPN. Metody jsou podobné výše uvedeným, ale obrácené.


Doporučil bych vám, abyste se vyhnuli správě směrování na základě doménových jmen (mimochodem, je také nemožné vyřešit zástupnou subdoménu, ať už je to bonusové body nebo ne :D)

Abychom byli trochu popisní, neměli byste to dělat, protože:

1) některé domény čas od času mění své IP adresy,

2) není možné přiřadit zástupné znaky v subdoménách

3) není možné znát/načíst všechny subdomény jakékoli domény

4) jakákoli náhodná subdoména může mít libovolnou náhodnou IP adresu.

Takže řešení jako doplněk prohlížeče (a/nebo vlastní místní proxy, jako je chobotnice) je nejlepší volbou pro váš problém.

Ale myslím, že doplněk "FoxyProxy" (původně je to doplněk Firefoxu, ale AFAIRC, pokud existuje verze pro Chrome), je přesně to, co chcete.

A také odpověď na vaše upozornění, že „FoxyProxy je placená služba a vy již máte své vpn“:

FoxyProxyPlus je placená služba, ale ne FoxyProxy.

FoxyProxy je doplněk dostupný pro hlavní prohlížeče:

Standardní vydání (Firefox) | Základní edice (Firefox)

Standard Edition (Chro{e,ium}) | Základní edice (Chrome{e,ium})

Pokud tedy chcete přejít na některé domény prostřednictvím VPN, měli byste:

1) napište pravidla pro foxyproxy, abyste procházeli instancí vaší chobotnice pro seznam domén

2) a/nebo napište seznam pravidel pro olihně

3) zachytit provoz http/https nevlastněný pomocí chobotnice s iptables a nasměrujte ji na chobotnici podle pravidla takto:

iptables -m owner -m multiport -t nat -A OUTPUT ! -o lo ! --uid-owner $squid_user_id -p tcp --dports 80,443,8080,... -j REDIRECT --to-ports $SQUID_PORT

(--syn volba může být nutná pro -p tcp)

4) zachytit provoz http/https vlastněný chobotnicí a označte jej pro další směrování do VPN pomocí tohoto pravidla:

iptables -A OUTPUT -m owner --uid-owner $squid_user_id -j MARK --set-mark 11

5)

echo 11 forcevpn >> /etc/iproute2/rt_tables
ip rule add fwmark 11 table forcevpn
ip route add default via 10.0.0.1 table forcevpn

kde 10.0.0.1 je vaše brána uvnitř VPN. Nebo můžete použít dev $VPN_IF místo via 10.0.0.1 pokud nemáte žádnou bránu a chcete pouze přesunout veškerý provoz do rozhraní vpn.

6) volitelně může být nutné spustit sudo sysctl ipv4.conf.all.rp_filter =0

===

A ještě jedna věc:

Chcete-li provést stejnou magii s provozem TCP, který není protokolem http(s), budete potřebovat něco jako proxychains a provádět podobnou magii zachytávání.

A pokud chcete dělat ta kouzla s UDP, mám špatnou zprávu:neznám žádný proxy schopný proxy UDP (kvůli povaze tohoto protokolu) :)

⇓⇓⇓ UPRAVIT ⇓⇓⇓

V případě, že chcete opak (výchozí gw =vpn a některé domény řídíte přímo přes ISP), může to být:

1) napište pravidla pro foxyproxy, abyste procházeli instancí vaší chobotnice pro seznam domén

2) zachytit provoz vlastněný chobotnicí a označte ji pro další směrování jiným způsobem pomocí pravidla, jako je toto:

iptables -A OUTPUT -m owner --uid-owner $squid_user_id -j MARK --set-mark 11

3)

echo 11 novpn >> /etc/iproute2/rt_tables
ip rule add fwmark 11 table novpn
ip route add default via ${ISP_GW} table novpn

kde ISP_GW je brána, kterou používáte ke směrování provozu na váš server VPN. Někteří uživatelé mohou chtít použít dev ppp0 (nebo ppp1 , ..., pppN ) namísto via ${ISP_GW} v případě, že pro připojení k internetu používají pptp.


Linux
  1. chyba směrování linuxu?

  2. Android – Na jaké linuxové distribuci je Android založen?

  3. Android – Je Android založen na Linuxu?

  1. Příkaz nslookup Linux vysvětlený s příklady

  2. 5 nejlepších nástrojů pro monitorování Linuxu na bázi terminálu

  3. Omezení délky názvu souboru na linuxu?

  1. Lector – čtečka elektronických knih založená na Qt pro Linux

  2. Úvod do linuxových základů směrování IP (část 1)

  3. Jak zobrazit směrovací tabulku v Linuxu