default
を介して送信されたパケットの送信元として使用されるIPアドレスを取得する必要があります ルート 。 (編集)default
を参照していることに注意してください ルート、default
としてマークされたルート ip r
で (VPN設定でパケットがたどる実際のルートについては、最後を参照してください)。
私の最初のアイデアは、ip r
を使用することでした。 そこからこれを推測します:
# 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
よさそうだ、ip r | grep default | cut -d" " -f7
期待される10.237.77.206
をくれました 。
次に、別のシステム(どちらもDebian派生物)で取得しました
# 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
ここでの解決策はそれほど単純ではありません。デフォルトルートIP(10.237.76.1
)を抽出する必要があります )、適切なルートと一致させます(10.237.76.0/22 dev eth0 proto kernel scope link src 10.237.76.56 metric 202
)これにはsrc
が含まれているといいのですが 。
最終的にip
の出力から切り取ります lng期間中は水を保持しません(出力の変化、ディストリビューションまたはバージョン間の出力の変化、…)
そのIPを取得するためのよりポータブルな方法はありますか?
「ポータブル」とは、次のことを意味します:
- 理想的には「どのLinuxでも動作する」
- 理想的ではありませんが、それでも優れた「Debianとその派生物で動作します」
デバイスは専用VPN内にあるため、VPNが稼働しているとき(つまり、ほとんどの場合)にパケットがたどる実際のルートを直接分析できないことに注意してください:default
ルートは、IP範囲全体を効果的にカバーする他の2つのルートによってマスクされます。ここで間違えた場合は訂正してください。
承認された回答:
Google DNSなど、デフォルトルートを介して常にアクセスされると思われる任意のアドレスを選択し、そのの送信元アドレスを出力できます。 ルート:
ip route get 8.8.8.8 | awk '{ for (nn=1;nn<=NF;nn++) if ($nn~"src") print $(nn+1) }'