net.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. package ovpm
  2. import (
  3. "encoding/binary"
  4. "errors"
  5. "fmt"
  6. "log"
  7. "net"
  8. "time"
  9. "github.com/Sirupsen/logrus"
  10. "github.com/asaskevich/govalidator"
  11. "github.com/coreos/go-iptables/iptables"
  12. "github.com/jinzhu/gorm"
  13. )
  14. // NetworkType distinguishes different types of networks that is defined in the networks table.
  15. type NetworkType uint
  16. // NetworkTypes
  17. const (
  18. UNDEFINEDNET NetworkType = iota
  19. SERVERNET
  20. ROUTE
  21. )
  22. var networkTypes = [...]struct {
  23. Type NetworkType
  24. String string
  25. }{
  26. {UNDEFINEDNET, "UNDEFINEDNET"},
  27. {SERVERNET, "SERVERNET"},
  28. {ROUTE, "ROUTE"},
  29. }
  30. // NetworkTypeFromString returns string representation of the network type.
  31. func NetworkTypeFromString(typ string) NetworkType {
  32. for _, v := range networkTypes {
  33. if v.String == typ {
  34. return v.Type
  35. }
  36. }
  37. return UNDEFINEDNET
  38. }
  39. // GetAllNetworkTypes returns all network types defined in the system.
  40. func GetAllNetworkTypes() []NetworkType {
  41. var networkTypeList []NetworkType
  42. for _, v := range networkTypes {
  43. networkTypeList = append(networkTypeList, v.Type)
  44. }
  45. return networkTypeList
  46. }
  47. func (nt NetworkType) String() string {
  48. for _, v := range networkTypes {
  49. if v.Type == nt {
  50. return v.String
  51. }
  52. }
  53. return "UNDEFINEDNET"
  54. }
  55. // DBNetwork is database model for external networks on the VPN server.
  56. type DBNetwork struct {
  57. gorm.Model
  58. ServerID uint
  59. Server DBServer
  60. Name string `gorm:"unique_index"`
  61. CIDR string
  62. Type NetworkType
  63. Via string
  64. Users []*DBUser `gorm:"many2many:network_users;"`
  65. }
  66. // GetNetwork returns a network specified by its name.
  67. func GetNetwork(name string) (*DBNetwork, error) {
  68. if !IsInitialized() {
  69. return nil, fmt.Errorf("you first need to create server")
  70. }
  71. // Validate user input.
  72. if govalidator.IsNull(name) {
  73. return nil, fmt.Errorf("validation error: %s can not be null", name)
  74. }
  75. if !govalidator.IsAlphanumeric(name) {
  76. return nil, fmt.Errorf("validation error: `%s` can only contain letters and numbers", name)
  77. }
  78. var network DBNetwork
  79. db.Preload("Users").Where(&DBNetwork{Name: name}).First(&network)
  80. if db.NewRecord(&network) {
  81. return nil, fmt.Errorf("network not found %s", name)
  82. }
  83. return &network, nil
  84. }
  85. // GetAllNetworks returns all networks defined in the system.
  86. func GetAllNetworks() []*DBNetwork {
  87. var networks []*DBNetwork
  88. db.Preload("Users").Find(&networks)
  89. return networks
  90. }
  91. // CreateNewNetwork creates a new network definition in the system.
  92. func CreateNewNetwork(name, cidr string, nettype NetworkType, via string) (*DBNetwork, error) {
  93. if !IsInitialized() {
  94. return nil, fmt.Errorf("you first need to create server")
  95. }
  96. // Validate user input.
  97. if govalidator.IsNull(name) {
  98. return nil, fmt.Errorf("validation error: %s can not be null", name)
  99. }
  100. if !govalidator.IsAlphanumeric(name) {
  101. return nil, fmt.Errorf("validation error: `%s` can only contain letters and numbers", name)
  102. }
  103. if !govalidator.IsCIDR(cidr) {
  104. return nil, fmt.Errorf("validation error: `%s` must be a network in the CIDR form", cidr)
  105. }
  106. if !govalidator.IsCIDR(via) && via != "" {
  107. return nil, fmt.Errorf("validation error: `%s` must be a network in the CIDR form", via)
  108. }
  109. if nettype == UNDEFINEDNET {
  110. return nil, fmt.Errorf("validation error: `%s` must be a valid network type", nettype)
  111. }
  112. _, ipnet, err := net.ParseCIDR(cidr)
  113. if err != nil {
  114. return nil, fmt.Errorf("can not parse CIDR %s: %v", cidr, err)
  115. }
  116. // Overwrite via with the parsed CIDR string.
  117. if nettype == ROUTE && via != "" {
  118. _, viaNet, err := net.ParseCIDR(via)
  119. if err != nil {
  120. return nil, fmt.Errorf("can not parse CIDR %s: %v", via, err)
  121. }
  122. via = viaNet.String()
  123. } else {
  124. via = ""
  125. }
  126. network := DBNetwork{
  127. Name: name,
  128. CIDR: ipnet.String(),
  129. Type: nettype,
  130. Users: []*DBUser{},
  131. Via: via,
  132. }
  133. db.Save(&network)
  134. if db.NewRecord(&network) {
  135. return nil, fmt.Errorf("can not create network in the db")
  136. }
  137. Emit()
  138. logrus.Infof("network defined: %s (%s)", network.Name, network.CIDR)
  139. return &network, nil
  140. }
  141. // Delete deletes a network definition in the system.
  142. func (n *DBNetwork) Delete() error {
  143. if !IsInitialized() {
  144. return fmt.Errorf("you first need to create server")
  145. }
  146. db.Unscoped().Delete(n)
  147. Emit()
  148. logrus.Infof("network deleted: %s", n.Name)
  149. return nil
  150. }
  151. // Associate allows the given user access to this network.
  152. func (n *DBNetwork) Associate(username string) error {
  153. if !IsInitialized() {
  154. return fmt.Errorf("you first need to create server")
  155. }
  156. user, err := GetUser(username)
  157. if err != nil {
  158. return fmt.Errorf("user can not be fetched: %v", err)
  159. }
  160. var users []DBUser
  161. userAssoc := db.Model(&n).Association("Users")
  162. userAssoc.Find(&users)
  163. var found bool
  164. for _, u := range users {
  165. if u.ID == user.ID {
  166. found = true
  167. break
  168. }
  169. }
  170. if found {
  171. return fmt.Errorf("user %s is already associated with the network %s", user.Username, n.Name)
  172. }
  173. userAssoc.Append(user)
  174. if userAssoc.Error != nil {
  175. return fmt.Errorf("association failed: %v", userAssoc.Error)
  176. }
  177. Emit()
  178. logrus.Infof("user '%s' is associated with the network '%s'", user.GetUsername(), n.Name)
  179. return nil
  180. }
  181. // Dissociate breaks up the given users association to the said network.
  182. func (n *DBNetwork) Dissociate(username string) error {
  183. if !IsInitialized() {
  184. return fmt.Errorf("you first need to create server")
  185. }
  186. user, err := GetUser(username)
  187. if err != nil {
  188. return fmt.Errorf("user can not be fetched: %v", err)
  189. }
  190. var users []DBUser
  191. userAssoc := db.Model(&n).Association("Users")
  192. userAssoc.Find(&users)
  193. var found bool
  194. for _, u := range users {
  195. if u.ID == user.ID {
  196. found = true
  197. break
  198. }
  199. }
  200. if !found {
  201. return fmt.Errorf("user %s is already not associated with the network %s", user.Username, n.Name)
  202. }
  203. userAssoc.Delete(user)
  204. if userAssoc.Error != nil {
  205. return fmt.Errorf("disassociation failed: %v", userAssoc.Error)
  206. }
  207. Emit()
  208. logrus.Infof("user '%s' is dissociated with the network '%s'", user.GetUsername(), n.Name)
  209. return nil
  210. }
  211. // GetName returns network's name.
  212. func (n *DBNetwork) GetName() string {
  213. return n.Name
  214. }
  215. // GetCIDR returns network's CIDR.
  216. func (n *DBNetwork) GetCIDR() string {
  217. return n.CIDR
  218. }
  219. // GetCreatedAt returns network's name.
  220. func (n *DBNetwork) GetCreatedAt() string {
  221. return n.CreatedAt.Format(time.UnixDate)
  222. }
  223. // GetType returns network's network type.
  224. func (n *DBNetwork) GetType() NetworkType {
  225. return NetworkType(n.Type)
  226. }
  227. // GetAssociatedUsers returns network's associated users.
  228. func (n *DBNetwork) GetAssociatedUsers() []*DBUser {
  229. return n.Users
  230. }
  231. // GetAssociatedUsernames returns network's associated user names.
  232. func (n *DBNetwork) GetAssociatedUsernames() []string {
  233. var usernames []string
  234. for _, user := range n.GetAssociatedUsers() {
  235. usernames = append(usernames, user.Username)
  236. }
  237. return usernames
  238. }
  239. // GetVia returns network' via.
  240. func (n *DBNetwork) GetVia() string {
  241. return n.Via
  242. }
  243. // interfaceOfIP returns a network interface that has the given IP.
  244. func interfaceOfIP(ipnet *net.IPNet) *net.Interface {
  245. ifaces, err := net.Interfaces()
  246. if err != nil {
  247. return nil
  248. }
  249. for _, iface := range ifaces {
  250. addrs, err := iface.Addrs()
  251. if err != nil {
  252. logrus.Error(err)
  253. return nil
  254. }
  255. for _, addr := range addrs {
  256. switch addr := addr.(type) {
  257. case *net.IPAddr:
  258. if ip := addr.IP; ip != nil {
  259. if ipnet.Contains(ip) {
  260. return &iface
  261. }
  262. }
  263. case *net.IPNet:
  264. if ip := addr.IP; ip != nil {
  265. if ipnet.Contains(ip) {
  266. return &iface
  267. }
  268. }
  269. }
  270. }
  271. }
  272. return nil
  273. }
  274. func routedInterface(network string, flags net.Flags) *net.Interface {
  275. switch network {
  276. case "ip", "ip4", "ip6":
  277. default:
  278. return nil
  279. }
  280. ift, err := net.Interfaces()
  281. if err != nil {
  282. return nil
  283. }
  284. for _, ifi := range ift {
  285. if ifi.Flags&flags != flags {
  286. continue
  287. }
  288. if _, ok := hasRoutableIP(network, &ifi); !ok {
  289. continue
  290. }
  291. return &ifi
  292. }
  293. return nil
  294. }
  295. func getOutboundInterface() *net.Interface {
  296. conn, err := net.Dial("udp", "8.8.8.8:80")
  297. if err != nil {
  298. log.Fatal(err)
  299. }
  300. defer conn.Close()
  301. localAddr := conn.LocalAddr().(*net.UDPAddr)
  302. ipnet := net.IPNet{
  303. IP: localAddr.IP.To4(),
  304. Mask: localAddr.IP.To4().DefaultMask(),
  305. }
  306. return interfaceOfIP(&ipnet)
  307. }
  308. func hasRoutableIP(network string, ifi *net.Interface) (net.IP, bool) {
  309. ifat, err := ifi.Addrs()
  310. if err != nil {
  311. return nil, false
  312. }
  313. for _, ifa := range ifat {
  314. switch ifa := ifa.(type) {
  315. case *net.IPAddr:
  316. if ip := routableIP(network, ifa.IP); ip != nil {
  317. return ip, true
  318. }
  319. case *net.IPNet:
  320. if ip := routableIP(network, ifa.IP); ip != nil {
  321. return ip, true
  322. }
  323. }
  324. }
  325. return nil, false
  326. }
  327. func vpnInterface() *net.Interface {
  328. server, err := GetServerInstance()
  329. if err != nil {
  330. logrus.Errorf("can't get server instance: %v", err)
  331. return nil
  332. }
  333. mask := net.IPMask(net.ParseIP(server.Mask))
  334. prefix := net.ParseIP(server.Net)
  335. netw := prefix.Mask(mask).To4()
  336. netw[3] = byte(1) // Server is always gets xxx.xxx.xxx.1
  337. ipnet := net.IPNet{IP: netw, Mask: mask}
  338. return interfaceOfIP(&ipnet)
  339. }
  340. func routableIP(network string, ip net.IP) net.IP {
  341. if !ip.IsLoopback() && !ip.IsLinkLocalUnicast() && !ip.IsGlobalUnicast() {
  342. return nil
  343. }
  344. switch network {
  345. case "ip4":
  346. if ip := ip.To4(); ip != nil {
  347. return ip
  348. }
  349. case "ip6":
  350. if ip.IsLoopback() { // addressing scope of the loopback address depends on each implementation
  351. return nil
  352. }
  353. if ip := ip.To16(); ip != nil && ip.To4() == nil {
  354. return ip
  355. }
  356. default:
  357. if ip := ip.To4(); ip != nil {
  358. return ip
  359. }
  360. if ip := ip.To16(); ip != nil {
  361. return ip
  362. }
  363. }
  364. return nil
  365. }
  366. // ensureNatEnabled launches a goroutine that constantly tries to enable nat.
  367. func ensureNatEnabled() {
  368. // Nat enablerer
  369. go func() {
  370. for {
  371. err := enableNat()
  372. if err == nil {
  373. logrus.Debug("nat is enabled")
  374. return
  375. }
  376. logrus.Debugf("can not enable nat: %v", err)
  377. // TODO(cad): employ a exponential back-off approach here
  378. // instead of sleeping for the constant duration.
  379. time.Sleep(1 * time.Second)
  380. }
  381. }()
  382. }
  383. // enableNat is an idempotent command that ensures nat is enabled for the vpn server.
  384. func enableNat() error {
  385. if Testing {
  386. return nil
  387. }
  388. // rif := routedInterface("ip", net.FlagUp|net.FlagBroadcast)
  389. // if rif == nil {
  390. // return fmt.Errorf("can not get routable network interface")
  391. // }
  392. rif := getOutboundInterface()
  393. if rif == nil {
  394. return fmt.Errorf("can not get default gw interface")
  395. }
  396. vpnIfc := vpnInterface()
  397. if vpnIfc == nil {
  398. return fmt.Errorf("can not get vpn network interface on the system")
  399. }
  400. // Enable ip forwarding.
  401. emitToFile("/proc/sys/net/ipv4/ip_forward", "1", 0)
  402. ipt, err := iptables.NewWithProtocol(iptables.ProtocolIPv4)
  403. if err != nil {
  404. return fmt.Errorf("can not create new iptables object: %v", err)
  405. }
  406. server, err := GetServerInstance()
  407. if err != nil {
  408. logrus.Errorf("can't get server instance: %v", err)
  409. return nil
  410. }
  411. mask := net.IPMask(net.ParseIP(server.Mask))
  412. prefix := net.ParseIP(server.Net)
  413. netw := prefix.Mask(mask).To4()
  414. netw[3] = byte(1) // Server is always gets xxx.xxx.xxx.1
  415. ipnet := net.IPNet{IP: netw, Mask: mask}
  416. // Append iptables nat rules.
  417. if err := ipt.AppendUnique("nat", "POSTROUTING", "-s", ipnet.String(), "-o", rif.Name, "-j", "MASQUERADE"); err != nil {
  418. return err
  419. }
  420. if err := ipt.AppendUnique("filter", "FORWARD", "-i", rif.Name, "-o", vpnIfc.Name, "-m", "state", "--state", "RELATED,ESTABLISHED", "-j", "ACCEPT"); err != nil {
  421. return err
  422. }
  423. if err := ipt.AppendUnique("filter", "FORWARD", "-i", vpnIfc.Name, "-o", rif.Name, "-j", "ACCEPT"); err != nil {
  424. return err
  425. }
  426. return nil
  427. }
  428. // HostID2IP converts a host id (32-bit unsigned integer) to an IP address.
  429. func HostID2IP(hostid uint32) net.IP {
  430. ip := make([]byte, 4)
  431. binary.BigEndian.PutUint32(ip, hostid)
  432. return net.IP(ip)
  433. }
  434. //IP2HostID converts an IP address to a host id (32-bit unsigned integer).
  435. func IP2HostID(ip net.IP) uint32 {
  436. hostid := binary.BigEndian.Uint32(ip)
  437. return hostid
  438. }
  439. // IncrementIP will return next ip address within the network.
  440. func IncrementIP(ip, mask string) (string, error) {
  441. ipAddr := net.ParseIP(ip).To4()
  442. netMask := net.IPMask(net.ParseIP(mask).To4())
  443. ipNet := net.IPNet{IP: ipAddr, Mask: netMask}
  444. for i := len(ipAddr) - 1; i >= 0; i-- {
  445. ipAddr[i]++
  446. if ip[i] != 0 {
  447. break
  448. }
  449. }
  450. if !ipNet.Contains(ipAddr) {
  451. return ip, errors.New("overflowed CIDR while incrementing IP")
  452. }
  453. return ipAddr.String(), nil
  454. }