デフォルトのルートソースアドレスを取得する移植可能な方法は何ですか?

デフォルトのルートソースアドレスを取得する移植可能な方法は何ですか?

パケットソースとして使用されるIPアドレスを取得する必要があります。defaultルート経由で送信。 (編集)私が言及したパスはラベル付きdefaultですdefaultip rVPN設定でパケットが使用する実際のパスについては最後を参照してください)。

私の最初の考えは、以下を使用して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

10.237.76.1ここで解決策はそれほど簡単ではありません。デフォルトパスIP()を10.237.76.0/22 dev eth0 proto kernel scope link src 10.237.76.56 metric 202抽出し、それをsrc

出力の最終カットはiplng側で維持することはできません(出力変更、リリース、バージョン間の出力変更など...)。

そのIPを取得するためのより移植可能な方法はありますか?

「携帯用」とは、次のことを意味します。

  • 理想的には、「すべてのLinuxで動作」です。
  • 理想的ではありませんが、それでも良い「Debianとその派生製品で動作」

デバイスは独自のVPNにあるため、VPNが動作しているとき(つまり、ほとんどの場合)、パケットが使用している実際のパスを直接分析することはできません。このdefaultルートは、IP全体を効果的にカバーする2つの異なるルートによってブロックされます。範囲。間違っていたら訂正してください。

答え1

Google DNSなど、デフォルトのルートを介して常にアクセスできると思われる任意のアドレスを選択してから、送信元アドレスを印刷できます。それ路線:

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

答え2

デフォルトルートソースアドレスを表示します。

ip route get 8.8.8.8  | awk ' /^[0-9]/ { print $7 }'  
  • { print $7 }7番目の出力フィールドを選択しますip...
  • ^[0-9]数字で始まる行を選択すると、正しい行を選択するためのip2行が作成されます。

注:私は最初の解決策を好みますが、代替案を示すために他の解決策も表示されます。

または:

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は。もう廃止され、私の考えは最近のLinuxディストリビューションでより良い選択です。procfsnetstatnetstatip

答え3

実際の意図(元の出力IPを見つける)と答えに基づいてトリックを実行する必要がある(やや長い)1行は次のとおりです。

ip route get 8.8.8.8 oif $(ip route | sed -n '/^default/s/^.* dev \([^ ][^ ]*\) *.*$/\1/p')  | sed -n 's/^.* src \([^ ][^ ]*\) *.*$/\1/p'

ステップ1 $():デフォルトパスを取得し、キーワードの後に​​インターフェイスのみを検索します。開発者(配布によって異なる場合もあれば、この手順でルートが送信元IPを表示または表示しないため)。

ステップ2:特別なルーティング設定を操作してはいけませんが、以前に検出されたインターフェイスを使用する必要がある「よく知られている」パブリックIPアドレスへのルートを取得します。したがって、カーネルが下に埋め込まれている実際の元のデフォルト値を使用するように効果的に要求し0.0.0.0/1ます128.0.0.0/1。計画された。キーワードによるIP検索ソースコード

答え4

私のシナリオ(ホストのIPを正しくインポートするためのDockerコンテナの設定)では、次のように決定しました。

ip route|awk '/src/ { print $7 }'

関連情報