Devo ottenere l'indirizzo IP utilizzato come origine per i pacchetti inviati tramite il default
percorso . (EDIT) Si prega di notare che mi riferisco al default
percorso, quello contrassegnato come default
in ip r
(vedi alla fine per il percorso effettivo che i pacchetti prenderanno con la mia configurazione VPN).
La mia prima idea è stata quella di usare ip r
e deduci questo da lì:
# ip r
0.0.0.0/1 via 10.0.2.1 dev tun0
default via 10.237.76.1 dev enxb827eb4297a4 src 10.237.77.206 metric 202
10.0.2.0/24 dev tun0 proto kernel scope link src 10.0.2.100
10.81.102.133 via 10.237.76.1 dev enxb827eb4297a4
10.237.76.0/22 dev enxb827eb4297a4 proto kernel scope link src 10.237.77.206 metric 202
128.0.0.0/1 via 10.0.2.1 dev tun0
Sembrava buono, un ip r | grep default | cut -d" " -f7
mi ha dato il 10.237.77.206
previsto .
Quindi, su un altro sistema (entrambi sono derivati da Debian) ho ottenuto
# ip r
0.0.0.0/1 via 10.0.2.1 dev tun0
default via 10.237.76.1 dev eth0 metric 202
10.0.2.0/24 dev tun0 proto kernel scope link src 10.0.2.5
10.81.102.133 via 10.237.76.1 dev eth0
10.237.76.0/22 dev eth0 proto kernel scope link src 10.237.76.56 metric 202
128.0.0.0/1 via 10.0.2.1 dev tun0
Qui la soluzione non è così semplice:devo estrarre l'IP di percorso predefinito (10.237.76.1
), abbinalo al percorso appropriato (10.237.76.0/22 dev eth0 proto kernel scope link src 10.237.76.56 metric 202
) che si spera contenga src
.
Infine tagliando dall'output di ip
non reggerà l'acqua a lungo termine (cambiamenti nell'output, variazioni nell'output tra distribuzioni o versioni, ...)
C'è un modo più portatile per ottenere quell'IP?
Per “portatile” intendo:
- idealmente "funziona su qualsiasi Linux"
- Meno idealmente ma comunque buono "funziona su Debian e i suoi derivati"
Tieni presente che il dispositivo è in una VPN esclusiva, quindi non posso analizzare direttamente il percorso effettivo che il pacchetto seguirà quando la VPN è attiva (ovvero, la maggior parte delle volte):il default
route è mascherato da altri due percorsi, che coprono effettivamente l'intero range IP. Per favore correggimi se sbaglio qui.
Risposta accettata:
Puoi scegliere un indirizzo arbitrario a cui ritieni sarà sempre accessibile tramite il percorso predefinito, ad esempio google DNS, e quindi stampare l'indirizzo di origine per quello percorso:
ip route get 8.8.8.8 | awk '{ for (nn=1;nn<=NF;nn++) if ($nn~"src") print $(nn+1) }'