From f19e36a17a85f8251e883e6214d6ebb4bdca093e Mon Sep 17 00:00:00 2001 From: Eric Yan Date: Sat, 20 May 2017 16:57:05 +0800 Subject: [PATCH] Add an example --- example.go | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 example.go diff --git a/example.go b/example.go new file mode 100644 index 0000000..5cf295b --- /dev/null +++ b/example.go @@ -0,0 +1,71 @@ +package main + +import ( + "flag" + "io" + "log" + "os" + "os/signal" + "syscall" + + "github.com/ericyan/shield/transport/udp" + "github.com/ericyan/shield/tuntap" +) + +func main() { + bind := flag.String("bind", "0.0.0.0:1984", "ip and port to bind") + peer := flag.String("peer", "", "ip and port of the peer") + ip := flag.String("ip", "172.16.0.1/31", "ip of the tun device (in CIDR)") + mtu := flag.Int("mtu", 1350, "MTU of the tun device") + bufsize := flag.Int("bufsize", 1500, "size of the buffer") + flag.Parse() + + // Set up the TUN device + tun, err := tuntap.NewTUN() + if err != nil { + log.Fatal(err) + } + tun.SetMTU(*mtu) + addr, err := tuntap.ParseCIDR(*ip) + if err != nil { + log.Fatal(err) + } + tun.AddAddr(addr) + tun.Up() + + // Set up the UDP transport + udp, err := udp.New(*bind, *peer) + if err != nil { + log.Fatal(err) + } + + // Anything received from UDP goes to TUN + go func() { + buf := make([]byte, *bufsize) + _, err := io.CopyBuffer(tun, udp, buf) + if err != nil { + log.Fatal(err) + } + }() + + // Anything received from TUN goes to UDP + go func() { + buf := make([]byte, *bufsize) + _, err := io.CopyBuffer(udp, tun, buf) + if err != nil { + log.Fatal(err) + } + }() + + log.Printf("Listening on %s with peer %s", udp.LocalAddr(), udp.RemoteAddr()) + addrs, err := tun.Addrs() + if err != nil { + log.Fatal(err) + } + log.Printf("%s: %v", tun.Attrs().Name, addrs) + + sig := make(chan os.Signal) + signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM) + s := <-sig + log.Fatalf("Signal (%v) received, stopping\n", s) +}