vpn.go 24 KB

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