获取默认路由源地址的便携方式是什么?

WoJ*_*WoJ 5 linux networking ip route

我需要获取用作通过defaultroute发送的数据包源的 IP 地址。(编辑)请注意,我指的是default路由,标记为defaultin 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
Run Code Online (Sandbox Code Playgroud)

看起来不错,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
Run Code Online (Sandbox Code Playgroud)

这里的解决方案并不那么简单:我需要提取默认路由 IP ( 10.237.76.1),将其与适当的路由 ( 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 范围。如果我在这里弄错了,请纠正我。

Rui*_*iro 7

用于显示您的默认路由源地址:

ip route get 8.8.8.8  | awk ' /^[0-9]/ { print $7 }'  
Run Code Online (Sandbox Code Playgroud)
  • { print $7 }是选择的第七字段ip...输出;
  • ^[0-9]是选择与一些起线ip生成两行,以选择正确的路线。

注意:我更喜欢第一个解决方案,但是为了显示替代方案而显示其他替代方案。

或者:

ip route get 8.8.8.8 |  cut -f7 -d" " | grep '^[0-9]'
Run Code Online (Sandbox Code Playgroud)

再次:

  • 所述cut选择所述第七字段;

或者:

 ip route get 8.8.8.8 | grep ^[0-9] |  cut -f7 -d" " 
Run Code Online (Sandbox Code Playgroud)

或者:

ip route get 8.8.8.8 | fgrep src |  cut -f7 -d" "
Run Code Online (Sandbox Code Playgroud)

或者也:

 ip route get 8.8.8.8 | awk ' /src/ { print $7 }' 
Run Code Online (Sandbox Code Playgroud)

为了澄清一点,这里是输出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  
Run Code Online (Sandbox Code Playgroud)

在 Linux 中有多种获取默认路由的方法,可以是通过ipprocfs也可以是从netstatnetstat正在被弃用,而 IMOip是任何最近的 Linux 发行版中都存在的更好选择。


use*_*274 7

你可以选择你认为将始终通过默认路由访问的任意地址,例如谷歌DNS,然后打印的源地址路线:

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