property. An attacker can not know anything from captured traffic, even
if pre-shared key is compromised.
+Also you can provide up and down scripts that will be executed after
+either connection is initiated (up-script in background), or is went
+down. The first argument for them is an interface name.
+
COMPARISON TO OpenVPN
* Faster handshake
client% route -6 add default fc00::1
client% while :; do govpn -key key.txt -iface tap10 -remote [fe80::1%me0]:1194; done
+Example up-script:
+
+ client% cat > up.sh <<EOF
+ #!/bin/sh
+ dhclient $1
+ rtsol $1
+ EOF
+ client% chmod +x up.sh
+ client% govpn -key key.txt -iface tap10 -remote [fe80::1%me0]:1194 -up ./up.sh
+
If client won't finish handshake during -timeout, then it will exit.
If no packets are received from remote side during timeout, then daemon
will stop sending packets to the client and client will exit. In all
package main
import (
+ "bytes"
"encoding/binary"
"encoding/hex"
"flag"
"io/ioutil"
"log"
"net"
+ "os"
+ "os/exec"
+ "os/signal"
"time"
"code.google.com/p/go.crypto/poly1305"
bindAddr = flag.String("bind", "", "Bind to address")
ifaceName = flag.String("iface", "tap0", "TAP network interface")
keyPath = flag.String("key", "", "Path to authentication key file")
+ upPath = flag.String("up", "", "Path to up-script")
+ downPath = flag.String("down", "", "Path to down-script")
mtu = flag.Int("mtu", 1500, "MTU")
timeoutP = flag.Int("timeout", 60, "Timeout seconds")
verboseP = flag.Bool("v", false, "Increase verbosity")
size int
}
+func ScriptCall(path *string) {
+ if *path == "" {
+ return
+ }
+ cmd := exec.Command(*path, *ifaceName)
+ var out bytes.Buffer
+ cmd.Stdout = &out
+ if err := cmd.Run(); err != nil {
+ fmt.Println(time.Now(), "script error: ", err.Error(), string(out.Bytes()))
+ }
+}
+
func main() {
flag.Parse()
timeout := *timeoutP
heartbeat := time.Tick(time.Second * time.Duration(timeout/3))
heartbeatMark := []byte(HeartBeatMark)
+ termSignal := make(chan os.Signal, 1)
+ signal.Notify(termSignal, os.Interrupt, os.Kill)
+
finished := false
for {
if finished {
break
}
select {
+ case <-termSignal:
+ finished = true
case <-heartbeat:
go func() { ethSink <- -1 }()
case udpPkt = <-udpSink:
fmt.Print("[HS-OK]")
peer = p
delete(states, addr)
+ go ScriptCall(upPath)
}
continue
}
}
}
}
+ ScriptCall(downPath)
}