Puncte:2

În Linux, cum să adăugați o rută la un prefix printr-un anumit dispozitiv cu anumite destinații în acel prefix mergând pe ruta implicită?

drapel ke

În prezent, am de-a face cu un VPN al cărui punct final de conectare se află în subrețea și care prefix va fi tunelat prin acel VPN specific.

În esență, problema se rezumă astfel la a se potrivi cu un set (mai mare) de adrese de destinație (mască / 16), cu excepția unui subset (mic) complet de destinații specifice care nu vor fi direcționate în acest fel (și în schimb vor merge pe ruta implicită) .

Dacă problema era legată de filtrare, în Linux utilizarea acestui lucru ar putea fi implementată folosind a ipset înființat ca

ipset creați MyVPN hash:net
ipset adăugați MyVPN $MYVPNNET/$MYVPNMASK
ipset adăugați MyVPN $MYVPNENDPOINT nomatch

Cu toate acestea, astfel de ipseturi pot fi utilizate numai în interiorul netfilter.

Acum întrebarea mea este cum aș putea configura ceva echivalent folosind Linux Advanced IP Routing, adică ruta ip familie de comenzi?

djdomi avatar
drapel za
Întrebările care caută ajutor pentru instalare, configurare sau diagnosticare trebuie să includă starea finală dorită, problema sau eroarea specifică, informații suficiente despre configurație și mediu pentru a o reproduce și soluțiile încercate. Întrebările fără o declarație clară a problemei nu sunt utile altor cititori și este puțin probabil să obțină răspunsuri bune.
datenwolf avatar
drapel ke
@djdomi: Acesta nu caută ajutor pentru o anumită configurație. Caut o modalitate de a defini rutele (într-un mod generalizat) prin eliminarea anumitor subseturi din regula tabelului de rute. Acesta este ceva care poate fi aplicat în tot felul de situații.
Puncte:2
drapel cn

Rutele sunt calculate după o abordare cea mai specifică-prima. Deci, dacă subrețeaua dvs. mică are nevoie de ruta implicită, puneți-o mai întâi și apoi adăugați-le pe celelalte:

Gateway-ul implicit în acest exemplu este 10.0.0.1 VPN este 10.0.0.2

ruta ip adăugați 10.0.1.0/24 prin 10.0.0.1
ruta ip adăugați 10.2.0.0/16 prin 10.0.0.2
ip route add default prin 10.0.0.1

Ar direcționa traficul către subrețea (10.0.1.0) prin gateway implicit, VPN prin 10.0.0.2 și alt trafic implicit prin gateway implicit.

datenwolf avatar
drapel ke
Da, așa procedează majoritatea scripturilor VPN. Dar există o problemă: adăugând o rută îngustă printr-un anumit gateway, o astfel de configurare nu este capabilă să se ocupe fără probleme cu modificările rutei implicite. De exemplu, atunci când comutați rețelele într-o situație de roaming, sau poate chiar ceva atât de simplu precum andocarea laptopului (trecerea de la W-LAN la LAN cu fir). Acest lucru complică în mod inutil lucrurile, deoarece dacă se face așa cum ați sugerat, ar trebui să existe o urmărire continuă a stării rețelei, detectând dacă anumite rute trebuie modificate și tabelele de rutare ajustate.
datenwolf avatar
drapel ke
Ceea ce caut este un echivalent cu *ipset* `nomatch` pentru a evita toate aceste bătăi de cap.
drapel cn
Ah, bine - înțeleg! Voi lăsa răspunsul până să rețin comentariile, deoarece sunt clarificări importante.
djdomi avatar
drapel za
@shearn89 reamintiți-vă dacă vă rezolvă problema, trebuie să o acceptați, altfel vom fi amintiți până la sfârșitul oricărui deceniu...
drapel cn
@djdomi nu sunt OP...
djdomi avatar
drapel za
Yupp nu a defilat suficient mai sus. @datawolf ai fost serios cu comentariul meu
datenwolf avatar
drapel ke
@djdomi: Vezi răspunsul pe care l-am scris, referitor la metoda pe care mi-am dat seama. Voi face din acesta răspunsul acceptat după ce a trecut perioada de grație.
Puncte:2
drapel ke

După cum se dovedește, în Linux se poate folosi ipset potrivire pentru a selecta tabelele de rutare. Ingredientul suplimentar este utilizarea unei reguli netfilter care se va potrivi cu pachetele de ieșire și va aplica a fwmark acestora, care apoi pot fi folosite pentru a selecta un tabel de rutare dedicat. Acest tabel de rutare dedicat va conține apoi doar o singură rută implicită prin VPN.

Iată sub formă de script ideea generală, cum să configurați aceasta.

# Subrețea(e) de rutat prin TUN

DSTNETS=.../...../..

# Excludeți aceste destinații de la rutare prin TUN

EXCLUDE=... ...

# Dispozitiv TUN de utilizat pentru această conexiune și parametrii săi Aceștia sunt de obicei furnizați de demonul VPN

TUNDEV=...
TUNADDR=.../..
TUNPEER=...

# Numele pentru ipsetul folosit pentru a potrivi destinațiile. Bazați-vă pe numele TUN

IPSET=${TUNDEV}ipset

# Avem nevoie de un netfilter fwmark și de un tabel iproute2. fwmarks și tabelele sunt valori pe 32 de biți, limitate la intervalul întreg cu semn, adică [0, 2³¹-1] fwmarks pot fi folosite ca măști de biți care semnalează mai multe steaguri, astfel încât, în funcție de nevoile noastre, fie setați un singur bit anume (sau puțini), fie o valoare foarte specifică care este apoi comparată pentru egalitate.

FWMARK=0x...
TABLE=0x...

# Creați ipset-ul și populați-l cu intervalele de adrese IP și subrețele pentru a se potrivi și nu.

ipset crea $IPSET hash:net
pentru d în $DSTNETS ; do ipset add $IPSET $d ; Terminat
pentru x în $EXCLUDE ; do ipset add $IPSET $x nomatch ; Terminat

# Creați o nouă tabelă de reguli iproute2 care va fi folosită pentru căutarea rutei pentru toate pachetele care au setat fwmark-ul nostru de alegere

regulă ip add fwmark $FWMARK tabel $TABLE

# Aici se întâmplă magia: creați o regulă netfilter care să se potrivească cu pachetele care provin de pe această gazdă, pentru destinațiile care se potrivesc cu ipsetul pe care tocmai l-am creat și marcați-le cu fwmark ales. Datorită regulii pe care tocmai am creat-o înainte, acele pachete vor fi apoi direcționate folosind acel tabel specific, în loc de cele globale.

iptables -t mangle -A OUTPUT -m set --match-set $IPSET dst -j MARK --set-mark $FWMARK

# Adăugați, de asemenea, o regulă netfilter pentru a suprascrie adresa sursă pentru aceste pachete, deoarece rețeaua de destinație le va respinge probabil, dacă nu se potrivesc cu intervalul de adrese utilizat pentru VPN

iptables -t nat -A POSTROUTING -m set --match-set $IPSET dst -j SNAT --la-sursă $INTERNAL_IP4_ADDRESS

# Acum putem configura dispozitivul TUN propriu-zis.Strict vorbind, acești pași ar fi putut fi făcuți înainte, dar pentru o scurtă perioadă de timp între apariția TUN și stabilirea regulilor de rutare, unele pachete ar fi putut ajunge în limbo.

linkul ip setează dev $TUNDEV sus
ip addr addr $TUNADDR peer $TUNPEER dev $TUNDEV 

# În cele din urmă, stabiliți o rută implicită care trece prin TUN în tabelul nostru de rutare dedicat, care din cauza regulii fwmark va fi lovită numai de pachetele care se potrivesc cu ipsetul nostru

ip route add default dev $TUNDEV tabel $TABLE

Pentru a dărâma totul, trebuie doar să urmați scriptul în sens invers, ștergând lucrurile; cel ipset poate fi distrugeed cu o singură comandă.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.