Necesito obtener la dirección IP utilizada como fuente para los paquetes enviados a través del default
ruta . (EDITAR) Tenga en cuenta que me refiero al default
ruta, la marcada como default
en ip r
(vea al final la ruta real que tomarán los paquetes bajo la configuración de mi VPN).
Mi primera idea fue usar ip r
y deducir esto de allí:
# 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
Se veía bien, un ip r | grep default | cut -d" " -f7
me dio el esperado 10.237.77.206
.
Luego, en otro sistema (ambos son derivados de Debian) obtuve
# 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
Aquí la solución no es tan simple:necesito extraer la ruta IP predeterminada (10.237.76.1
), conéctelo con la ruta adecuada (10.237.76.0/22 dev eth0 proto kernel scope link src 10.237.76.56 metric 202
) que con suerte incluirá el src
.
Cortando en última instancia desde la salida de ip
no retendrá el agua a largo plazo (cambios en la salida, variaciones en la salida entre distribuciones o versiones, …)
¿Existe una forma más portátil de obtener esa IP?
Por "portátil" quiero decir:
- idealmente "funciona en cualquier Linux"
- menos ideal pero todavía bueno "funciona en Debian y sus derivados"
Tenga en cuenta que el dispositivo está en una VPN exclusiva, por lo que no puedo analizar directamente la ruta real que tomará el paquete cuando la VPN esté activa (es decir, la mayor parte del tiempo):el default
La ruta está enmascarada por otras dos rutas, que cubren efectivamente todo el rango de IP. Corríjame si me equivoco aquí.
Respuesta aceptada:
Puede elegir una dirección arbitraria a la que crea que siempre se accederá a través de la ruta predeterminada, por ejemplo, Google DNS, y luego imprimir la dirección de origen para esa ruta:
ip route get 8.8.8.8 | awk '{ for (nn=1;nn<=NF;nn++) if ($nn~"src") print $(nn+1) }'