wintun

package module
v0.0.0-...-383598c Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 10, 2024 License: MIT Imports: 6 Imported by: 0

README

wintun-go

golang client for wintun

Example:
package main

import (
    "context"
    "log"
    "net"
    "net/netip"

    "github.com/lysShub/wintun-go"
    "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg"
    "gvisor.dev/gvisor/pkg/tcpip/header" // go get gvisor.dev/gvisor@go
)

// curl google.com
func main() {
    wintun.MustLoad(wintun.DLL)
    defer wintun.Release()

    ips, err := net.DefaultResolver.LookupIP(context.Background(), "ip4", "google.com")
    if err != nil {
        log.Fatal(err)
    }

    ap, err := wintun.CreateAdapter("capture-google")
    if err != nil {
        log.Fatal(err)
    }
    defer ap.Close()
    luid, err := ap.GetAdapterLuid()
    if err != nil {
        log.Fatal(err)
    }

    var addr = netip.PrefixFrom(netip.AddrFrom4([4]byte{10, 0, 7, 3}), 24)
    err = luid.SetIPAddresses([]netip.Prefix{addr})
    if err != nil {
        log.Fatal(err)
    }

    var routs []*winipcfg.RouteData
    for _, e := range ips {
        ip := netip.AddrFrom4([4]byte(e))
        dst := netip.PrefixFrom(ip, ip.BitLen())
        routs = append(routs, &winipcfg.RouteData{
            Destination: dst,
            NextHop:     addr.Addr(),
            Metric:      5,
        })
    }
    err = luid.AddRoutes(routs)
    if err != nil {
        log.Fatal(err)
    }

    for {
        ip, err := ap.Receive(context.Background())
        if err != nil {
            log.Fatal(err)
        }

        if header.IPVersion(ip) == 4 {
            iphdr := header.IPv4(ip)
            if iphdr.TransportProtocol() == header.TCPProtocolNumber {
                tcphdr := header.TCP(iphdr.Payload())

                log.Printf("%s:%d --> %s:%d %s\n",
                    iphdr.SourceAddress().String(), tcphdr.SourcePort(),
                    iphdr.DestinationAddress().String(), tcphdr.DestinationPort(),
                    tcphdr.Flags(),
                )
            }
        }

        err = ap.ReleasePacket(ip)
        if err != nil {
            log.Fatal(err)
        }
    }
}

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func SetLogger

func SetLogger(logger LoggerCallback) error

Types

type ErrAdapterClosed

type ErrAdapterClosed struct{}

func (ErrAdapterClosed) Error

func (ErrAdapterClosed) Error() string

type ErrAdapterStoped

type ErrAdapterStoped struct{}

func (ErrAdapterStoped) Error

func (ErrAdapterStoped) Error() string

type ErrLoaded

type ErrLoaded struct{}

func (ErrLoaded) Error

func (ErrLoaded) Error() string

func (ErrLoaded) Temporary

func (ErrLoaded) Temporary() bool

type ErrNotLoad

type ErrNotLoad struct{}

func (ErrNotLoad) Error

func (ErrNotLoad) Error() string

type LoggerCallback

type LoggerCallback func(level LoggerLevel, timestamp uint64, msg *uint16) uintptr

func DefaultCallback

func DefaultCallback(log *slog.Logger) LoggerCallback

type LoggerLevel

type LoggerLevel int
const (
	Info LoggerLevel = iota
	Warn
	Error
)

type Mem

type Mem []byte

type Option

type Option func(*options)

func Guid

func Guid(guid *windows.GUID) Option

func RingBuff

func RingBuff(size uint32) Option

func TunType

func TunType(typ string) Option

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL