@@ -139,6 +139,21 @@ func GetDefaultInterface() (*net.Interface, error) {
139139 return net .InterfaceByName (defaultInterface )
140140}
141141
142+ func GetDefaultInterfaceFromRoute () (* net.Interface , error ) {
143+ cmd := exec .Command ("sh" , "-c" , `ip -4 route get 8.8.8.8 | tr -d '\n'` )
144+ routeRaw , err := cmd .Output ()
145+ if err != nil {
146+ return nil , err
147+ }
148+ routeFields := strings .Fields (string (routeRaw ))
149+ for i , f := range routeFields {
150+ if f == "dev" && i + 1 < len (routeFields ) && routeFields [i + 1 ] != "tun" {
151+ return net .InterfaceByName (routeFields [i + 1 ])
152+ }
153+ }
154+ return nil , fmt .Errorf ("failed getting default interface from route" )
155+ }
156+
142157func GetDefaultGatewayIPv4 () (netip.Addr , error ) {
143158 cmd := exec .Command ("sh" , "-c" , `ip -4 route show 0.0.0.0/0 | awk '{print $3 " " $5}'` )
144159 ipdevRaw , err := cmd .Output ()
@@ -167,6 +182,22 @@ func GetDefaultGatewayIPv4() (netip.Addr, error) {
167182 return netip.Addr {}, fmt .Errorf ("gateway IPv4 not found " )
168183}
169184
185+ func GetDefaultGatewayIPv4FromRoute () (netip.Addr , error ) {
186+ cmd := exec .Command ("sh" , "-c" , `ip -4 route get 8.8.8.8 | awk '{print $3}' | tr -d '\n'` )
187+ ipstrRaw , err := cmd .Output ()
188+ if err != nil {
189+ return netip.Addr {}, err
190+ }
191+ ip , err := netip .ParseAddr (string (ipstrRaw ))
192+ if err != nil {
193+ return netip.Addr {}, err
194+ }
195+ if ! ip .IsValid () || ! ip .Is4 () {
196+ return netip.Addr {}, fmt .Errorf ("failed getting default gateway from route" )
197+ }
198+ return ip , nil
199+ }
200+
170201func GetGatewayIPv4FromInterface (iface string ) (netip.Addr , error ) {
171202 cmd := exec .Command ("sh" , "-c" , fmt .Sprintf ("ip -4 route show dev %s" , iface ))
172203 routes , err := cmd .Output ()
0 commit comments