yeungalan 5 gadi atpakaļ
vecāks
revīzija
d3a2c007cd
4 mainītis faili ar 43 papildinājumiem un 74 dzēšanām
  1. 1 1
      .vscode/launch.json
  2. BIN
      __debug_bin
  3. 42 73
      main.go
  4. BIN
      vnet.exe

+ 1 - 1
.vscode/launch.json

@@ -11,7 +11,7 @@
             "mode": "auto",
             "program": "${fileDirname}",
             "env": {},
-            "args": ["192.168.1.121:8181","10.9.9.9","255.0.0.0","10.8.8.8"]
+            "args": ["192.168.1.121:8181","10.9.9.9"]
         }
     ]
 }

BIN
__debug_bin


+ 42 - 73
main.go

@@ -3,60 +3,47 @@ package main
 import (
 	"encoding/hex"
 	"fmt"
-	"github.com/inszva/tap0901"
+	"github.com/songgao/packets/ethernet"
+	"github.com/songgao/water"
+	"log"
 	"net"
 	"net/http"
-	//"net/url"
-	"log"
 	"os"
-	"sync"
-	"time"
+	"os/exec"
+	"strings"
 )
 
-//Create a new virtual network interface
-var tun, _ = tap0901.OpenTun(net.ParseIP(os.Args[2]), net.IP([]byte{0, 0, 0, 0}), net.ParseIP(os.Args[3]))
+var (
+	self = net.ParseIP(os.Args[2])
+	mask = net.IPv4Mask(255, 255, 255, 0)
+)
+var ifce, _ = water.New(water.Config{
+	DeviceType: water.TAP,
+})
 
 func main() {
-	//tun, err := tap0901.OpenTun(net.IP([]byte{0, 0, 0, 0}), net.IP([]byte{0, 0, 0, 0}), net.IP([]byte{0, 0, 0, 0}))
-	/*
-		if err != nil {
-			panic(err)
-		}
-	*/
-	fmt.Println("Virtual Network Interface Created")
-	time.Sleep(2 * time.Second)
-
-	// type IP
-	/*
-		IPAddress := net.ParseIP(os.Args[2])
-		SubNet := net.ParseIP(os.Args[3])
-		GateW := net.ParseIP(os.Args[4])
-
-		//create fucking DHCP IP
-		err := tun.SetDHCPMasq(IPAddress, SubNet, GateW, net.IP([]byte{0, 0, 0, 0}))
-		if err != nil {
-			fmt.Println(err)
-		}
-	*/
 	//create http server
 	http.HandleFunc("/rcv", rcv)
 	go func() {
 		http.ListenAndServe(":8181", nil)
 	}()
 
-	tun.Connect()
-	time.Sleep(2 * time.Second)
-	szName := tun.GetNetworkName(false)
-	fmt.Println("Interface name: ", szName)
-	fmt.Println("Dest IP:" + os.Args[1])
+	var frame ethernet.Frame
+	setupIfce(net.IPNet{IP: self, Mask: mask}, ifce.Name())
 
-	tun.SetReadHandler(func(tun *tap0901.Tun, data []byte) {
-		a := hex.EncodeToString(data)
-		//bs, _ := hex.DecodeString(a)
-		//fmt.Println(string(bs))
-		log.Println("TXT>>", dde(data))
-		//tun.Write(dde(data))
+	for {
+		frame.Resize(1500)
+		n, err := ifce.Read([]byte(frame))
+		if err != nil {
+			log.Fatal(err)
+		}
+		frame = frame[:n]
+		log.Printf("Dst: %s\n", frame.Destination())
+		log.Printf("Src: %s\n", frame.Source())
+		log.Printf("Ethertype: % x\n", frame.Ethertype())
+		log.Printf("Payload: % x\n", frame.Payload())
 
+		a := hex.EncodeToString(frame)
 		resp, err := http.Get("http://" + os.Args[1] + "/rcv?packet=" + a)
 		if err != nil {
 			fmt.Println(err)
@@ -64,30 +51,11 @@ func main() {
 			defer resp.Body.Close()
 		}
 
-	})
-	wp := sync.WaitGroup{}
-	wp.Add(1)
-	go func() {
-		tun.Listen(1)
-		wp.Done()
-	}()
-
-	fmt.Println(tun.GetMTU(false))
-	//fmt.Println()
-	/*
-		for {
-			time.Sleep(3 * time.Second)
-			tun.Write([]byte("Hello World"))
-			fmt.Println("Waiting")
-		}
-		time.Sleep(10 * time.Second)
-		tun.SignalStop()
-	*/
-	wp.Wait()
+	}
 }
 
 func rcv(w http.ResponseWriter, req *http.Request) {
-	fmt.Fprintf(w, "hello\n")
+	fmt.Fprintf(w, "OK\n")
 	x, ok := req.URL.Query()["packet"]
 	if !ok || len(x[0]) < 1 {
 		fmt.Println("Url Param 'packet' is missing")
@@ -99,20 +67,21 @@ func rcv(w http.ResponseWriter, req *http.Request) {
 	if err != nil {
 		log.Println(err)
 	}
-	log.Println("RECV<<", dde(data))
-	tun.Write(dde(data))
-}
 
-func dde(packet []byte) []byte {
-	var i = len(packet) - 1
-	for packet[i] == 0 {
-		//--i
-		i--
+	ifce.Write(data)
+	if err != nil {
+		log.Fatal(err)
 	}
+}
 
-	//var temp = [i + 1]byte
-	temp := make([]byte, i+1)
-	//Array.Copy(packet, temp, i + 1)
-	temp = packet[0 : i+1]
-	return temp
+func setupIfce(ipNet net.IPNet, dev string) {
+	sargs := fmt.Sprintf("interface ip set address name=REPLACE_ME source=static addr=REPLACE_ME mask=REPLACE_ME gateway=none")
+	args := strings.Split(sargs, " ")
+	args[4] = fmt.Sprintf("name=%s", dev)
+	args[6] = fmt.Sprintf("addr=%s", ipNet.IP)
+	args[7] = fmt.Sprintf("mask=%d.%d.%d.%d", ipNet.Mask[0], ipNet.Mask[1], ipNet.Mask[2], ipNet.Mask[3])
+	cmd := exec.Command("netsh", args...)
+	if err := cmd.Run(); err != nil {
+		log.Println(err)
+	}
 }

BIN
vnet.exe