wireguard.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package serverctl
  2. import (
  3. //"github.com/davecgh/go-spew/spew"
  4. "os"
  5. "log"
  6. "context"
  7. "time"
  8. "net"
  9. "strconv"
  10. "errors"
  11. "github.com/vishvananda/netlink"
  12. "golang.zx2c4.com/wireguard/wgctrl"
  13. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  14. "github.com/gravitl/netmaker/servercfg"
  15. "github.com/gravitl/netmaker/functions"
  16. "github.com/gravitl/netmaker/models"
  17. "github.com/gravitl/netmaker/mongoconn"
  18. )
  19. func InitServerWireGuard() error {
  20. created, err := CreateCommsNetwork()
  21. if !created {
  22. return err
  23. }
  24. wgconfig := servercfg.GetWGConfig()
  25. if !(wgconfig.GRPCWireGuard == "on") {
  26. return errors.New("WireGuard not enabled on this server.")
  27. }
  28. ifaceSettings := netlink.NewLinkAttrs()
  29. if wgconfig.GRPCWGInterface == "" {
  30. return errors.New("No WireGuard Interface Name set.")
  31. }
  32. ifaceSettings.Name = wgconfig.GRPCWGInterface
  33. wglink := &models.WireGuardLink{LinkAttrs: &ifaceSettings}
  34. err = netlink.LinkAdd(wglink)
  35. if err != nil {
  36. if os.IsExist(err) {
  37. log.Println("WireGuard interface " + ifaceSettings.Name + " already exists. Skipping...")
  38. } else {
  39. return err
  40. }
  41. }
  42. address, err := netlink.ParseAddr(wgconfig.GRPCWGAddress + "/24")
  43. if err != nil {
  44. return err
  45. }
  46. err = netlink.AddrAdd(wglink, address)
  47. if err != nil && !os.IsExist(err){
  48. return err
  49. }
  50. err = netlink.LinkSetUp(wglink)
  51. if err != nil {
  52. log.Println("could not bring up wireguard interface")
  53. return err
  54. }
  55. var client models.IntClient
  56. client.PrivateKey = wgconfig.GRPCWGPrivKey
  57. client.PublicKey = wgconfig.GRPCWGPubKey
  58. client.ServerPublicEndpoint = servercfg.GetAPIHost()
  59. client.ServerAPIPort = servercfg.GetAPIPort()
  60. client.ServerPrivateAddress = servercfg.GetGRPCWGAddress()
  61. client.ServerWGPort = servercfg.GetGRPCWGPort()
  62. client.ServerGRPCPort = servercfg.GetGRPCPort()
  63. client.Address = servercfg.GetGRPCWGAddress()
  64. client.IsServer = "yes"
  65. client.Network = "comms"
  66. exists, _ := functions.ServerIntClientExists()
  67. if exists {
  68. }
  69. err = RegisterServer(client)
  70. return err
  71. }
  72. func DeleteServerClient() error {
  73. return nil
  74. }
  75. func RegisterServer(client models.IntClient) error {
  76. if client.PrivateKey == "" {
  77. privateKey, err := wgtypes.GeneratePrivateKey()
  78. if err != nil {
  79. return err
  80. }
  81. client.PrivateKey = privateKey.String()
  82. client.PublicKey = privateKey.PublicKey().String()
  83. }
  84. if client.Address == "" {
  85. newAddress, err := functions.UniqueAddress(client.Network)
  86. if err != nil {
  87. return err
  88. }
  89. if newAddress == "" {
  90. return errors.New("Could not retrieve address")
  91. }
  92. client.Address = newAddress
  93. }
  94. if client.Network == "" { client.Network = "comms" }
  95. client.ServerKey = client.PublicKey
  96. collection := mongoconn.Client.Database("netmaker").Collection("intclients")
  97. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  98. // insert our network into the network table
  99. _, err := collection.InsertOne(ctx, client)
  100. defer cancel()
  101. ReconfigureServerWireGuard()
  102. return err
  103. }
  104. func ReconfigureServerWireGuard() error {
  105. server, err := GetServerWGConf()
  106. if err != nil {
  107. return err
  108. }
  109. serverkey, err := wgtypes.ParseKey(server.PrivateKey)
  110. if err != nil {
  111. return err
  112. }
  113. serverport, err := strconv.Atoi(servercfg.GetGRPCWGPort())
  114. if err != nil {
  115. return err
  116. }
  117. peers, err := functions.GetIntPeersList()
  118. if err != nil {
  119. return err
  120. }
  121. wgserver, err := wgctrl.New()
  122. if err != nil {
  123. return err
  124. }
  125. var serverpeers []wgtypes.PeerConfig
  126. for _, peer := range peers {
  127. pubkey, err := wgtypes.ParseKey(peer.PublicKey)
  128. if err != nil {
  129. return err
  130. }
  131. var peercfg wgtypes.PeerConfig
  132. var allowedips []net.IPNet
  133. if peer.Address != "" {
  134. var peeraddr = net.IPNet{
  135. IP: net.ParseIP(peer.Address),
  136. Mask: net.CIDRMask(32, 32),
  137. }
  138. allowedips = append(allowedips, peeraddr)
  139. }
  140. if peer.Address6 != "" {
  141. var addr6 = net.IPNet{
  142. IP: net.ParseIP(peer.Address6),
  143. Mask: net.CIDRMask(128, 128),
  144. }
  145. allowedips = append(allowedips, addr6)
  146. }
  147. peercfg = wgtypes.PeerConfig{
  148. PublicKey: pubkey,
  149. ReplaceAllowedIPs: true,
  150. AllowedIPs: allowedips,
  151. }
  152. serverpeers = append(serverpeers, peercfg)
  153. }
  154. wgconf := wgtypes.Config{
  155. PrivateKey: &serverkey,
  156. ListenPort: &serverport,
  157. ReplacePeers: true,
  158. Peers: serverpeers,
  159. }
  160. wgiface := servercfg.GetGRPCWGInterface()
  161. err = wgserver.ConfigureDevice(wgiface, wgconf)
  162. if err != nil {
  163. return err
  164. }
  165. return nil
  166. }