vpn.go 22 KB

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