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?
“便携式”我的意思是:
请注意,该设备处于专用 VPN 中,因此我无法直接分析 VPN 启动时(即大部分时间)数据包将采用的实际路由:该default路由被其他两条路由屏蔽,有效地覆盖了整个 IP 范围。如果我在这里弄错了,请纠正我。
用于显示您的默认路由源地址:
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 中有多种获取默认路由的方法,可以是通过ip,procfs也可以是从netstat。netstat正在被弃用,而 IMOip是任何最近的 Linux 发行版中都存在的更好选择。
你可以选择你认为将始终通过默认路由访问的任意地址,例如谷歌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)