vpn.go 22 KB

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