パケットの送信元として使用されるIPアドレスを取得する必要がありますdefault
ルート経由で送信。 (編集)私はdefault
ルートを参照していることに注意してください。ip r
でdefault
とマークされているルートです(パケットが私の下で通る実際のルートについては、最後を参照してください) 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を取得するためのよりポータブルな方法はありますか?
「ポータブル」とは、次のことを意味します。
デバイスは排他的VPN内にあるため、VPNが稼働しているとき(つまり、ほとんどの場合)にパケットがたどる実際のルートを直接分析できないことに注意してください。default
ルートは他の2つによってマスクされていますIP範囲全体を効果的にカバーするルート。ここで間違えたら訂正してください。
Google DNSなど、デフォルトルートを介して常にアクセスされると思われる任意のアドレスを選択し、that routeの送信元アドレスを出力できます。
ip route get 8.8.8.8 | awk '{ for (nn=1;nn<=NF;nn++) if ($nn~"src") print $(nn+1) }'
デフォルトのルート送信元アドレスを表示するには:
ip route get 8.8.8.8 | awk ' /^[0-9]/ { print $7 }'
{ print $7 }
は、ip...
出力の7番目のフィールドを選択しています。^[0-9]
は、正しい行を選択するためにip
が2行を生成するため、数字で始まる行を選択しています。注:私はこの最初のソリューションを好みますが、代替案を示すために他の代替案を示しています。
または:
ip route get 8.8.8.8 | cut -f7 -d" " | grep '^[0-9]'
再び:
cut
は7番目のフィールドを選択します。または:
ip route get 8.8.8.8 | grep ^[0-9] | cut -f7 -d" "
または:
ip route get 8.8.8.8 | fgrep src | cut -f7 -d" "
または:
ip route get 8.8.8.8 | awk ' /src/ { print $7 }'
少しわかりやすくするために、以下にip
の出力を示します。
$ ip route get 8.8.8.8
8.8.8.8 via 192.168.1.1 dev eth0 src 192.168.1.249
cache
Linuxでip
、procfs
を介して、またはnetstat
からデフォルトルートを取得する方法はいくつかあります。 netstat
は非推奨になりつつあり、IMO、ip
は、最近のLinuxディストリビューションに存在するより良い選択です。