Add http/block outbound & Improve route

This commit is contained in:
世界
2022-07-03 23:23:18 +08:00
parent 18e3f43df3
commit 4fc4eb09b0
25 changed files with 408 additions and 201 deletions

52
outbound/block.go Normal file
View File

@@ -0,0 +1,52 @@
package outbound
import (
"context"
"io"
"net"
"github.com/sagernet/sing-box/adapter"
C "github.com/sagernet/sing-box/constant"
"github.com/sagernet/sing-box/log"
M "github.com/sagernet/sing/common/metadata"
N "github.com/sagernet/sing/common/network"
)
var _ adapter.Outbound = (*Block)(nil)
type Block struct {
myOutboundAdapter
}
func NewBlock(logger log.Logger, tag string) *Block {
return &Block{
myOutboundAdapter{
protocol: C.TypeBlock,
logger: logger,
tag: tag,
network: []string{C.NetworkTCP, C.NetworkUDP},
},
}
}
func (h *Block) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
h.logger.WithContext(ctx).Info("blocked connection to ", destination)
return nil, io.EOF
}
func (h *Block) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
h.logger.WithContext(ctx).Info("blocked packet connection to ", destination)
return nil, io.EOF
}
func (h *Block) NewConnection(ctx context.Context, conn net.Conn, destination M.Socksaddr) error {
conn.Close()
h.logger.WithContext(ctx).Info("blocked connection to ", destination)
return nil
}
func (h *Block) NewPacketConnection(ctx context.Context, conn N.PacketConn, destination M.Socksaddr) error {
conn.Close()
h.logger.WithContext(ctx).Info("blocked packet connection to ", destination)
return nil
}

View File

@@ -24,8 +24,12 @@ func New(router adapter.Router, logger log.Logger, index int, options option.Out
switch options.Type {
case C.TypeDirect:
return NewDirect(router, outboundLogger, options.Tag, options.DirectOptions), nil
case C.TypeBlock:
return NewBlock(outboundLogger, options.Tag), nil
case C.TypeSocks:
return NewSocks(router, outboundLogger, options.Tag, options.SocksOptions)
case C.TypeHTTP:
return NewHTTP(router, outboundLogger, options.Tag, options.HTTPOptions), nil
case C.TypeShadowsocks:
return NewShadowsocks(router, outboundLogger, options.Tag, options.ShadowsocksOptions)
default:

View File

@@ -11,14 +11,13 @@ import (
"github.com/sagernet/sing/common/buf"
"github.com/sagernet/sing/common/bufio"
E "github.com/sagernet/sing/common/exceptions"
N "github.com/sagernet/sing/common/network"
)
type myOutboundAdapter struct {
protocol string
logger log.Logger
tag string
dialer N.Dialer
network []string
}
func (a *myOutboundAdapter) Type() string {
@@ -29,6 +28,10 @@ func (a *myOutboundAdapter) Tag() string {
return a.tag
}
func (a *myOutboundAdapter) Network() []string {
return a.network
}
func CopyEarlyConn(ctx context.Context, conn net.Conn, serverConn net.Conn) error {
_payload := buf.StackNew()
payload := common.Dup(_payload)

View File

@@ -14,7 +14,7 @@ func New(router adapter.Router, options option.DialerOptions) N.Dialer {
} else {
dialer = newDetour(router, options)
}
if options.OverrideOptions != nil {
if options.OverrideOptions.IsValid() {
dialer = newOverride(dialer, common.PtrValueOrDefault(options.OverrideOptions))
}
return dialer

View File

@@ -22,9 +22,6 @@ type overrideDialer struct {
}
func newOverride(upstream N.Dialer, options option.OverrideStreamOptions) N.Dialer {
if !options.TLS && !options.UDPOverTCP {
return upstream
}
return &overrideDialer{
upstream,
options.TLS,

View File

@@ -18,6 +18,7 @@ var _ adapter.Outbound = (*Direct)(nil)
type Direct struct {
myOutboundAdapter
dialer N.Dialer
overrideOption int
overrideDestination M.Socksaddr
}
@@ -28,8 +29,9 @@ func NewDirect(router adapter.Router, logger log.Logger, tag string, options opt
protocol: C.TypeDirect,
logger: logger,
tag: tag,
dialer: dialer.New(router, options.DialerOptions),
network: []string{C.NetworkTCP, C.NetworkUDP},
},
dialer: dialer.New(router, options.DialerOptions),
}
if options.OverrideAddress != "" && options.OverridePort != 0 {
outbound.overrideOption = 1

57
outbound/http.go Normal file
View File

@@ -0,0 +1,57 @@
package outbound
import (
"context"
"net"
"os"
"github.com/sagernet/sing-box/adapter"
C "github.com/sagernet/sing-box/constant"
"github.com/sagernet/sing-box/log"
"github.com/sagernet/sing-box/option"
"github.com/sagernet/sing-box/outbound/dialer"
"github.com/sagernet/sing/common/bufio"
M "github.com/sagernet/sing/common/metadata"
N "github.com/sagernet/sing/common/network"
"github.com/sagernet/sing/protocol/http"
)
var _ adapter.Outbound = (*HTTP)(nil)
type HTTP struct {
myOutboundAdapter
client *http.Client
}
func NewHTTP(router adapter.Router, logger log.Logger, tag string, options option.HTTPOutboundOptions) *HTTP {
return &HTTP{
myOutboundAdapter{
protocol: C.TypeHTTP,
logger: logger,
tag: tag,
network: []string{C.NetworkTCP},
},
http.NewClient(dialer.New(router, options.DialerOptions), M.ParseSocksaddrHostPort(options.Server, options.ServerPort), options.Username, options.Password),
}
}
func (h *HTTP) DialContext(ctx context.Context, network string, destination M.Socksaddr) (net.Conn, error) {
h.logger.WithContext(ctx).Info("outbound connection to ", destination)
return h.client.DialContext(ctx, network, destination)
}
func (h *HTTP) ListenPacket(ctx context.Context, destination M.Socksaddr) (net.PacketConn, error) {
return nil, os.ErrInvalid
}
func (h *HTTP) NewConnection(ctx context.Context, conn net.Conn, destination M.Socksaddr) error {
outConn, err := h.DialContext(ctx, C.NetworkTCP, destination)
if err != nil {
return err
}
return bufio.CopyConn(ctx, conn, outConn)
}
func (h *HTTP) NewPacketConnection(ctx context.Context, conn N.PacketConn, destination M.Socksaddr) error {
return os.ErrInvalid
}

View File

@@ -21,6 +21,7 @@ var _ adapter.Outbound = (*Shadowsocks)(nil)
type Shadowsocks struct {
myOutboundAdapter
dialer N.Dialer
method shadowsocks.Method
serverAddr M.Socksaddr
}
@@ -31,8 +32,9 @@ func NewShadowsocks(router adapter.Router, logger log.Logger, tag string, option
protocol: C.TypeDirect,
logger: logger,
tag: tag,
dialer: dialer.New(router, options.DialerOptions),
network: options.Network.Build(),
},
dialer: dialer.New(router, options.DialerOptions),
}
var err error
outbound.method, err = shadowimpl.FetchMethod(options.Method, options.Password)

View File

@@ -23,7 +23,7 @@ type Socks struct {
}
func NewSocks(router adapter.Router, logger log.Logger, tag string, options option.SocksOutboundOptions) (*Socks, error) {
dialer := dialer.New(router, options.DialerOptions)
detour := dialer.New(router, options.DialerOptions)
var version socks.Version
var err error
if options.Version != "" {
@@ -39,9 +39,9 @@ func NewSocks(router adapter.Router, logger log.Logger, tag string, options opti
protocol: C.TypeSocks,
logger: logger,
tag: tag,
dialer: dialer,
network: options.Network.Build(),
},
socks.NewClient(dialer, M.ParseSocksaddrHostPort(options.Server, options.ServerPort), version, options.Username, options.Password),
socks.NewClient(detour, M.ParseSocksaddrHostPort(options.Server, options.ServerPort), version, options.Username, options.Password),
}, nil
}