wireguard.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package serverctl
  2. import (
  3. //"github.com/davecgh/go-spew/spew"
  4. "encoding/json"
  5. "errors"
  6. "log"
  7. "net"
  8. "os"
  9. "strconv"
  10. "github.com/gravitl/netmaker/database"
  11. "github.com/gravitl/netmaker/functions"
  12. "github.com/gravitl/netmaker/models"
  13. "github.com/gravitl/netmaker/servercfg"
  14. "github.com/vishvananda/netlink"
  15. "golang.zx2c4.com/wireguard/wgctrl"
  16. "golang.zx2c4.com/wireguard/wgctrl/wgtypes"
  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("WireGuard interface " + ifaceSettings.Name + " already exists. Skipping...")
  37. } else {
  38. return err
  39. }
  40. }
  41. address, err := netlink.ParseAddr(wgconfig.GRPCWGAddress + "/24")
  42. if err != nil {
  43. return err
  44. }
  45. err = netlink.AddrAdd(wglink, address)
  46. if err != nil && !os.IsExist(err) {
  47. return err
  48. }
  49. err = netlink.LinkSetUp(wglink)
  50. if err != nil {
  51. log.Println("could not bring up wireguard interface")
  52. return err
  53. }
  54. var client models.IntClient
  55. client.PrivateKey = wgconfig.GRPCWGPrivKey
  56. client.PublicKey = wgconfig.GRPCWGPubKey
  57. client.ServerPublicEndpoint = servercfg.GetAPIHost()
  58. client.ServerAPIPort = servercfg.GetAPIPort()
  59. client.ServerPrivateAddress = servercfg.GetGRPCWGAddress()
  60. client.ServerWGPort = servercfg.GetGRPCWGPort()
  61. client.ServerGRPCPort = servercfg.GetGRPCPort()
  62. client.Address = servercfg.GetGRPCWGAddress()
  63. client.IsServer = "yes"
  64. client.Network = "comms"
  65. exists, _ := functions.GetServerIntClient()
  66. if exists != nil {
  67. err = RegisterServer(client)
  68. }
  69. return err
  70. }
  71. func DeleteServerClient() error {
  72. return nil
  73. }
  74. func RegisterServer(client models.IntClient) error {
  75. if client.PrivateKey == "" {
  76. privateKey, err := wgtypes.GeneratePrivateKey()
  77. if err != nil {
  78. return err
  79. }
  80. client.PrivateKey = privateKey.String()
  81. client.PublicKey = privateKey.PublicKey().String()
  82. }
  83. if client.Address == "" {
  84. newAddress, err := functions.UniqueAddress(client.Network)
  85. if err != nil {
  86. return err
  87. }
  88. if newAddress == "" {
  89. return errors.New("Could not retrieve address")
  90. }
  91. client.Address = newAddress
  92. }
  93. if client.Network == "" {
  94. client.Network = "comms"
  95. }
  96. client.ServerKey = client.PublicKey
  97. value, err := json.Marshal(client)
  98. if err != nil {
  99. return err
  100. }
  101. database.Insert(client.PublicKey, string(value), database.INT_CLIENTS_TABLE_NAME)
  102. ReconfigureServerWireGuard()
  103. return err
  104. }
  105. func ReconfigureServerWireGuard() error {
  106. server, err := functions.GetServerIntClient()
  107. if err != nil {
  108. return err
  109. }
  110. serverkey, err := wgtypes.ParseKey(server.PrivateKey)
  111. if err != nil {
  112. return err
  113. }
  114. serverport, err := strconv.Atoi(servercfg.GetGRPCWGPort())
  115. if err != nil {
  116. return err
  117. }
  118. peers, err := functions.GetIntPeersList()
  119. if err != nil {
  120. return err
  121. }
  122. wgserver, err := wgctrl.New()
  123. if err != nil {
  124. return err
  125. }
  126. var serverpeers []wgtypes.PeerConfig
  127. for _, peer := range peers {
  128. pubkey, err := wgtypes.ParseKey(peer.PublicKey)
  129. if err != nil {
  130. return err
  131. }
  132. var peercfg wgtypes.PeerConfig
  133. var allowedips []net.IPNet
  134. if peer.Address != "" {
  135. var peeraddr = net.IPNet{
  136. IP: net.ParseIP(peer.Address),
  137. Mask: net.CIDRMask(32, 32),
  138. }
  139. allowedips = append(allowedips, peeraddr)
  140. }
  141. if peer.Address6 != "" {
  142. var addr6 = net.IPNet{
  143. IP: net.ParseIP(peer.Address6),
  144. Mask: net.CIDRMask(128, 128),
  145. }
  146. allowedips = append(allowedips, addr6)
  147. }
  148. peercfg = wgtypes.PeerConfig{
  149. PublicKey: pubkey,
  150. ReplaceAllowedIPs: true,
  151. AllowedIPs: allowedips,
  152. }
  153. serverpeers = append(serverpeers, peercfg)
  154. }
  155. wgconf := wgtypes.Config{
  156. PrivateKey: &serverkey,
  157. ListenPort: &serverport,
  158. ReplacePeers: true,
  159. Peers: serverpeers,
  160. }
  161. wgiface := servercfg.GetGRPCWGInterface()
  162. err = wgserver.ConfigureDevice(wgiface, wgconf)
  163. if err != nil {
  164. return err
  165. }
  166. return nil
  167. }