X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=src%2Fgovpn%2Fcmd%2Fgovpn-client%2Fmain.go;h=c4414050937f20e9740a3233d6e2d0c1fcac193e;hb=cf77814e44502cf140f063b022b662d7cc7be66d;hp=d88bb46028c26643713e7a1cc09aa368d562e355;hpb=87f01e08c6135b3e2b092903d56d7c49b3f126a5;p=govpn.git diff --git a/src/govpn/cmd/govpn-client/main.go b/src/govpn/cmd/govpn-client/main.go index d88bb46..c441405 100644 --- a/src/govpn/cmd/govpn-client/main.go +++ b/src/govpn/cmd/govpn-client/main.go @@ -1,6 +1,6 @@ /* GoVPN -- simple secure free software virtual private network daemon -Copyright (C) 2014-2015 Sergey Matveev +Copyright (C) 2014-2016 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -31,27 +31,29 @@ import ( ) var ( - remoteAddr = flag.String("remote", "", "Remote server address") - proto = flag.String("proto", "udp", "Protocol to use: udp or tcp") - ifaceName = flag.String("iface", "tap0", "TAP network interface") - IDRaw = flag.String("id", "", "Client identification") - keyPath = flag.String("key", "", "Path to passphrase file") - upPath = flag.String("up", "", "Path to up-script") - downPath = flag.String("down", "", "Path to down-script") - stats = flag.String("stats", "", "Enable stats retrieving on host:port") - proxyAddr = flag.String("proxy", "", "Use HTTP proxy on host:port") - proxyAuth = flag.String("proxy-auth", "", "user:password Basic proxy auth") - mtu = flag.Int("mtu", 1452, "MTU for outgoing packets") - timeoutP = flag.Int("timeout", 60, "Timeout seconds") - noisy = flag.Bool("noise", false, "Enable noise appending") - cpr = flag.Int("cpr", 0, "Enable constant KiB/sec out traffic rate") - egdPath = flag.String("egd", "", "Optional path to EGD socket") + remoteAddr = flag.String("remote", "", "Remote server address") + proto = flag.String("proto", "udp", "Protocol to use: udp or tcp") + ifaceName = flag.String("iface", "tap0", "TAP network interface") + verifierRaw = flag.String("verifier", "", "Verifier") + keyPath = flag.String("key", "", "Path to passphrase file") + upPath = flag.String("up", "", "Path to up-script") + downPath = flag.String("down", "", "Path to down-script") + stats = flag.String("stats", "", "Enable stats retrieving on host:port") + proxyAddr = flag.String("proxy", "", "Use HTTP proxy on host:port") + proxyAuth = flag.String("proxy-auth", "", "user:password Basic proxy auth") + mtu = flag.Int("mtu", govpn.MTUDefault, "MTU of TAP interface") + timeoutP = flag.Int("timeout", 60, "Timeout seconds") + noisy = flag.Bool("noise", false, "Enable noise appending") + encless = flag.Bool("encless", false, "Encryptionless mode") + cpr = flag.Int("cpr", 0, "Enable constant KiB/sec out traffic rate") + egdPath = flag.String("egd", "", "Optional path to EGD socket") conf *govpn.PeerConf tap *govpn.TAP timeout int firstUpCall bool = true knownPeers govpn.KnownPeers + idsCache *govpn.CipherCache ) func main() { @@ -60,36 +62,44 @@ func main() { var err error log.SetFlags(log.Ldate | log.Lmicroseconds | log.Lshortfile) - govpn.MTU = *mtu - - id, err := govpn.IDDecode(*IDRaw) - if err != nil { - log.Fatalln(err) + if *mtu > govpn.MTUMax { + log.Fatalln("Maximum allowable MTU is", govpn.MTUMax) } - if *egdPath != "" { log.Println("Using", *egdPath, "EGD") govpn.EGDInit(*egdPath) } - pub, priv := govpn.NewVerifier(id, govpn.StringFromFile(*keyPath)) + verifier, err := govpn.VerifierFromString(*verifierRaw) + if err != nil { + log.Fatalln(err) + } + priv := verifier.PasswordApply(govpn.StringFromFile(*keyPath)) + if *encless { + if *proto != "tcp" { + log.Fatalln("Currently encryptionless mode works only with TCP") + } + *noisy = true + } conf = &govpn.PeerConf{ - Id: id, - Timeout: time.Second * time.Duration(timeout), - NoiseEnable: *noisy, - CPR: *cpr, - DSAPub: pub, - DSAPriv: priv, + Id: verifier.Id, + Iface: *ifaceName, + MTU: *mtu, + Timeout: time.Second * time.Duration(timeout), + Noise: *noisy, + CPR: *cpr, + Encless: *encless, + Verifier: verifier, + DSAPriv: priv, } - govpn.PeersInitDummy(id, conf) + idsCache = govpn.NewCipherCache([]govpn.PeerId{*verifier.Id}) log.Println(govpn.VersionGet()) - tap, err = govpn.TAPListen(*ifaceName) + tap, err = govpn.TAPListen(*ifaceName, *mtu) if err != nil { log.Fatalln("Can not listen on TAP interface:", err) } - log.Println("Max MTU on TAP interface:", govpn.TAPMaxMTU()) if *stats != "" { log.Println("Stats are going to listen on", *stats) statsPort, err := net.Listen("tcp", *stats) @@ -107,6 +117,9 @@ MainCycle: timeouted := make(chan struct{}) rehandshaking := make(chan struct{}) termination := make(chan struct{}) + if *proxyAddr != "" { + *proto = "tcp" + } switch *proto { case "udp": go startUDP(timeouted, rehandshaking, termination) @@ -121,7 +134,7 @@ MainCycle: } select { case <-termSignal: - log.Fatalln("Finishing...") + log.Fatalln("Finishing") termination <- struct{}{} break MainCycle case <-timeouted: