mirror of
https://github.com/netbirdio/netbird.git
synced 2026-09-29 10:09:07 +02:00
Add socks5 proxy
This commit is contained in:
+4
-11
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user