Skip to content

Instantly share code, notes, and snippets.

@gen1us2k
Created July 23, 2017 10:26
Show Gist options
  • Save gen1us2k/4af7dfba21d9f026f3473fb10c0de5f2 to your computer and use it in GitHub Desktop.
Save gen1us2k/4af7dfba21d9f026f3473fb10c0de5f2 to your computer and use it in GitHub Desktop.
package main
import (
"log"
"net"
"os/exec"
"github.com/hsheth2/water"
)
var (
Iface = "192.168.137.2/24"
Dest = "192.168.137.1:8001"
BindAddr = ":8001"
)
func createIface() (*water.Interface, error) {
ifce, err := water.NewTUN("tun0")
if err != nil {
return nil, err
}
if err := exec.Command("ip", "link", "set", "tun0", "up").Run(); err != nil {
return nil, err
}
if err := exec.Command("ip", "addr", "add", Iface, "dev", "tun0").Run(); err != nil {
return nil, err
}
return ifce, nil
}
func main() {
ifce, err := createIface()
if err != nil {
log.Fatal(err)
}
go listenInterface(ifce)
addr, err := net.ResolveUDPAddr("udp", BindAddr)
if err != nil {
log.Fatal(err)
}
/* Now listen at selected port */
conn, err := net.ListenUDP("udp", addr)
if err != nil {
log.Fatal(err)
}
defer conn.Close()
buf := make([]byte, 1500)
for {
n, _, err := conn.ReadFromUDP(buf)
packet := buf[0:n]
if err != nil {
log.Println("Error: ", err)
}
_, err = ifce.Write(packet)
if err != nil {
log.Println(err)
}
}
}
func listenInterface(ifce *water.Interface) {
buffer := make([]byte, 1500)
for {
n, err := ifce.Read(buffer)
if err != nil {
log.Println(err)
continue
}
if n > 0 {
packet := buffer[0:n]
addr, err := net.ResolveUDPAddr("udp", Dest)
if err != nil {
log.Println(err)
}
local, err := net.ResolveUDPAddr("udp", "127.0.0.1:0")
if err != nil {
log.Println(err)
}
conn, err := net.DialUDP("udp", local, addr)
if err != nil {
log.Println(err)
}
defer conn.Close()
conn.Write(packet)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment