mirror of
https://github.com/netbirdio/netbird.git
synced 2024-11-26 18:13:40 +01:00
818c6b885f
* starting engine by passing file descriptor on engine start * inject logger that does not compile * logger and first client * first working connection * support for routes and working connection * small refactor for better code quality in swift * trying to add DNS * fix * updated * fix route deletion * trying to bind the DNS resolver dialer to an interface * use dns.Client.Exchange * fix metadata send on startup * switching between client to query upstream * fix panic on no dns response * fix after merge changes * add engine ready listener * replace engine listener with connection listener * disable relay connection for iOS until proxy is refactored into bind * Extract private upstream for iOS and fix function headers for other OS * Update mock Server * Fix dns server and upstream tests * Fix engine null pointer with mobile dependencies for other OS * Revert back to disabling upstream on no response * Fix some of the remarks from the linter * Fix linter * re-arrange duration calculation * revert exported HostDNSConfig * remove unused engine listener * remove development logs * refactor dns code and interface name propagation * clean dns server test * disable upstream deactivation for iOS * remove files after merge * fix dns server darwin * fix server mock * fix build flags * move service listen back to initialize * add wgInterface to hostManager initialization on android * fix typo and remove unused function * extract upstream exchange for ios and rest * remove todo * separate upstream logic to ios file * Fix upstream test * use interface and embedded struct for upstream * set properly upstream client * remove placeholder * remove ios specific attributes * fix upstream test * merge ipc parser and wg configurer for mobile * fix build annotation * use json for DNS settings handover through gomobile * add logs for DNS json string * bring back check on ios for private upstream * remove wrong (and unused) line * fix wrongly updated comments on DNSSetting export --------- Co-authored-by: Maycon Santos <mlsmaycon@gmail.com>
121 lines
2.9 KiB
Go
121 lines
2.9 KiB
Go
//go:build !android && !ios
|
|
|
|
package routemanager
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"net/netip"
|
|
|
|
"github.com/libp2p/go-netroute"
|
|
log "github.com/sirupsen/logrus"
|
|
)
|
|
|
|
var errRouteNotFound = fmt.Errorf("route not found")
|
|
|
|
func addToRouteTableIfNoExists(prefix netip.Prefix, addr string) error {
|
|
ok, err := existsInRouteTable(prefix)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if ok {
|
|
log.Warnf("skipping adding a new route for network %s because it already exists", prefix)
|
|
return nil
|
|
}
|
|
|
|
ok, err = isSubRange(prefix)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if ok {
|
|
err := addRouteForCurrentDefaultGateway(prefix)
|
|
if err != nil {
|
|
log.Warnf("unable to add route for current default gateway route. Will proceed without it. error: %s", err)
|
|
}
|
|
}
|
|
|
|
return addToRouteTable(prefix, addr)
|
|
}
|
|
|
|
func addRouteForCurrentDefaultGateway(prefix netip.Prefix) error {
|
|
defaultGateway, err := getExistingRIBRouteGateway(netip.MustParsePrefix("0.0.0.0/0"))
|
|
if err != nil && err != errRouteNotFound {
|
|
return err
|
|
}
|
|
|
|
addr := netip.MustParseAddr(defaultGateway.String())
|
|
|
|
if !prefix.Contains(addr) {
|
|
log.Debugf("skipping adding a new route for gateway %s because it is not in the network %s", addr, prefix)
|
|
return nil
|
|
}
|
|
|
|
gatewayPrefix := netip.PrefixFrom(addr, 32)
|
|
|
|
ok, err := existsInRouteTable(gatewayPrefix)
|
|
if err != nil {
|
|
return fmt.Errorf("unable to check if there is an existing route for gateway %s. error: %s", gatewayPrefix, err)
|
|
}
|
|
|
|
if ok {
|
|
log.Debugf("skipping adding a new route for gateway %s because it already exists", gatewayPrefix)
|
|
return nil
|
|
}
|
|
|
|
gatewayHop, err := getExistingRIBRouteGateway(gatewayPrefix)
|
|
if err != nil && err != errRouteNotFound {
|
|
return fmt.Errorf("unable to get the next hop for the default gateway address. error: %s", err)
|
|
}
|
|
log.Debugf("adding a new route for gateway %s with next hop %s", gatewayPrefix, gatewayHop)
|
|
return addToRouteTable(gatewayPrefix, gatewayHop.String())
|
|
}
|
|
|
|
func existsInRouteTable(prefix netip.Prefix) (bool, error) {
|
|
routes, err := getRoutesFromTable()
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
for _, tableRoute := range routes {
|
|
if tableRoute == prefix {
|
|
return true, nil
|
|
}
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
func isSubRange(prefix netip.Prefix) (bool, error) {
|
|
routes, err := getRoutesFromTable()
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
for _, tableRoute := range routes {
|
|
if tableRoute.Bits() > minRangeBits && tableRoute.Contains(prefix.Addr()) && tableRoute.Bits() < prefix.Bits() {
|
|
return true, nil
|
|
}
|
|
}
|
|
return false, nil
|
|
}
|
|
|
|
func removeFromRouteTableIfNonSystem(prefix netip.Prefix, addr string) error {
|
|
return removeFromRouteTable(prefix, addr)
|
|
}
|
|
|
|
func getExistingRIBRouteGateway(prefix netip.Prefix) (net.IP, error) {
|
|
r, err := netroute.New()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
_, gateway, preferredSrc, err := r.Route(prefix.Addr().AsSlice())
|
|
if err != nil {
|
|
log.Errorf("getting routes returned an error: %v", err)
|
|
return nil, errRouteNotFound
|
|
}
|
|
|
|
if gateway == nil {
|
|
return preferredSrc, nil
|
|
}
|
|
|
|
return gateway, nil
|
|
}
|