Saya perlu mendapatkan alamat IP yang digunakan sebagai sumber untuk paket yang dikirim melalui default
rute . (EDIT) Harap dicatat bahwa saya mengacu pada default
rute, yang ditandai sebagai default
di ip r
(lihat di bagian akhir untuk mengetahui rute sebenarnya yang akan diambil paket di bawah pengaturan VPN saya).
Ide pertama saya adalah menggunakan ip r
dan menyimpulkan ini dari sana:
# 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
Itu terlihat bagus, sebuah ip r | grep default | cut -d" " -f7
memberi saya 10.237.77.206
yang diharapkan .
Kemudian, pada sistem lain (keduanya merupakan turunan debian) saya mendapatkan
# 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
Di sini solusinya tidak sesederhana:Saya perlu mengekstrak IP rute default (10.237.76.1
), cocokkan dengan rute yang sesuai (10.237.76.0/22 dev eth0 proto kernel scope link src 10.237.76.56 metric 202
) yang diharapkan akan menyertakan src
.
Akhirnya memotong dari output ip
tidak akan menahan air dalam jangka panjang (perubahan output, variasi output antara distro atau versi, ...)
Apakah ada cara yang lebih portabel untuk mendapatkan IP tersebut?
Dengan “portabel” yang saya maksud:
- idealnya “berfungsi di semua Linux”
- kurang ideal tapi masih bagus "berfungsi di Debian dan turunannya"
Harap dicatat bahwa perangkat dalam VPN eksklusif jadi saya tidak dapat langsung menganalisis rute sebenarnya yang akan diambil paket saat VPN menyala (yaitu, sebagian besar waktu):default
rute ditutupi oleh dua rute lain, yang secara efektif mencakup seluruh rentang IP. Mohon koreksi saya jika saya salah di sini.
Jawaban yang Diterima:
Anda dapat memilih alamat arbitrer yang Anda yakini akan selalu diakses melalui rute default, misalnya google DNS, lalu mencetak alamat sumber untuk itu rute:
ip route get 8.8.8.8 | awk '{ for (nn=1;nn<=NF;nn++) if ($nn~"src") print $(nn+1) }'