web-dev-qa-db-ja.com

デフォルトルートの送信元アドレスを取得するためのポータブルな方法は何ですか?

パケットの送信元として使用されるIPアドレスを取得する必要がありますdefaultルート経由で送信。 (編集)私はdefaultルートを参照していることに注意してください。ip rdefaultとマークされているルートです(パケットが私の下で通る実際のルートについては、最後を参照してください) 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ルートは他の2つによってマスクされていますIP範囲全体を効果的にカバーするルート。ここで間違えたら訂正してください。

5
WoJ

Google DNSなど、デフォルトルートを介して常にアクセスされると思われる任意のアドレスを選択し、that routeの送信元アドレスを出力できます。

ip route get 8.8.8.8 | awk '{ for (nn=1;nn<=NF;nn++) if ($nn~"src") print $(nn+1) }'
7
user4556274

デフォルトのルート送信元アドレスを表示するには:

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でipprocfsを介して、またはnetstatからデフォルトルートを取得する方法はいくつかあります。 netstatは非推奨になりつつあり、IMO、ipは、最近のLinuxディストリビューションに存在するより良い選択です。

6
Rui F Ribeiro