wireguard.go 5.1 KB

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