NAT 1: 1 con diverse LAN identiche


13

Voglio connettere diverse LAN situate su edifici remoti.
Il sito "centrale" ha un computer Linux che esegue OpenVPN. Ogni sito remoto esegue anche OpenVPN.

  1. il sito centrale ha una LAN numerata 192.168.0.0/24
  2. numerosi siti remoti sono anche numerati 192.168.0.0/24
  3. Non posso / non voglio / non voglio / comunque modificare la numerazione LAN
  4. Non ho controllo sulla maggior parte degli OpenVPN remoti

Devo quindi:
1. definire le LAN virtuali
2. configurare un NAT 1: 1 per ciascun sito
3. il NAT 1: 1 deve essere configurato sul router centrale

Mappa LAN .
Quindi ogni sito ha una LAN 10.10.x.0 / 24.
Quando un computer vuole raggiungere, ad esempio, 192.168.0.44 sul sito 12, deve solo inviare un paquet al 10.10.12.44

Gestire una VPN non è un problema per me. Attualmente collego oltre 60 siti. Ma non trovo un modo semplice per fare questo NAT 1: 1.

Ecco un esempio di un pacchetto inviato dal sito centrale a un sito remoto e il suo pacchetto di risposta:

inserisci qui la descrizione dell'immagine

Ho fatto alcuni test con iptables NETMAP ma non riesco a farlo funzionare perché non trovo un modo per modificare sorgente + destinazione dopo la decisione di routing.
Preferisco evitare la nuova --client-natfunzionalità di OpenVPN.
Forse devo forzare il routing con ip route? O eseguire il looping doppio nello stack di rete con veth?

Nota: non voglio usare il travestimento. Solo 1/1 NAT.

EDIT:
non è possibile con una normale configurazione openVPN. Perché un pacchetto da un sito remoto è indistinguibile da un pacchetto da un altro sito: entrambi hanno indirizzi di origine e destinazione simili ed entrambi provengono dalla stessa interfaccia tun (o tap). Quindi non è possibile effettuare il source-NAT.

Soluzione 1: eseguire il NAT sui siti remoti. Non è possibile nel mio caso. Devo farlo solo sul sito centrale.

Soluzione 2: imposta una VPN per ciascun sito remoto. Quindi avrò un tun per ciascuno. Penso che questo possa essere ok. Non molto efficiente in termini di memoria ma ok.

Soluzione 3: imposta un tunnel (non crittografato) all'interno della VPN per ciascun sito. Ciò fornirà un'interfaccia per ciascuno. I tunnel semplici non sono multipiattaforma (per la mia conoscenza). Ad esempio GRE o ipip o sit sono ok per Linux, ma alcuni siti distanti eseguono solo un computer Windows, quindi openVPN è installato su di esso. Così impossibile installare un semplice tunnel. Un'altra opzione è quella di utilizzare un tunnel più complicato (quale?) Ma l'overhead sul sistema e sul sysadmin potrebbe essere più grande di avere più VPN

Soluzione 4: compilare l'ultimo openVPN, perché include una funzionalità NAT 1: 1. Lo provo questa settimana.


1
Per la soluzione 4 non è necessario compilare. La maggior parte delle principali distribuzioni Linux ha compilato pacchetti sul sito Web ufficiale di openVPN. Ma questo non funzionerà per te perché la funzione --client-nat è un'opzione stimabile. Quindi i tuoi clienti devono usare anche l'ultima versione di RC (e dici di non avere il controllo sui siti remoti).
Gregory MOUSSAT,

1
Bene, mi sbaglio: la funzione --client-nat è al 100% all'interno di OpenVPN (pensavo stesse usando ipfilter). Ho appena provato: funziona anche su Windows. Vedi la mia soluzione di seguito.
Gregory MOUSSAT,

Vorrei sapere se hai mai avuto questo lavoro e cosa hai fatto.
Michael Grant,

Risposte:


2

Una soluzione molto semplice è:
1. usa OpenVPN 2.3 o più (attualmente, l'ultimo è 2.3-alpha) per server + client
2. usa l'opzione di configurazione OpenVPN di seguito
3. non usare nient'altro (nessun ipfilter, nessun trucco)

Sul lato server, è necessario distribuire manualmente gli indirizzi VPN (quindi nessuna serveropzione, è necessario utilizzare ifconfigo ifconfig-push):

# /etc/openvpn/server.conf
ifconfig 10.99.99.1 10.99.99.2
route 10.99.99.0 255.255.255.0
push "route 10.99.99.0 255.255.255.0"
push "client-nat dnat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat dnat 10.99.99.12 255.255.255.255 10.10.112.12"
push "client-nat dnat 10.99.99.13 255.255.255.255 10.10.113.13"

Le linee routee push routee client-natsono necessarie se si desidera comunicare direttamente tra i router ( ping 10.99.99.1da un sito distante attraverso la VPN). Altrimenti puoi scartarli.

.

.

Ora devi scegliere un indirizzo di rete virtuale. Ho mantenuto lo stesso che hai usato nel tuo esempio: 10.10.0.0/16
Consenti il ​​routing per questo:

# /etc/openvpn/server.conf
route 10.10.0.0 255.255.0.0
push "route 10.10.0.0   255.255.0.0"

.

.

Ora devi indicare al client di utilizzare il NAT 1: 1:

# /etc/openvpn/ccd/client_11
ifconfig-push 10.99.99.11 10.99.99.1
push "client-nat snat 10.99.99.11 255.255.255.255 10.10.111.11"
push "client-nat snat 192.168.0.0 255.255.255.0 10.10.11.0"
push "client-nat dnat 10.10.10.0 255.255.255.0 192.168.0.0"
iroute 10.10.11.0 255.255.255.0
iroute 10.10.111.0 255.255.255.0

La prima riga imposta l'indirizzo del router remoto. Fai attenzione al driver di Windows che richiede indirizzi speciali.
La seconda e ultima linea consentono al router distante di comunicare dalla sua interfaccia 10.99.99.x.
La terza e la quarta riga eseguono l'origine e la destinazione 1: 1 NAT
La quinta riga indica a OpenVPN cosa fare con i pacchetti corrispondenti.

Questo metodo consente di connettere siti con indirizzi LAN identici (o meno), senza alcun host ombreggiato.


1
Semplice, geniale.
Bertrand SCHITS

Ho provato questo ma non sono riuscito a farlo funzionare. Sto usando Linux su entrambi i lati. Qualcosa è strano o non capisco qualcosa completamente. Il tuo ifconfig-push nel file client_11 (prima riga), non dovrebbe essere una maschera di rete per il secondo argomento invece di 10.99.99.1? Secondo, perché stai usando questa terza rete 10.10.111.0/24? Sembra che tu stia cercando di utilizzare la rete 111 per la comunicazione tra i siti, la rete 10.10 non può essere utilizzata direttamente per quello? Infine, indipendentemente da ciò che provo, non vedo (in tcpdump) lo snat e il dnat che interessano i pacchetti sul client.
Michael Grant,

Non proprio semplice ma comunque geniale.
Neurotrasmettitore

4

Ho fatto qualcosa di simile con le interfacce reali, ma non riesco a capire perché non funzionerebbe con le interfacce VPN.

L'idea è che, poiché hai la stessa sottorete disponibile su interfacce diverse su quel router, ciò complica il routing. Fondamentalmente, quando un pacchetto per 10.10.13.123 entra nel router, viene DNATed prima del routing a 192.168.0.123, quindi devi essere in grado di dire al routing che era destinato al 192.168.0.123 sull'interfaccia VPN13 .

Ciò può essere fatto utilizzando i segni del firewall e le regole di routing che utilizzano tali segni. SNAT e DNAT devono essere eseguiti con la destinazione firewall NETMAP. Per SNAT, è lo stesso problema, in POSTROUTING, hai perso le informazioni che il pacchetto proveniva da questa o quella interfaccia e hanno tutti l'indirizzo sorgente 192.168.0.x. Quindi hai bisogno anche di un marchio per trasportare quelle informazioni da mangle-PREROUTING a nat-POSTROUTING. È possibile utilizzare lo stesso segno, ma ciò significherebbe che quei pacchetti utilizzerebbero quella tabella di routing alternativa, quindi è necessario duplicare la tabella di routing globale su tutti.

Per ogni rete, faresti:

lnet=192.168.0.0/24
if10=eth0 if11=tun0 if12=tun1 if13=tun2

n=0
for site in 10 11 12 13; do
  table=$site
  net=10.10.$site.0/24
  n=$(($n + 1))
  eval "interface=\$if$site"
  inmark=$(($n * 2)) outmark=$(($n * 2 + 1))

  iptables -t nat -A PREROUTING -d "$net" -j NETMAP --to "$lnet"
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -m mark --mark "$inmark"/0xf -j NETMAP --to "$net"
  iptables -t mangle -A PREROUTING -i "$interface" -j MARK --set-mark "$inmark"/0xf
  iptables -t mangle -A PREROUTING -d "$net" -j MARK --set-mark "$outmark"/0xf
  ip rule add fwmark "$outmark"/0xf table "$table"
  ip route add "$lnet" dev "$interface" table "$table"
done

Sopra, stiamo usando i primi 4 bit del segno , per consentire a un massimo di 7 reti di essere instradate in quel modo.


1
Grazie per la tua risposta. L'ho provato ma non funziona. Ho provato con una sola LAN, senza più risultati. Uso tcpdump per monitorare i pacchetti e quando invio un pacchetto dal sito remoto a centrale, non vedo nemmeno nulla (?! Come è possibile?). Con le tue indicazioni, provo a costruire la mia risposta graduale. Non sono sicuro che ci riuscirò.
Bertrand SCHITS

2
La mia risposta riguarda solo cosa fare sul sito centrale. Presumo che tu abbia configurato correttamente il routing sugli altri siti. Ad esempio, probabilmente è necessario aggiungere una route al 10.10.0.0/16 tramite il tunnel VPN sui siti remoti. Potrebbe anche essere necessario dire a openvpn di far passare quei pacchetti. In ogni caso, usando tcpdump per vedere quali pacchetti ottengono dove e come è l'approccio giusto. il target del registro iptables è anche tuo amico.
Stéphane Chazelas,

2
Se non vedi pacchetti, devi guardare nel tuo registro openvpn. Probabilmente troverai pacchetti rilasciati. In tal caso, utilizzare un "iroute 192.168.0.0 255.255.255.0" per ciascun client nella
directory
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.