Files
shield/example.go
2017-05-20 16:57:05 +08:00

72 lines
1.5 KiB
Go

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)
}