1
0

vpn.go 27 KB

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