add bypass
This commit is contained in:
@ -4,6 +4,7 @@ import (
|
||||
"io"
|
||||
"os"
|
||||
|
||||
"github.com/go-gost/gost/pkg/bypass"
|
||||
"github.com/go-gost/gost/pkg/chain"
|
||||
"github.com/go-gost/gost/pkg/components/connector"
|
||||
"github.com/go-gost/gost/pkg/components/dialer"
|
||||
@ -16,12 +17,23 @@ import (
|
||||
"github.com/go-gost/gost/pkg/service"
|
||||
)
|
||||
|
||||
var (
|
||||
chains = make(map[string]*chain.Chain)
|
||||
bypasses = make(map[string]bypass.Bypass)
|
||||
)
|
||||
|
||||
func buildService(cfg *config.Config) (services []*service.Service) {
|
||||
if cfg == nil || len(cfg.Services) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
chains := buildChain(cfg)
|
||||
for _, bypassCfg := range cfg.Bypasses {
|
||||
bypasses[bypassCfg.Name] = bypassFromConfig(&bypassCfg)
|
||||
}
|
||||
|
||||
for _, chainCfg := range cfg.Chains {
|
||||
chains[chainCfg.Name] = chainFromConfig(&chainCfg)
|
||||
}
|
||||
|
||||
for _, svc := range cfg.Services {
|
||||
listenerLogger := log.WithFields(map[string]interface{}{
|
||||
@ -37,21 +49,15 @@ func buildService(cfg *config.Config) (services []*service.Service) {
|
||||
listenerLogger.Fatal("init:", err)
|
||||
}
|
||||
|
||||
var chain *chain.Chain
|
||||
for _, ch := range chains {
|
||||
if svc.Chain == ch.Name {
|
||||
chain = ch
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
handlerLogger := log.WithFields(map[string]interface{}{
|
||||
"kind": "handler",
|
||||
"type": svc.Handler.Type,
|
||||
"service": svc.Name,
|
||||
})
|
||||
|
||||
h := registry.GetHandler(svc.Handler.Type)(
|
||||
handler.ChainOption(chain),
|
||||
handler.ChainOption(chains[svc.Chain]),
|
||||
handler.BypassOption(bypasses[svc.Bypass]),
|
||||
handler.LoggerOption(handlerLogger),
|
||||
)
|
||||
if err := h.Init(metadata.MapMetadata(svc.Handler.Metadata)); err != nil {
|
||||
@ -67,68 +73,63 @@ func buildService(cfg *config.Config) (services []*service.Service) {
|
||||
return
|
||||
}
|
||||
|
||||
func buildChain(cfg *config.Config) (chains []*chain.Chain) {
|
||||
if cfg == nil || len(cfg.Chains) == 0 {
|
||||
func chainFromConfig(cfg *config.ChainConfig) *chain.Chain {
|
||||
if cfg == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, ch := range cfg.Chains {
|
||||
c := &chain.Chain{
|
||||
Name: ch.Name,
|
||||
}
|
||||
c := &chain.Chain{}
|
||||
|
||||
selector := selectorFromConfig(ch.LB)
|
||||
for _, hop := range ch.Hops {
|
||||
group := &chain.NodeGroup{}
|
||||
for _, v := range hop.Nodes {
|
||||
node := chain.NewNode(v.Name, v.Addr)
|
||||
selector := selectorFromConfig(cfg.LB)
|
||||
for _, hop := range cfg.Hops {
|
||||
group := &chain.NodeGroup{}
|
||||
for _, v := range hop.Nodes {
|
||||
|
||||
connectorLogger := log.WithFields(map[string]interface{}{
|
||||
"kind": "connector",
|
||||
"type": v.Connector.Type,
|
||||
"hop": hop.Name,
|
||||
"node": node.Name(),
|
||||
})
|
||||
cr := registry.GetConnector(v.Connector.Type)(
|
||||
connector.LoggerOption(connectorLogger),
|
||||
)
|
||||
if err := cr.Init(metadata.MapMetadata(v.Connector.Metadata)); err != nil {
|
||||
connectorLogger.Fatal("init:", err)
|
||||
}
|
||||
|
||||
dialerLogger := log.WithFields(map[string]interface{}{
|
||||
"kind": "dialer",
|
||||
"type": v.Dialer.Type,
|
||||
"hop": hop.Name,
|
||||
"node": node.Name(),
|
||||
})
|
||||
d := registry.GetDialer(v.Dialer.Type)(
|
||||
dialer.LoggerOption(dialerLogger),
|
||||
)
|
||||
if err := d.Init(metadata.MapMetadata(v.Dialer.Metadata)); err != nil {
|
||||
dialerLogger.Fatal("init:", err)
|
||||
}
|
||||
|
||||
tr := (&chain.Transport{}).
|
||||
WithConnector(cr).
|
||||
WithDialer(d)
|
||||
|
||||
node.WithTransport(tr)
|
||||
group.AddNode(node)
|
||||
connectorLogger := log.WithFields(map[string]interface{}{
|
||||
"kind": "connector",
|
||||
"type": v.Connector.Type,
|
||||
"hop": hop.Name,
|
||||
"node": v.Name,
|
||||
})
|
||||
cr := registry.GetConnector(v.Connector.Type)(
|
||||
connector.LoggerOption(connectorLogger),
|
||||
)
|
||||
if err := cr.Init(metadata.MapMetadata(v.Connector.Metadata)); err != nil {
|
||||
connectorLogger.Fatal("init:", err)
|
||||
}
|
||||
|
||||
sel := selector
|
||||
if s := selectorFromConfig(hop.LB); s != nil {
|
||||
sel = s
|
||||
dialerLogger := log.WithFields(map[string]interface{}{
|
||||
"kind": "dialer",
|
||||
"type": v.Dialer.Type,
|
||||
"hop": hop.Name,
|
||||
"node": v.Name,
|
||||
})
|
||||
d := registry.GetDialer(v.Dialer.Type)(
|
||||
dialer.LoggerOption(dialerLogger),
|
||||
)
|
||||
if err := d.Init(metadata.MapMetadata(v.Dialer.Metadata)); err != nil {
|
||||
dialerLogger.Fatal("init:", err)
|
||||
}
|
||||
group.WithSelector(sel)
|
||||
c.AddNodeGroup(group)
|
||||
|
||||
tr := (&chain.Transport{}).
|
||||
WithConnector(cr).
|
||||
WithDialer(d)
|
||||
|
||||
node := chain.NewNode(v.Name, v.Addr).
|
||||
WithTransport(tr).
|
||||
WithBypass(bypasses[v.Bypass])
|
||||
group.AddNode(node)
|
||||
}
|
||||
|
||||
chains = append(chains, c)
|
||||
sel := selector
|
||||
if s := selectorFromConfig(hop.LB); s != nil {
|
||||
sel = s
|
||||
}
|
||||
group.WithSelector(sel)
|
||||
c.AddNodeGroup(group)
|
||||
}
|
||||
|
||||
return
|
||||
return c
|
||||
}
|
||||
|
||||
func logFromConfig(cfg *config.LogConfig) logger.Logger {
|
||||
@ -182,3 +183,11 @@ func selectorFromConfig(cfg *config.LoadbalancingConfig) chain.Selector {
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
func bypassFromConfig(cfg *config.BypassConfig) bypass.Bypass {
|
||||
if cfg == nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
return bypass.NewBypassPatterns(cfg.Reverse, cfg.Matchers...)
|
||||
}
|
||||
|
@ -22,6 +22,7 @@ services:
|
||||
metadata:
|
||||
keepAlive: 15s
|
||||
chain: chain01
|
||||
# bypass: bypass01
|
||||
|
||||
chains:
|
||||
- name: chain01
|
||||
@ -41,6 +42,7 @@ chains:
|
||||
- name: node01
|
||||
addr: ":8081"
|
||||
url: "http://gost:gost@:8081"
|
||||
# bypass: bypass01
|
||||
connector:
|
||||
type: http
|
||||
metadata:
|
||||
@ -52,11 +54,12 @@ chains:
|
||||
- name: node02
|
||||
addr: ":8082"
|
||||
url: "http://gost:gost@:8082"
|
||||
# bypass: bypass01
|
||||
connector:
|
||||
type: http
|
||||
metadata:
|
||||
userAgent: "gost/3.0"
|
||||
auth: user1:pass1
|
||||
auth: user2:pass2
|
||||
dialer:
|
||||
type: tcp
|
||||
metadata: {}
|
||||
@ -70,11 +73,42 @@ chains:
|
||||
- name: node03
|
||||
addr: ":8083"
|
||||
url: "http://gost:gost@:8083"
|
||||
# bypass: bypass01
|
||||
connector:
|
||||
type: http
|
||||
metadata:
|
||||
userAgent: "gost/3.0"
|
||||
auth: user1:pass1
|
||||
auth: user3:pass3
|
||||
dialer:
|
||||
type: tcp
|
||||
metadata: {}
|
||||
metadata: {}
|
||||
|
||||
bypasses:
|
||||
- name: bypass01
|
||||
reverse: false
|
||||
matchers:
|
||||
- .baidu.com
|
||||
- "*.example.com" # domain wildcard
|
||||
- .example.org # will match example.org and *.example.org
|
||||
|
||||
# From IANA IPv4 Special-Purpose Address Registry
|
||||
# http://www.iana.org/assignments/iana-ipv4-special-registry/iana-ipv4-special-registry.xhtml
|
||||
- 0.0.0.0/8 # RFC1122: "This host on this network"
|
||||
- 10.0.0.0/8 # RFC1918: Private-Use
|
||||
- 100.64.0.0/10 # RFC6598: Shared Address Space
|
||||
- 127.0.0.0/8 # RFC1122: Loopback
|
||||
- 169.254.0.0/16 # RFC3927: Link Local
|
||||
- 172.16.0.0/12 # RFC1918: Private-Use
|
||||
- 192.0.0.0/24 # RFC6890: IETF Protocol Assignments
|
||||
- 192.0.2.0/24 # RFC5737: Documentation (TEST-NET-1)
|
||||
- 192.88.99.0/24 # RFC3068: 6to4 Relay Anycast
|
||||
- 192.168.0.0/16 # RFC1918: Private-Use
|
||||
- 198.18.0.0/15 # RFC2544: Benchmarking
|
||||
- 198.51.100.0/24 # RFC5737: Documentation (TEST-NET-2)
|
||||
- 203.0.113.0/24 # RFC5737: Documentation (TEST-NET-3)
|
||||
- 240.0.0.0/4 # RFC1112: Reserved
|
||||
- 255.255.255.255/32 # RFC0919: Limited Broadcast
|
||||
|
||||
# From IANA Multicast Address Space Registry
|
||||
# http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml
|
||||
- 224.0.0.0/4 # RFC5771: Multicast/Reserved
|
Reference in New Issue
Block a user