J'ai besoin d'obtenir l'adresse IP utilisée comme source pour les paquets envoyés via le default
itinéraire . (EDIT) Veuillez noter que je fais référence au default
route, celle marquée comme default
dans ip r
(voir à la fin pour la route réelle que les paquets prendront sous ma configuration VPN).
Ma première idée était d'utiliser ip r
et en déduire ceci :
# 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
Ça avait l'air bien, un ip r | grep default | cut -d" " -f7
m'a donné le 10.237.77.206
attendu .
Ensuite, sur un autre système (les deux sont des dérivés de Debian), j'ai obtenu
# 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
Ici, la solution n'est pas aussi simple :j'ai besoin d'extraire l'IP de la route par défaut (10.237.76.1
), faites-le correspondre à la route appropriée (10.237.76.0/22 dev eth0 proto kernel scope link src 10.237.76.56 metric 202
) qui, espérons-le, inclura le src
.
En fin de compte, couper de la sortie de ip
ne tiendra pas la route à long terme (changements de sortie, variations de sortie entre distributions ou versions, …)
Existe-t-il un moyen plus portable d'obtenir cette adresse IP ?
Par "portable", j'entends :
- idéalement "fonctionne sur n'importe quel Linux"
- moins idéalement mais toujours bon "fonctionne sur Debian et ses dérivés"
Veuillez noter que l'appareil est dans un VPN exclusif, je ne peux donc pas analyser directement l'itinéraire réel que le paquet empruntera lorsque le VPN sera opérationnel (c'est-à-dire la plupart du temps) :le default
route est masquée par deux autres routes, qui couvrent effectivement toute la plage IP. Veuillez me corriger si je me trompe ici.
Réponse acceptée :
Vous pouvez choisir une adresse arbitraire qui, selon vous, sera toujours accessible via la route par défaut, par exemple Google DNS, puis imprimer l'adresse source pour ce itinéraire :
ip route get 8.8.8.8 | awk '{ for (nn=1;nn<=NF;nn++) if ($nn~"src") print $(nn+1) }'