GNU/Linux >> Linux Esercitazione >  >> Linux

Linux:instradamento basato sui nomi di dominio

Il routing basato sul dominio di destinazione non è impossibile e, con gli strumenti giusti, non è poi così difficile.

Presenterò alcuni metodi che richiedono poca o nessuna configurazione speciale lato client. Tutti presumono che tu stia utilizzando OpenVPN per la connessione. Ciò dovrebbe essere realizzabile con altre VPN, ma potrebbe richiedere una configurazione manuale più complessa dopo l'attivazione della VPN.

Ad esempio, utilizzerò i domini "example.com", "us1.example.com", "us2.example.com" e "geoblocked.com" per i domini che vogliamo instradare attraverso la rete non VPN interfaccia.

Tutti i comandi devono essere eseguiti come root.

Metodo 1 - OpenVPN

Lo consiglierei solo se sei sicuro che gli indirizzi IP che stai instradando abbiano IP statici che non cambiano mai.

Pro:

  • Estremamente semplice

Contro:

  • Affidabile solo per domini con IP che mai cambiare
  • È necessaria una voce esplicita per ogni dominio e sottodominio

Metodo:

Aggiungi le seguenti righe alla tua configurazione OpenVPN:

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

Riavvia OpenVPN.

Questo è tutto, ma dovrai riavviare di nuovo la VPN se quegli indirizzi IP dovessero cambiare.

NOTA :Alcune fonti dicono che devi specificare anche allow-pull-fqdn , ma non sembrava essere il caso nella mia esperienza. YMMV.

Metodo 2 - Instradamento basato su criteri

Il routing basato su criteri è la capacità di instradare in base a determinati criteri; comunemente un indirizzo o un protocollo di origine, ma in questo caso ispezioneremo il nome del dominio di destinazione prima dell'instradamento e utilizzeremo i pacchetti contrassegnati ("fwmark").

Quindi quello che dobbiamo fare prima è creare una tabella separata per i tuoi routepacket VPN, in modo da poter contrassegnare quelli che passano attraverso la VPN e passare i pacchetti contrassegnati attraverso l'interfaccia non VPN. (Tieni presente che questo è un approccio e ci sono molti altri modi per affrontarlo, come lasciare che la VPN esegua il suo instradamento normalmente attraverso la tabella principale e creare una tabella separata per il traffico non VPN.)

Il tuo kernel deve essere abbastanza recente e avere i moduli appropriati, anche se i sistemi moderni probabilmente li hanno nei loro kernel predefiniti.

Il nome "vpn_table" (il nome della tabella di routing) e i numeri "201" (ID tabella di routing) e "3" (fwmark) sono scelti arbitrariamente.

Crea la nuova tabella di routing (come root):

echo 201 vpn_table >> /etc/iproute2/rt_tables

Configura OpenVPN:

Crea il seguente script da qualche parte (lo chiamo "/etc/openvpn/client/setup-routing") e rendilo eseguibile:

#!/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

Le variabili nello script precedente verranno popolate come variabili di ambiente da OpenVPN. Nota anche che questo imposta il routing a all indirizzi tramite il gateway VPN nella tabella di routing "vpn_table". Se la configurazione della tua VPN richiede un routing più complesso, fai riferimento alla documentazione di OpenVPN e regolati di conseguenza.

Aggiungi quanto segue alla tua configurazione OpenVPN:

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

La riga "route-noexec" consente a OpenVPN di recuperare il percorso dal server, ma gli impedisce di popolare effettivamente i percorsi. Invece viene chiamato lo script route-up. "script-security 2" è necessario per chiamare uno script definito dall'utente.

Questa è tutta la configurazione necessaria per instradare i pacchetti contrassegnati, ma dobbiamo impostare un modo per contrassegnare effettivamente i pacchetti. Due opzioni sono l'utilizzo di dnsmasq con ipset o l'impostazione di un proxy squid.

Metodo 2a - Instradamento basato su policy utilizzando ipset e dnsmasq

Consiglierei questo metodo se lo stai già eseguendo su un router basato su dnsmasq o se i tuoi client non supportano la configurazione proxy. Questo è effettivamente lo stesso di un DNS di memorizzazione nella cache che aggiorna la tabella di routing ogni volta che viene cercato un nome di dominio.

Pro:

  • Gestisce i sottodomini
  • Funziona su dispositivi che non possono accedere ai proxy (esistono quelli?)

Contro:

  • Non gestisce il campo referrer (vedi Metodo 2b)
  • Richiede complicate configurazioni di ipset e iptables
  • Richiede che il sistema connesso alla VPN sia configurato come router (richiede un'interfaccia dedicata)
  • Non ho idea di quanto sia scalabile l'ipset (il mio caso d'uso è per un intero ccTLD)

Ciò presuppone che tu abbia già configurato e impostato dnsmasq e che agisca come gateway e server DNS per i client connessi a un'interfaccia dedicata "eth1".

Crea l'ipset:

ipset create SKIP_VPN_IPSET iphash

Di' a iptables di contrassegnare i pacchetti ipset (n.b., questo deve essere fatto dopo creazione dell'elenco 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

NOTA :I comandi precedenti (ipset e iptables ) deve essere eseguito ad ogni avvio. In alternativa, il tuo sistema operativo potrebbe fornire alcune opzioni per il salvataggio/ripristino di regole iptable e ipset.

NOTA2 :È documentato un ! --match-set inverso ma ciò ha provocato la scomparsa di tutti i pacchetti quando l'ho provato.

Aggiungi quanto segue al tuo dnsmasq.conf:

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

Ovviamente regola anche quella riga a seconda dei nomi di dominio che desideri instradare. Questo aggiungerà anche ALL sottodomini all'ipset, quindi non è necessario specificarli esplicitamente. Anche l'utilizzo di un TLD funzionerà.

Riavvia dnsmasq e configura i tuoi client in modo che utilizzino il sistema connesso alla VPN sia come gateway che come DNS (che dovrebbe essere implicito se è configurato come server DHCP).

Metodo 2b - Instradamento basato su policy utilizzando squid

Questo è il mio metodo preferito e funziona bene con la mia PS4 e altri dispositivi che utilizzo per connettermi.

Pro:

  • Gestisce i sottodomini
  • Gestisce il campo referrer
  • Non richiede la sostituzione del router esistente
  • I client (browser) possono facoltativamente utilizzarlo o meno

Contro:

  • I client devono supportare la connessione proxy

Ciò presuppone che tu abbia una configurazione di squid funzionante e una conoscenza di base della configurazione di squid.

Aggiungi le seguenti righe a 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

Nota che ci sono 2 righe per dominio e i sottodomini sono abbinati. La prima riga controlla il dominio di destinazione e la seconda corrisponde all'intestazione "Referer". Ciò è utile perché i browser inviano il referer durante il recupero di contenuti su una pagina Web come immagini, CSS o javascript; ciò significa che anche il contenuto richiesto dal sito passerà attraverso l'indirizzo non VPN anche se è ospitato su un dominio diverso (ad es. example-cdn.com).

Sui client, imposta la connessione come di consueto ma imposta le impostazioni proxy per utilizzare il server proxy e la porta per questo sistema. La maggior parte dei dispositivi (comprese le console di gioco) consente la configurazione a livello di sistema. Su PC, la maggior parte dei browser può essere configurata per utilizzare un proxy indipendentemente dalle impostazioni di sistema.

Nota finale:il mio caso d'uso è in realtà quello di instradare domini specifici attraverso la VPN e tutto il resto attraverso la non VPN. I metodi sono simili ai precedenti, ma invertiti.


Ti consiglierei di evitare di gestire il routing basato sui nomi di dominio (a proposito, è anche impossibile risolvere il sottodominio con caratteri jolly, che si tratti di punti bonus o meno :D)

Per essere un po' descrittivo, non dovresti farlo perché:

1) alcuni domini cambiano i loro IP di volta in volta,

2) è impossibile abbinare i caratteri jolly nei sottodomini

3) è impossibile conoscere/recuperare tutti i sottodomini di qualsiasi dominio

4) qualsiasi sottodominio casuale può avere qualsiasi indirizzo IP casuale.

Quindi, la soluzione come componente aggiuntivo del browser (e/o proxy locale personalizzato come squid) è l'opzione migliore per il tuo problema.

Ma, immagino, l'addon "FoxyProxy" (originariamente è l'addon di Firefox, ma AFAIRC, esiste anche la versione di Chrome) è esattamente quello che vuoi.

E, inoltre, in risposta al tuo avviso che "FoxyProxy è un servizio a pagamento e hai già la tua VPN":

FoxyProxyPiù è un servizio a pagamento, ma non FoxyProxy.

FoxyProxy è un componente aggiuntivo, disponibile per i principali browser:

Edizione standard (Firefox) | Edizione base (Firefox)

Edizione Standard (Chrom{e,ium}) | Edizione base (Chrom{e,ium})

Quindi, se vuoi accedere ad alcuni domini tramite VPN, dovresti:

1) scrivi regole per foxyproxy per passare attraverso la tua istanza squid per l'elenco dei domini

2) e/o scrivere l'elenco delle regole per squid

3) acquisire il traffico http/https non di proprietà da squid con iptables e indirizzarlo a squid con una regola come questa:

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 potrebbe essere necessaria l'opzione per -p tcp)

4) acquisire il traffico http/https di proprietà da squid e contrassegnalo per il prossimo instradamento alla VPN con regole come questa:

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

dove 10.0.0.1 sei il tuo gateway all'interno della VPN. Oppure puoi usare dev $VPN_IF invece di via 10.0.0.1 se non hai un gateway e vuoi solo spingere tutto il traffico nell'interfaccia VPN.

6) facoltativamente, potrebbe essere necessario eseguire sudo sysctl ipv4.conf.all.rp_filter =0

===

E ancora una cosa:

Se vuoi fare la stessa magia con il traffico TCP non http(s), avrai bisogno di qualcosa come proxychain ed eseguire simili magie di cattura.

E, se vuoi fare quella magia con UDP, ho una brutta notizia:non conosco nessun proxy in grado di eseguire il proxy di UDP (a causa della natura di questo protocollo) :)

⇓⇓⇓ MODIFICA ⇓⇓⇓

Nel caso in cui desideri la cosa inversa (predefinito gw =vpn e regola alcuni domini direttamente tramite ISP), può essere:

1) scrivi regole per foxyproxy per passare attraverso la tua istanza squid per l'elenco dei domini

2) catturare il traffico di proprietà da squid e contrassegnalo per il prossimo instradamento in un altro modo con una regola come questa:

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

dove ISP_GW è il gateway che utilizzi per instradare il traffico al tuo server VPN. Alcuni utenti potrebbero voler utilizzare dev ppp0 (o ppp1 , ..., pppN ) invece di via ${ISP_GW} nel caso in cui utilizzino pptp per connettersi a Internet.


Linux
  1. Il comando nslookup Linux spiegato con esempi

  2. 5 migliori strumenti di monitoraggio Linux basati su terminale

  3. Come visualizzare la tabella di routing in Linux

  4. Linux recupera i nomi dei monitor

  5. Android - Su quale distribuzione Linux si basa Android?

Le migliori distribuzioni Linux basate su KDE

Come trovare file in base alle loro autorizzazioni in Linux

Comando host in Linux

Come trovare file basati su timestamp in Linux

5 migliori distribuzioni Linux basate su Arch Linux

route Esempi di comandi in Linux