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 distruge
ed cu o singură comandă.