vpn.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983
  1. package ovpm
  2. import (
  3. "bytes"
  4. "fmt"
  5. "math/big"
  6. "net"
  7. "os"
  8. "os/exec"
  9. "path/filepath"
  10. "strings"
  11. "text/template"
  12. "time"
  13. "github.com/Sirupsen/logrus"
  14. "github.com/asaskevich/govalidator"
  15. "github.com/cad/ovpm/bindata"
  16. "github.com/cad/ovpm/pki"
  17. "github.com/cad/ovpm/supervisor"
  18. "github.com/coreos/go-iptables/iptables"
  19. "github.com/google/uuid"
  20. "github.com/jinzhu/gorm"
  21. )
  22. // Possible VPN protocols.
  23. const (
  24. TCPProto string = "tcp"
  25. UDPProto string = "udp"
  26. )
  27. // serverModel is database model for storing VPN server related stuff.
  28. type dbServerModel struct {
  29. gorm.Model
  30. Name string `gorm:"unique_index"` // Server name.
  31. SerialNumber string
  32. Hostname string // Server's ip address or FQDN
  33. Port string // Server's listening port
  34. Proto string // Server's proto udp or tcp
  35. Cert string // Server RSA certificate.
  36. Key string // Server RSA private key.
  37. CACert string // Root CA RSA certificate.
  38. CAKey string // Root CA RSA key.
  39. Net string // VPN network.
  40. Mask string // VPN network mask.
  41. CRL string // Certificate Revocation List
  42. DNS string // DNS servers to push to the clients.
  43. }
  44. // Server represents VPN server.
  45. type Server struct {
  46. dbServerModel
  47. webPort string
  48. }
  49. // CheckSerial takes a serial number and checks it against the current server's serial number.
  50. func (s *Server) CheckSerial(serial string) bool {
  51. return serial == s.SerialNumber
  52. }
  53. // GetSerialNumber returns server's serial number.
  54. func (s *Server) GetSerialNumber() string {
  55. return s.SerialNumber
  56. }
  57. // GetServerName returns server's name.
  58. func (s *Server) GetServerName() string {
  59. if s.Name != "" {
  60. return s.Name
  61. }
  62. return "default"
  63. }
  64. // GetHostname returns vpn server's hostname.
  65. func (s *Server) GetHostname() string {
  66. return s.Hostname
  67. }
  68. // GetPort returns vpn server's port.
  69. func (s *Server) GetPort() string {
  70. if s.Port != "" {
  71. return s.Port
  72. }
  73. return DefaultVPNPort
  74. }
  75. // GetProto returns vpn server's proto.
  76. func (s *Server) GetProto() string {
  77. if s.Proto != "" {
  78. return s.Proto
  79. }
  80. return DefaultVPNProto
  81. }
  82. // GetCert returns vpn server's cert.
  83. func (s *Server) GetCert() string {
  84. return s.Cert
  85. }
  86. // GetKey returns vpn server's key.
  87. func (s *Server) GetKey() string {
  88. return s.Key
  89. }
  90. // GetCACert returns vpn server's cacert.
  91. func (s *Server) GetCACert() string {
  92. return s.CACert
  93. }
  94. // GetCAKey returns vpn server's cakey.
  95. func (s *Server) GetCAKey() string {
  96. return s.CAKey
  97. }
  98. // GetNet returns vpn server's net.
  99. func (s *Server) GetNet() string {
  100. return s.Net
  101. }
  102. // GetMask returns vpn server's mask.
  103. func (s *Server) GetMask() string {
  104. return s.Mask
  105. }
  106. // GetCRL returns vpn server's crl.
  107. func (s *Server) GetCRL() string {
  108. return s.CRL
  109. }
  110. // GetDNS returns vpn server's dns.
  111. func (s *Server) GetDNS() string {
  112. if s.DNS != "" {
  113. return s.DNS
  114. }
  115. return DefaultVPNDNS
  116. }
  117. // GetCreatedAt returns server's created at.
  118. func (s *Server) GetCreatedAt() string {
  119. return s.CreatedAt.Format(time.UnixDate)
  120. }
  121. // Init regenerates keys and certs for a Root CA, gets initial settings for the VPN server
  122. // and saves them in the database.
  123. //
  124. // 'proto' can be either "udp" or "tcp" and if it's "" it defaults to "udp".
  125. //
  126. // 'ipblock' is a IP network in the CIDR form. VPN clients get their IP addresses from this network.
  127. // It defaults to const 'DefaultVPNNetwork'.
  128. //
  129. // Please note that, Init is potentially destructive procedure, it will cause invalidation of
  130. // existing .ovpn profiles of the current users. So it should be used carefully.
  131. func Init(hostname string, port string, proto string, ipblock string, dns string) error {
  132. if port == "" {
  133. port = DefaultVPNPort
  134. }
  135. if dns == "" {
  136. dns = DefaultVPNDNS
  137. }
  138. switch proto {
  139. case "":
  140. proto = UDPProto
  141. case UDPProto:
  142. proto = UDPProto
  143. case TCPProto:
  144. proto = TCPProto
  145. default:
  146. return fmt.Errorf("validation error: proto:`%s` should be either 'tcp' or 'udp'", proto)
  147. }
  148. // vpn network to use.
  149. var ipnet *net.IPNet
  150. // If user didn't specify, pick the vpn network from defaults.
  151. if ipblock == "" {
  152. var err error
  153. _, ipnet, err = net.ParseCIDR(DefaultVPNNetwork)
  154. if err != nil {
  155. return fmt.Errorf("can not parse CIDR %s: %v", DefaultVPNNetwork, err)
  156. }
  157. }
  158. // Check if the user specified vpn network is valid.
  159. if ipblock != "" && !govalidator.IsCIDR(ipblock) {
  160. return fmt.Errorf("validation error: ipblock:`%s` should be a CIDR network", ipblock)
  161. }
  162. // Use user specified vpn network.
  163. if ipblock != "" {
  164. var err error
  165. _, ipnet, err = net.ParseCIDR(ipblock)
  166. if err != nil {
  167. return fmt.Errorf("can parse ipblock: %s", err)
  168. }
  169. }
  170. if !govalidator.IsNumeric(port) {
  171. return fmt.Errorf("validation error: port:`%s` should be numeric", port)
  172. }
  173. serverName := "default"
  174. if IsInitialized() {
  175. if err := Deinit(); err != nil {
  176. logrus.Errorf("server can not be deleted: %v", err)
  177. return err
  178. }
  179. }
  180. if !govalidator.IsHost(hostname) {
  181. return fmt.Errorf("validation error: hostname:`%s` should be either an ip address or a FQDN", hostname)
  182. }
  183. if !govalidator.IsIPv4(dns) {
  184. return fmt.Errorf("validation error: dns:`%s` should be an ip address", dns)
  185. }
  186. ca, err := pki.NewCA()
  187. if err != nil {
  188. return fmt.Errorf("can not create ca creds: %s", err)
  189. }
  190. srv, err := pki.NewServerCertHolder(ca)
  191. if err != nil {
  192. return fmt.Errorf("can not create server cert creds: %s", err)
  193. }
  194. serialNumber := uuid.New().String()
  195. serverInstance := dbServerModel{
  196. Name: serverName,
  197. SerialNumber: serialNumber,
  198. Hostname: hostname,
  199. Proto: proto,
  200. Port: port,
  201. Cert: srv.Cert,
  202. Key: srv.Key,
  203. CACert: ca.Cert,
  204. CAKey: ca.Key,
  205. Net: ipnet.IP.To4().String(),
  206. Mask: net.IP(ipnet.Mask).To4().String(),
  207. DNS: dns,
  208. }
  209. db.Create(&serverInstance)
  210. if db.NewRecord(&serverInstance) {
  211. return fmt.Errorf("can not create server instance on database")
  212. }
  213. users, err := GetAllUsers()
  214. if err != nil {
  215. return err
  216. }
  217. // Sign all users in the db with the new server
  218. for _, user := range users {
  219. err := user.Renew()
  220. logrus.Infof("user certificate changed for %s, you should run: $ ovpm user export-config --user %s", user.Username, user.Username)
  221. if err != nil {
  222. logrus.Errorf("can not sign user %s: %v", user.Username, err)
  223. continue
  224. }
  225. // Set dynamic ip to user.
  226. user.HostID = 0
  227. db.Save(&user.dbUserModel)
  228. }
  229. EmitWithRestart()
  230. logrus.Infof("server initialized")
  231. return nil
  232. }
  233. // Update updates VPN server attributes.
  234. func Update(ipblock string, dns string) error {
  235. if !IsInitialized() {
  236. return fmt.Errorf("server is not initialized")
  237. }
  238. server, err := GetServerInstance()
  239. if err != nil {
  240. return err
  241. }
  242. var changed bool
  243. if ipblock != "" && govalidator.IsCIDR(ipblock) {
  244. var ipnet *net.IPNet
  245. _, ipnet, err = net.ParseCIDR(ipblock)
  246. if err != nil {
  247. return fmt.Errorf("can not parse CIDR %s: %v", ipblock, err)
  248. }
  249. server.dbServerModel.Net = ipnet.IP.To4().String()
  250. server.dbServerModel.Mask = net.IP(ipnet.Mask).To4().String()
  251. changed = true
  252. }
  253. if dns != "" && govalidator.IsIPv4(dns) {
  254. server.dbServerModel.DNS = dns
  255. changed = true
  256. }
  257. if changed {
  258. db.Save(server.dbServerModel)
  259. users, err := GetAllUsers()
  260. if err != nil {
  261. return err
  262. }
  263. // Set all users to dynamic ip address.
  264. // This way we prevent any ip range mismatch.
  265. for _, user := range users {
  266. user.HostID = 0
  267. db.Save(user.dbUserModel)
  268. }
  269. EmitWithRestart()
  270. logrus.Infof("server updated")
  271. }
  272. return nil
  273. }
  274. // Deinit deletes the VPN server from the database and frees the allocated resources.
  275. func Deinit() error {
  276. if !IsInitialized() {
  277. return fmt.Errorf("server not found")
  278. }
  279. db.Unscoped().Delete(&dbServerModel{})
  280. db.Unscoped().Delete(&dbRevokedModel{})
  281. EmitWithRestart()
  282. return nil
  283. }
  284. // DumpsClientConfig generates .ovpn file for the given vpn user and returns it as a string.
  285. func DumpsClientConfig(username string) (string, error) {
  286. var result bytes.Buffer
  287. user, err := GetUser(username)
  288. if err != nil {
  289. return "", err
  290. }
  291. server, err := GetServerInstance()
  292. if err != nil {
  293. return "", err
  294. }
  295. params := struct {
  296. Hostname string
  297. Port string
  298. CA string
  299. Key string
  300. Cert string
  301. NoGW bool
  302. Proto string
  303. }{
  304. Hostname: server.GetHostname(),
  305. Port: server.GetPort(),
  306. CA: server.GetCACert(),
  307. Key: user.getKey(),
  308. Cert: user.GetCert(),
  309. NoGW: user.IsNoGW(),
  310. Proto: server.GetProto(),
  311. }
  312. data, err := bindata.Asset("template/client.ovpn.tmpl")
  313. if err != nil {
  314. return "", err
  315. }
  316. t, err := template.New("client.ovpn").Parse(string(data))
  317. if err != nil {
  318. return "", fmt.Errorf("can not parse client.ovpn.tmpl template: %s", err)
  319. }
  320. err = t.Execute(&result, params)
  321. if err != nil {
  322. return "", fmt.Errorf("can not render client.ovpn: %s", err)
  323. }
  324. return result.String(), nil
  325. }
  326. // DumpClientConfig generates .ovpn file for the given vpn user and dumps it to outPath.
  327. func DumpClientConfig(username, path string) error {
  328. result, err := DumpsClientConfig(username)
  329. if err != nil {
  330. return err
  331. }
  332. // Wite rendered content into openvpn server conf.
  333. return emitToFile(path, result, 0)
  334. }
  335. // GetSystemCA returns the system CA from the database if available.
  336. func GetSystemCA() (*pki.CA, error) {
  337. server := dbServerModel{}
  338. db.First(&server)
  339. if db.NewRecord(&server) {
  340. return nil, fmt.Errorf("server record does not exists in db")
  341. }
  342. return &pki.CA{
  343. CertHolder: pki.CertHolder{
  344. Cert: server.CACert,
  345. Key: server.CAKey,
  346. },
  347. }, nil
  348. }
  349. // vpnProc represents the OpenVPN process that is managed by the ovpm supervisor globally OpenVPN.
  350. var vpnProc supervisor.Supervisable
  351. // StartVPNProc starts the OpenVPN process.
  352. func StartVPNProc() {
  353. if !IsInitialized() {
  354. logrus.Error("can not launch OpenVPN because system is not initialized")
  355. return
  356. }
  357. if vpnProc == nil {
  358. panic(fmt.Sprintf("vpnProc is not initialized!"))
  359. }
  360. if vpnProc.Status() == supervisor.RUNNING {
  361. logrus.Error("OpenVPN is already started")
  362. return
  363. }
  364. Emit()
  365. vpnProc.Start()
  366. ensureNatEnabled()
  367. }
  368. // RestartVPNProc restarts the OpenVPN process.
  369. func RestartVPNProc() {
  370. if !IsInitialized() {
  371. logrus.Error("can not launch OpenVPN because system is not initialized")
  372. return
  373. }
  374. if vpnProc == nil {
  375. panic(fmt.Sprintf("vpnProc is not initialized!"))
  376. }
  377. Emit()
  378. vpnProc.Restart()
  379. ensureNatEnabled()
  380. }
  381. // StopVPNProc stops the OpenVPN process.
  382. func StopVPNProc() {
  383. if vpnProc == nil {
  384. panic(fmt.Sprintf("vpnProc is not initialized!"))
  385. }
  386. if vpnProc.Status() != supervisor.RUNNING {
  387. logrus.Error("OpenVPN is already not running")
  388. return
  389. }
  390. vpnProc.Stop()
  391. }
  392. // Emit generates all needed files for the OpenVPN server and dumps them to their corresponding paths defined in the config.
  393. func Emit() error {
  394. // Check dependencies
  395. if !checkOpenVPNExecutable() {
  396. return fmt.Errorf("openvpn executable can not be found! you should install OpenVPN on this machine")
  397. }
  398. if !checkOpenSSLExecutable() {
  399. return fmt.Errorf("openssl executable can not be found! you should install openssl on this machine")
  400. }
  401. if !checkIptablesExecutable() {
  402. return fmt.Errorf("iptables executable can not be found")
  403. }
  404. if !IsInitialized() {
  405. return fmt.Errorf("you should create a server first. e.g. $ ovpm vpn create-server")
  406. }
  407. if err := emitServerConf(); err != nil {
  408. return fmt.Errorf("can not emit server conf: %s", err)
  409. }
  410. if err := emitServerCert(); err != nil {
  411. return fmt.Errorf("can not emit server cert: %s", err)
  412. }
  413. if err := emitServerKey(); err != nil {
  414. return fmt.Errorf("can not emit server key: %s", err)
  415. }
  416. if err := emitCACert(); err != nil {
  417. return fmt.Errorf("can not emit ca cert : %s", err)
  418. }
  419. if err := emitCAKey(); err != nil {
  420. return fmt.Errorf("can not emit ca key: %s", err)
  421. }
  422. if err := emitDHParams(); err != nil {
  423. return fmt.Errorf("can not emit dhparams: %s", err)
  424. }
  425. if err := emitCCD(); err != nil {
  426. return fmt.Errorf("can not emit ccd: %s", err)
  427. }
  428. if err := emitIptables(); err != nil {
  429. return fmt.Errorf("can not emit iptables: %s", err)
  430. }
  431. if err := emitCRL(); err != nil {
  432. return fmt.Errorf("can not emit crl: %s", err)
  433. }
  434. logrus.Info("configurations emitted to the filesystem")
  435. return nil
  436. }
  437. // EmitWithRestart restarts vpnProc after calling EmitWithRestart().
  438. func EmitWithRestart() error {
  439. err := Emit()
  440. if err != nil {
  441. return err
  442. }
  443. if IsInitialized() {
  444. for {
  445. if vpnProc.Status() == supervisor.RUNNING || vpnProc.Status() == supervisor.STOPPED {
  446. logrus.Info("OpenVPN process is restarting")
  447. RestartVPNProc()
  448. break
  449. }
  450. time.Sleep(1 * time.Second)
  451. }
  452. }
  453. return nil
  454. }
  455. func emitToFile(path, content string, mode uint) error {
  456. // When testing don't emit files to the filesystem. Just pretend you did.
  457. if Testing {
  458. return nil
  459. }
  460. file, err := os.Create(path)
  461. if err != nil {
  462. return fmt.Errorf("Cannot create file %s: %v", path, err)
  463. }
  464. if mode != 0 {
  465. file.Chmod(os.FileMode(mode))
  466. }
  467. defer file.Close()
  468. fmt.Fprintf(file, content)
  469. return nil
  470. }
  471. func emitServerConf() error {
  472. dbServer, err := GetServerInstance()
  473. if err != nil {
  474. return fmt.Errorf("can not get server instance: %v", err)
  475. }
  476. serverInstance, err := GetServerInstance()
  477. if err != nil {
  478. return fmt.Errorf("can not retrieve server: %v", err)
  479. }
  480. port := DefaultVPNPort
  481. if serverInstance.Port != "" {
  482. port = serverInstance.Port
  483. }
  484. proto := DefaultVPNProto
  485. if serverInstance.Proto != "" {
  486. proto = serverInstance.Proto
  487. }
  488. dns := DefaultVPNDNS
  489. if serverInstance.DNS != "" {
  490. dns = serverInstance.DNS
  491. }
  492. var result bytes.Buffer
  493. server := struct {
  494. CertPath string
  495. KeyPath string
  496. CACertPath string
  497. CAKeyPath string
  498. CCDPath string
  499. CRLPath string
  500. DHParamsPath string
  501. Net string
  502. Mask string
  503. Port string
  504. Proto string
  505. DNS string
  506. }{
  507. CertPath: _DefaultCertPath,
  508. KeyPath: _DefaultKeyPath,
  509. CACertPath: _DefaultCACertPath,
  510. CAKeyPath: _DefaultCAKeyPath,
  511. CCDPath: _DefaultVPNCCDPath,
  512. CRLPath: _DefaultCRLPath,
  513. DHParamsPath: _DefaultDHParamsPath,
  514. Net: dbServer.Net,
  515. Mask: dbServer.Mask,
  516. Port: port,
  517. Proto: proto,
  518. DNS: dns,
  519. }
  520. data, err := bindata.Asset("template/server.conf.tmpl")
  521. if err != nil {
  522. return err
  523. }
  524. t, err := template.New("server.conf").Parse(string(data))
  525. if err != nil {
  526. return fmt.Errorf("can not parse server.conf.tmpl template: %s", err)
  527. }
  528. err = t.Execute(&result, server)
  529. if err != nil {
  530. return fmt.Errorf("can not render server.conf: %s", err)
  531. }
  532. // Wite rendered content into openvpn server conf.
  533. return emitToFile(_DefaultVPNConfPath, result.String(), 0)
  534. }
  535. // GetServerInstance returns the default server from the database.
  536. func GetServerInstance() (*Server, error) {
  537. var server dbServerModel
  538. db.First(&server)
  539. if db.NewRecord(server) {
  540. return nil, fmt.Errorf("can not retrieve server from db")
  541. }
  542. return &Server{dbServerModel: server}, nil
  543. }
  544. // GetConnectedUsers will return a list of users who are currently connected
  545. // to the VPN service.
  546. func GetConnectedUsers() ([]User, error) {
  547. var users []User
  548. // Open the status log file.
  549. f, err := os.Open(_DefaultStatusLogPath)
  550. if err != nil {
  551. panic(err)
  552. }
  553. cl, _ := parseStatusLog(f)
  554. for _, c := range cl {
  555. var u dbUserModel
  556. q := db.Where(dbUserModel{Username: c.CommonName}).First(&u)
  557. if q.RecordNotFound() {
  558. return nil, fmt.Errorf("common name reported by the OpenVPN is not found in the database: username='%s'", c.CommonName)
  559. }
  560. if err := q.Error; err != nil {
  561. return nil, fmt.Errorf("unknown db error: %v", err)
  562. }
  563. users = append(users, User{
  564. dbUserModel: u,
  565. isConnected: true,
  566. connectedSince: c.ConnectedSince,
  567. bytesReceived: c.BytesReceived,
  568. bytesSent: c.BytesSent,
  569. })
  570. }
  571. return users, nil
  572. }
  573. // IsInitialized checks if there is a default VPN server configured in the database or not.
  574. func IsInitialized() bool {
  575. var server dbServerModel
  576. db.First(&server)
  577. if db.NewRecord(server) {
  578. return false
  579. }
  580. return true
  581. }
  582. func emitServerKey() error {
  583. server, err := GetServerInstance()
  584. if err != nil {
  585. return err
  586. }
  587. // Write rendered content into key file.
  588. return emitToFile(_DefaultKeyPath, server.Key, 0600)
  589. }
  590. func emitServerCert() error {
  591. server, err := GetServerInstance()
  592. if err != nil {
  593. return err
  594. }
  595. // Write rendered content into the cert file.
  596. return emitToFile(_DefaultCertPath, server.Cert, 0)
  597. }
  598. func emitCRL() error {
  599. var revokedDBItems []*dbRevokedModel
  600. db.Find(&revokedDBItems)
  601. var revokedCertSerials []*big.Int
  602. for _, item := range revokedDBItems {
  603. bi := big.NewInt(0)
  604. bi.SetString(item.SerialNumber, 16)
  605. revokedCertSerials = append(revokedCertSerials, bi)
  606. }
  607. systemCA, err := GetSystemCA()
  608. if err != nil {
  609. return fmt.Errorf("can not emit CRL: %v", err)
  610. }
  611. crl, err := pki.NewCRL(systemCA, revokedCertSerials...)
  612. if err != nil {
  613. return fmt.Errorf("can not emit crl: %v", err)
  614. }
  615. return emitToFile(_DefaultCRLPath, crl, 0)
  616. }
  617. func emitCACert() error {
  618. server, err := GetServerInstance()
  619. if err != nil {
  620. return err
  621. }
  622. // Write rendered content into the ca cert file.
  623. return emitToFile(_DefaultCACertPath, server.CACert, 0)
  624. }
  625. func emitCAKey() error {
  626. server, err := GetServerInstance()
  627. if err != nil {
  628. return err
  629. }
  630. // Write rendered content into the ca key file.
  631. return emitToFile(_DefaultCAKeyPath, server.CAKey, 0600)
  632. }
  633. func emitCCD() error {
  634. users, err := GetAllUsers()
  635. if err != nil {
  636. return err
  637. }
  638. // Filesystem related stuff. Skipping when testing.
  639. if !Testing {
  640. // Clean and then create and write rendered ccd data.
  641. err = os.RemoveAll(_DefaultVPNCCDPath)
  642. if err != nil {
  643. if os.IsNotExist(err) {
  644. } else {
  645. return err
  646. }
  647. }
  648. if _, err := os.Stat(_DefaultVPNCCDPath); err != nil {
  649. }
  650. err = os.Mkdir(_DefaultVPNCCDPath, 0755)
  651. if err != nil {
  652. if !os.IsExist(err) {
  653. return err
  654. }
  655. }
  656. }
  657. server, err := GetServerInstance()
  658. if err != nil {
  659. return fmt.Errorf("can not get server instance: %v", err)
  660. }
  661. // Render ccd templates for the users.
  662. for _, user := range users {
  663. var associatedRoutes [][3]string
  664. var serverNets [][2]string
  665. for _, network := range GetAllNetworks() {
  666. switch network.Type {
  667. case ROUTE:
  668. for _, assocUsername := range network.GetAssociatedUsernames() {
  669. if assocUsername == user.Username {
  670. via := network.Via
  671. ip, mask, err := net.ParseCIDR(network.CIDR)
  672. if err != nil {
  673. return err
  674. }
  675. associatedRoutes = append(associatedRoutes, [3]string{ip.To4().String(), net.IP(mask.Mask).To4().String(), via})
  676. }
  677. }
  678. case SERVERNET:
  679. // Push associated servernets to client when client is not getting vpn server as default gw.
  680. if user.IsNoGW() {
  681. for _, assocUsername := range network.GetAssociatedUsernames() {
  682. if assocUsername == user.Username {
  683. ip, mask, err := net.ParseCIDR(network.CIDR)
  684. if err != nil {
  685. return err
  686. }
  687. serverNets = append(serverNets, [2]string{ip.To4().String(), net.IP(mask.Mask).To4().String()})
  688. }
  689. }
  690. }
  691. }
  692. }
  693. var result bytes.Buffer
  694. params := struct {
  695. IP string
  696. NetMask string
  697. Routes [][3]string // [0] is IP, [1] is Netmask, [2] is Via
  698. Servernets [][2]string // [0] is IP, [1] is Netmask
  699. RedirectGW bool
  700. }{IP: user.getIP().String(), NetMask: server.Mask, Routes: associatedRoutes, Servernets: serverNets, RedirectGW: !user.NoGW}
  701. data, err := bindata.Asset("template/ccd.file.tmpl")
  702. if err != nil {
  703. return err
  704. }
  705. t, err := template.New("ccd.file.tmpl").Parse(string(data))
  706. if err != nil {
  707. return fmt.Errorf("can not parse ccd.file.tmpl template: %s", err)
  708. }
  709. err = t.Execute(&result, params)
  710. if err != nil {
  711. return fmt.Errorf("can not render ccd file %s: %s", user.Username, err)
  712. }
  713. err = emitToFile(filepath.Join(_DefaultVPNCCDPath, user.Username), result.String(), 0)
  714. if err != nil {
  715. return err
  716. }
  717. }
  718. return nil
  719. }
  720. func emitDHParams() error {
  721. var result bytes.Buffer
  722. data, err := bindata.Asset("template/dh4096.pem.tmpl")
  723. if err != nil {
  724. return err
  725. }
  726. t, err := template.New("dh4096.pem.tmpl").Parse(string(data))
  727. if err != nil {
  728. return fmt.Errorf("can not parse dh4096.pem template: %s", err)
  729. }
  730. err = t.Execute(&result, nil)
  731. if err != nil {
  732. return fmt.Errorf("can not render dh4096.pem file: %s", err)
  733. }
  734. err = emitToFile(_DefaultDHParamsPath, result.String(), 0)
  735. if err != nil {
  736. return err
  737. }
  738. return nil
  739. }
  740. func emitIptables() error {
  741. if Testing {
  742. return nil
  743. }
  744. ipt, err := iptables.NewWithProtocol(iptables.ProtocolIPv4)
  745. if err != nil {
  746. return fmt.Errorf("can not create new iptables object: %v", err)
  747. }
  748. for _, network := range GetAllNetworks() {
  749. associatedUsernames := network.GetAssociatedUsernames()
  750. switch network.Type {
  751. case SERVERNET:
  752. users, err := GetAllUsers()
  753. if err != nil {
  754. return err
  755. }
  756. // Find associated users and emit iptables configs for the users
  757. // regarding the network's type and attributes.
  758. for _, user := range users {
  759. // Find out if the user is associated or not.
  760. var found bool
  761. for _, auser := range associatedUsernames {
  762. if user.Username == auser {
  763. found = true
  764. break
  765. }
  766. }
  767. userIP, _, err := net.ParseCIDR(user.GetIPNet())
  768. if err != nil {
  769. return err
  770. }
  771. _, networkIPNet, err := net.ParseCIDR(network.CIDR)
  772. if err != nil {
  773. return err
  774. }
  775. // get destination network's iface
  776. iface := interfaceOfIP(networkIPNet)
  777. if iface == nil {
  778. logrus.Warnf("network doesn't exist on server %s[SERVERNET]: cant find interface for %s", network.Name, networkIPNet.String())
  779. return nil
  780. }
  781. // enable nat for the user to the destination network n
  782. if found {
  783. err = ipt.AppendUnique("nat", "POSTROUTING", "-s", userIP.String(), "-o", iface.Name, "-j", "MASQUERADE")
  784. if err != nil {
  785. logrus.Error(err)
  786. return err
  787. }
  788. } else {
  789. err = ipt.Delete("nat", "POSTROUTING", "-s", userIP.String(), "-o", iface.Name, "-j", "MASQUERADE")
  790. if err != nil {
  791. logrus.Debug(err)
  792. }
  793. }
  794. }
  795. }
  796. }
  797. return nil
  798. }
  799. func checkOpenVPNExecutable() bool {
  800. executable := getOpenVPNExecutable()
  801. if executable == "" {
  802. logrus.Error("openvpn is not installed ✘")
  803. return false
  804. }
  805. logrus.Debugf("openvpn executable detected: %s ✔", executable)
  806. return true
  807. }
  808. func getOpenVPNExecutable() string {
  809. cmd := exec.Command("which", "openvpn")
  810. output, err := cmd.Output()
  811. if err != nil {
  812. logrus.Errorf("openvpn is not installed: %s ✘", err)
  813. return ""
  814. }
  815. logrus.Debugf("openvpn executable detected: %s ✔", strings.TrimSpace(string(output[:])))
  816. return strings.TrimSpace(string(output[:]))
  817. }
  818. func checkOpenSSLExecutable() bool {
  819. cmd := exec.Command("which", "openssl")
  820. output, err := cmd.Output()
  821. if err != nil {
  822. logrus.Errorf("openssl is not installed: %s ✘", err)
  823. return false
  824. }
  825. logrus.Debugf("openssl executable detected: %s ✔", strings.TrimSpace(string(output[:])))
  826. return true
  827. }
  828. func checkIptablesExecutable() bool {
  829. cmd := exec.Command("which", "iptables")
  830. output, err := cmd.Output()
  831. if err != nil {
  832. logrus.Errorf("iptables is not installed: %s ✘", err)
  833. return false
  834. }
  835. logrus.Debugf("iptables executable detected: %s ✔", strings.TrimSpace(string(output[:])))
  836. return true
  837. }
  838. func ensureBaseDir() {
  839. if Testing {
  840. return
  841. }
  842. os.Mkdir(varBasePath, 0755)
  843. }
  844. func init() {
  845. ensureBaseDir()
  846. var err error
  847. vpnProc, err = supervisor.NewProcess(getOpenVPNExecutable(), varBasePath, []string{"--config", _DefaultVPNConfPath})
  848. if err != nil {
  849. logrus.Errorf("can not create process: %v", err)
  850. }
  851. }