Sei anni dopo sono arrivato a questa domanda e l'ho quasi delusa in base alla risposta accettata. Ad oggi, non è complicato, utilizzando il routing delle politiche. Tutti i dettagli sono disponibili su questo stesso sito, all'indirizzo https://serverfault.com/a/389004/70774.
Nel mio caso, dovevo prima assicurarmi che la VPN non fosse la rotta predefinita. Il modo in cui lo otterrai dipende dal tipo di gestore connessione che stai utilizzando.
Il proxy (tinyproxy) è in esecuzione con il proprio utente, quindi contrassegno tutti i pacchetti provenienti da questo utente con il comando
iptables -t mangle -A OUTPUT -m owner --uid-owner 125 -j MARK --set-mark 2
dove 125
è l'uid dell'utente tinyproxy e 2
è un numero arbitrario, da abbinare in seguito.
Quindi istruisco il sistema di routing affinché utilizzi una tabella specifica per instradare tutte le richieste contrassegnate con 2
.
ip rule add fwmark 2 table 3
Di nuovo, il 3
è solo un numero arbitrario. Fai solo attenzione a scegliere un tavolo inutilizzato (basta vedere se c'è qualcosa sul tavolo con cui scegli con ip route list table 3
).
Quindi compilo la tabella 3
con il mio percorso predefinito:
ip route add default dev ppp0 via proto static scope link metric 1024
L'ultimo passaggio è stato creare una regola mascherata, di cui non comprendo appieno la necessità:
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Et voilà!