Potřebuji získat IP adresu používanou jako zdroj pro pakety odesílané přes default
trasa . (EDIT) Vezměte prosím na vědomí, že mám na mysli default
trasa, která je označena jako default
v ip r
(skutečnou cestu, kterou pakety budou mít v rámci mého nastavení VPN, najdete na konci).
Můj první nápad byl použít ip r
a z toho odvodit toto:
# 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
Vypadalo to dobře, ip r | grep default | cut -d" " -f7
mi dal očekávaný 10.237.77.206
.
Pak jsem na jiném systému (oba jsou deriváty debianu) dostal
# 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
Zde řešení není tak jednoduché:Potřebuji extrahovat výchozí IP adresu trasy (10.237.76.1
), přiřaďte jej k příslušné trase (10.237.76.0/22 dev eth0 proto kernel scope link src 10.237.76.56 metric 202
), který doufejme bude obsahovat src
.
V konečném důsledku stříháme z výstupu ip
nebude dlouhodobě zadržovat vodu (změny výkonu, odchylky výkonu mezi distribucemi nebo verzemi, …)
Existuje přenosnější způsob, jak získat tuto IP adresu?
Termínem „přenosný“ myslím:
- ideálně „funguje na jakémkoli Linuxu“
- méně ideálně, ale stále dobře „funguje na Debianu a jeho derivátech“
Vezměte prosím na vědomí, že zařízení je ve výhradní síti VPN, takže nemohu přímo analyzovat skutečnou trasu, kterou paket projde, když je VPN aktivní (tedy většinou):default
trasa je maskována dvěma dalšími trasami, které efektivně pokrývají celý rozsah IP. Prosím, opravte mě, pokud se zde mýlím.
Přijatá odpověď:
Můžete si vybrat libovolnou adresu, o které se domníváte, že bude vždy přístupná přes výchozí cestu, například google DNS, a poté vytisknout zdrojovou adresu to trasa:
ip route get 8.8.8.8 | awk '{ for (nn=1;nn<=NF;nn++) if ($nn~"src") print $(nn+1) }'