1
0

vpn.go 22 KB

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