Add socks5 proxy

This commit is contained in:
Zoltan Papp
2023-12-13 16:58:31 +01:00
parent cec4232860
commit 9c6c944e46
5 changed files with 105 additions and 11 deletions
+4 -11
View File
@@ -4,16 +4,14 @@ package iface
import (
"net"
"net/netip"
"os"
"github.com/pion/transport/v2"
"golang.zx2c4.com/wireguard/ipc"
"golang.zx2c4.com/wireguard/tun/netstack"
"github.com/netbirdio/netbird/iface/bind"
"github.com/netbirdio/netbird/iface/uspproxy"
log "github.com/sirupsen/logrus"
"golang.zx2c4.com/wireguard/device"
)
@@ -49,6 +47,7 @@ func (c *tunDevice) WgAddress() WGAddress {
}
func (t *tunDevice) Device() *device.Device {
// todo: potential nil pointer exception
return t.tunDevice
}
@@ -91,19 +90,14 @@ func (c *tunDevice) Close() error {
return err3
}
// createWithUserspace Creates a new Wireguard interface, using wireguard-go userspace implementation
func (c *tunDevice) createWithUserspace() (NetInterface, error) {
tunIface, _, err := netstack.CreateNetTUN(
[]netip.Addr{netip.MustParseAddr(c.address.IP.String())},
[]netip.Addr{netip.MustParseAddr("8.8.8.8")},
1420)
nsTun := uspproxy.NewNetStackTun(c.address.IP.String())
tunIface, err := nsTun.Create()
if err != nil {
log.Debugf("createWithUserspace failed with error: %v", err)
return nil, err
}
c.wrapper = newDeviceWrapper(tunIface)
// We need to create a wireguard-go device and listen to configuration requests
tunDev := device.NewDevice(
c.wrapper,
c.iceBind,
@@ -111,7 +105,6 @@ func (c *tunDevice) createWithUserspace() (NetInterface, error) {
)
err = tunDev.Up()
if err != nil {
log.Debugf("tunDev.Up() failed with error: %v", err)
_ = tunIface.Close()
return nil, err
}
+43
View File
@@ -0,0 +1,43 @@
package uspproxy
import (
"context"
"net"
"github.com/armon/go-socks5"
log "github.com/sirupsen/logrus"
)
type Dialer interface {
Dial(ctx context.Context, network, addr string) (net.Conn, error)
}
// Proxy todo close server
type Proxy struct {
server *socks5.Server
}
func NewSocks5(dialer Dialer) (*Proxy, error) {
conf := &socks5.Config{
Dial: dialer.Dial,
}
server, err := socks5.New(conf)
if err != nil {
log.Debugf("failed to init socks5 proxy: %s", err)
return nil, err
}
return &Proxy{
server: server,
}, nil
}
func (s *Proxy) ListenAndServe(addr string) error {
go func() {
err := s.server.ListenAndServe("tcp", addr)
if err != nil {
log.Debugf("failed to start socks5 proxy: %s", err)
}
}()
return nil
}
+55
View File
@@ -0,0 +1,55 @@
package uspproxy
import (
"context"
"net"
"net/netip"
log "github.com/sirupsen/logrus"
"golang.zx2c4.com/wireguard/tun"
"golang.zx2c4.com/wireguard/tun/netstack"
)
type NSDialer struct {
net *netstack.Net
}
func (d *NSDialer) Dial(ctx context.Context, network, addr string) (net.Conn, error) {
conn, err := d.net.Dial(network, addr)
if err != nil {
log.Debugf("failed to deal connection: %s", err)
}
return conn, err
}
type NetStackTun struct {
address string
proxy *Proxy
}
func NewNetStackTun(address string) *NetStackTun {
return &NetStackTun{
address: address,
}
}
func (t *NetStackTun) Create() (tun.Device, error) {
nsTunDev, tunNet, err := netstack.CreateNetTUN(
[]netip.Addr{netip.MustParseAddr(t.address)},
[]netip.Addr{netip.MustParseAddr("8.8.8.8")},
1420)
if err != nil {
return nil, err
}
dialer := &NSDialer{tunNet}
t.proxy, err = NewSocks5(dialer)
if err != nil {
// close nsTunDev
return nil, err
}
err = t.proxy.ListenAndServe("127.0.0.1:1234")
return nsTunDev, nil
}