mirror of
https://github.com/go-gost/gost.git
synced 2026-10-08 12:05:46 +00:00
Compare commits
16
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3418dd0f00 | ||
|
|
21463c0e9b | ||
|
|
11077eaa75 | ||
|
|
9cd94cb68b | ||
|
|
37ef13655d | ||
|
|
961646fb46 | ||
|
|
666846d352 | ||
|
|
c70521ddab | ||
|
|
7c91dfb56f | ||
|
|
4b88c240f8 | ||
|
|
1b31c80d2c | ||
|
|
810f9f4d8f | ||
|
|
5fe56cb63f | ||
|
|
733655625a | ||
|
|
670a118c6d | ||
|
|
cb0d81f938 |
@@ -1,4 +1,52 @@
|
|||||||
gost 3.0
|
# GO Simple Tunnel
|
||||||
======
|
|
||||||
|
|
||||||
WORK IN PROGRESS...
|
### GO语言实现的安全隧道
|
||||||
|
|
||||||
|
## 功能特性
|
||||||
|
|
||||||
|
- [x] 多端口监听
|
||||||
|
- [x] 多级转发链
|
||||||
|
- [x] 多协议支持
|
||||||
|
- [x] TCP/UDP端口转发
|
||||||
|
- [x] TCP/UDP透明代理
|
||||||
|
- [x] DNS解析和代理
|
||||||
|
- [x] TUN/TAP设备
|
||||||
|
- [x] 负载均衡
|
||||||
|
- [x] 路由控制
|
||||||
|
- [x] 动态配置
|
||||||
|
- [x] Prometheus监控指标
|
||||||
|
- [x] Web API
|
||||||
|
- [ ] Web UI
|
||||||
|
|
||||||
|
Wiki站点:[https://latest.gost.run](https://latest.gost.run)
|
||||||
|
|
||||||
|
Telegram讨论群:[https://t.me/gogost](https://t.me/gogost)
|
||||||
|
|
||||||
|
Google讨论组:[https://groups.google.com/d/forum/go-gost](https://groups.google.com/d/forum/go-gost)
|
||||||
|
|
||||||
|
旧版入口:[v2.gost.run](https://v2.gost.run)
|
||||||
|
|
||||||
|
## 下载安装
|
||||||
|
|
||||||
|
|
||||||
|
### 二进制文件
|
||||||
|
|
||||||
|
[https://github.com/go-gost/gost/releases](https://github.com/go-gost/gost/releases)
|
||||||
|
|
||||||
|
### 源码编译
|
||||||
|
|
||||||
|
```
|
||||||
|
git clone https://github.com/go-gost/gost.git
|
||||||
|
cd gost/cmd/gost
|
||||||
|
go build
|
||||||
|
```
|
||||||
|
|
||||||
|
### Docker
|
||||||
|
|
||||||
|
```
|
||||||
|
docker pull gogost/gost
|
||||||
|
```
|
||||||
|
|
||||||
|
### Shadowsocks Android插件
|
||||||
|
|
||||||
|
[xausky/ShadowsocksGostPlugin](https://github.com/xausky/ShadowsocksGostPlugin)
|
||||||
|
|||||||
+57
-44
@@ -9,9 +9,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-gost/core/metadata"
|
|
||||||
"github.com/go-gost/core/registry"
|
|
||||||
"github.com/go-gost/x/config"
|
"github.com/go-gost/x/config"
|
||||||
|
"github.com/go-gost/x/metadata"
|
||||||
|
"github.com/go-gost/x/registry"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@@ -87,11 +87,12 @@ func buildConfigFromCmd(services, nodes stringList) (*config.Config, error) {
|
|||||||
nodes = append(nodes, nodeCfg)
|
nodes = append(nodes, nodeCfg)
|
||||||
}
|
}
|
||||||
|
|
||||||
md := metadata.MapMetadata(nodeConfig.Connector.Metadata)
|
mc := nodeConfig.Connector.Metadata
|
||||||
|
md := metadata.NewMetadata(mc)
|
||||||
|
|
||||||
hopConfig := &config.HopConfig{
|
hopConfig := &config.HopConfig{
|
||||||
Name: fmt.Sprintf("hop-%d", i),
|
Name: fmt.Sprintf("hop-%d", i),
|
||||||
Selector: parseSelector(md),
|
Selector: parseSelector(mc),
|
||||||
Nodes: nodes,
|
Nodes: nodes,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,7 +112,7 @@ func buildConfigFromCmd(services, nodes stringList) (*config.Config, error) {
|
|||||||
}
|
}
|
||||||
hopConfig.Bypass = bypassCfg.Name
|
hopConfig.Bypass = bypassCfg.Name
|
||||||
cfg.Bypasses = append(cfg.Bypasses, bypassCfg)
|
cfg.Bypasses = append(cfg.Bypasses, bypassCfg)
|
||||||
md.Del("bypass")
|
delete(mc, "bypass")
|
||||||
}
|
}
|
||||||
if v := metadata.GetString(md, "resolver"); v != "" {
|
if v := metadata.GetString(md, "resolver"); v != "" {
|
||||||
resolverCfg := &config.ResolverConfig{
|
resolverCfg := &config.ResolverConfig{
|
||||||
@@ -130,7 +131,7 @@ func buildConfigFromCmd(services, nodes stringList) (*config.Config, error) {
|
|||||||
}
|
}
|
||||||
hopConfig.Resolver = resolverCfg.Name
|
hopConfig.Resolver = resolverCfg.Name
|
||||||
cfg.Resolvers = append(cfg.Resolvers, resolverCfg)
|
cfg.Resolvers = append(cfg.Resolvers, resolverCfg)
|
||||||
md.Del("resolver")
|
delete(mc, "resolver")
|
||||||
}
|
}
|
||||||
if v := metadata.GetString(md, "hosts"); v != "" {
|
if v := metadata.GetString(md, "hosts"); v != "" {
|
||||||
hostsCfg := &config.HostsConfig{
|
hostsCfg := &config.HostsConfig{
|
||||||
@@ -151,12 +152,18 @@ func buildConfigFromCmd(services, nodes stringList) (*config.Config, error) {
|
|||||||
}
|
}
|
||||||
hopConfig.Hosts = hostsCfg.Name
|
hopConfig.Hosts = hostsCfg.Name
|
||||||
cfg.Hosts = append(cfg.Hosts, hostsCfg)
|
cfg.Hosts = append(cfg.Hosts, hostsCfg)
|
||||||
md.Del("hosts")
|
delete(mc, "hosts")
|
||||||
}
|
}
|
||||||
|
|
||||||
if v := metadata.GetString(md, "interface"); v != "" {
|
if v := metadata.GetString(md, "interface"); v != "" {
|
||||||
hopConfig.Interface = v
|
hopConfig.Interface = v
|
||||||
md.Del("interface")
|
delete(mc, "interface")
|
||||||
|
}
|
||||||
|
if v := metadata.GetInt(md, "so_mark"); v > 0 {
|
||||||
|
hopConfig.SockOpts = &config.SockOptsConfig{
|
||||||
|
Mark: v,
|
||||||
|
}
|
||||||
|
delete(mc, "so_mark")
|
||||||
}
|
}
|
||||||
|
|
||||||
chain.Hops = append(chain.Hops, hopConfig)
|
chain.Hops = append(chain.Hops, hopConfig)
|
||||||
@@ -182,10 +189,11 @@ func buildConfigFromCmd(services, nodes stringList) (*config.Config, error) {
|
|||||||
}
|
}
|
||||||
cfg.Services = append(cfg.Services, service)
|
cfg.Services = append(cfg.Services, service)
|
||||||
|
|
||||||
md := metadata.MapMetadata(service.Handler.Metadata)
|
mh := service.Handler.Metadata
|
||||||
|
md := metadata.NewMetadata(mh)
|
||||||
if v := metadata.GetInt(md, "retries"); v > 0 {
|
if v := metadata.GetInt(md, "retries"); v > 0 {
|
||||||
service.Handler.Retries = v
|
service.Handler.Retries = v
|
||||||
md.Del("retries")
|
delete(mh, "retries")
|
||||||
}
|
}
|
||||||
if v := metadata.GetString(md, "admission"); v != "" {
|
if v := metadata.GetString(md, "admission"); v != "" {
|
||||||
admCfg := &config.AdmissionConfig{
|
admCfg := &config.AdmissionConfig{
|
||||||
@@ -203,7 +211,7 @@ func buildConfigFromCmd(services, nodes stringList) (*config.Config, error) {
|
|||||||
}
|
}
|
||||||
service.Admission = admCfg.Name
|
service.Admission = admCfg.Name
|
||||||
cfg.Admissions = append(cfg.Admissions, admCfg)
|
cfg.Admissions = append(cfg.Admissions, admCfg)
|
||||||
md.Del("admission")
|
delete(mh, "admission")
|
||||||
}
|
}
|
||||||
if v := metadata.GetString(md, "bypass"); v != "" {
|
if v := metadata.GetString(md, "bypass"); v != "" {
|
||||||
bypassCfg := &config.BypassConfig{
|
bypassCfg := &config.BypassConfig{
|
||||||
@@ -221,7 +229,7 @@ func buildConfigFromCmd(services, nodes stringList) (*config.Config, error) {
|
|||||||
}
|
}
|
||||||
service.Bypass = bypassCfg.Name
|
service.Bypass = bypassCfg.Name
|
||||||
cfg.Bypasses = append(cfg.Bypasses, bypassCfg)
|
cfg.Bypasses = append(cfg.Bypasses, bypassCfg)
|
||||||
md.Del("bypass")
|
delete(mh, "bypass")
|
||||||
}
|
}
|
||||||
if v := metadata.GetString(md, "resolver"); v != "" {
|
if v := metadata.GetString(md, "resolver"); v != "" {
|
||||||
resolverCfg := &config.ResolverConfig{
|
resolverCfg := &config.ResolverConfig{
|
||||||
@@ -240,7 +248,7 @@ func buildConfigFromCmd(services, nodes stringList) (*config.Config, error) {
|
|||||||
}
|
}
|
||||||
service.Resolver = resolverCfg.Name
|
service.Resolver = resolverCfg.Name
|
||||||
cfg.Resolvers = append(cfg.Resolvers, resolverCfg)
|
cfg.Resolvers = append(cfg.Resolvers, resolverCfg)
|
||||||
md.Del("resolver")
|
delete(mh, "resolver")
|
||||||
}
|
}
|
||||||
if v := metadata.GetString(md, "hosts"); v != "" {
|
if v := metadata.GetString(md, "hosts"); v != "" {
|
||||||
hostsCfg := &config.HostsConfig{
|
hostsCfg := &config.HostsConfig{
|
||||||
@@ -261,7 +269,7 @@ func buildConfigFromCmd(services, nodes stringList) (*config.Config, error) {
|
|||||||
}
|
}
|
||||||
service.Hosts = hostsCfg.Name
|
service.Hosts = hostsCfg.Name
|
||||||
cfg.Hosts = append(cfg.Hosts, hostsCfg)
|
cfg.Hosts = append(cfg.Hosts, hostsCfg)
|
||||||
md.Del("hosts")
|
delete(mh, "hosts")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -318,12 +326,13 @@ func buildServiceConfig(url *url.URL) (*config.ServiceConfig, error) {
|
|||||||
auth.Password, _ = url.User.Password()
|
auth.Password, _ = url.User.Password()
|
||||||
}
|
}
|
||||||
|
|
||||||
md := metadata.MapMetadata{}
|
m := map[string]any{}
|
||||||
for k, v := range url.Query() {
|
for k, v := range url.Query() {
|
||||||
if len(v) > 0 {
|
if len(v) > 0 {
|
||||||
md[k] = v[0]
|
m[k] = v[0]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
md := metadata.NewMetadata(m)
|
||||||
|
|
||||||
if sa := metadata.GetString(md, "auth"); sa != "" {
|
if sa := metadata.GetString(md, "auth"); sa != "" {
|
||||||
au, err := parseAuthFromCmd(sa)
|
au, err := parseAuthFromCmd(sa)
|
||||||
@@ -332,16 +341,16 @@ func buildServiceConfig(url *url.URL) (*config.ServiceConfig, error) {
|
|||||||
}
|
}
|
||||||
auth = au
|
auth = au
|
||||||
}
|
}
|
||||||
md.Del("auth")
|
delete(m, "auth")
|
||||||
|
|
||||||
tlsConfig := &config.TLSConfig{
|
tlsConfig := &config.TLSConfig{
|
||||||
CertFile: metadata.GetString(md, "certFile"),
|
CertFile: metadata.GetString(md, "certFile"),
|
||||||
KeyFile: metadata.GetString(md, "keyFile"),
|
KeyFile: metadata.GetString(md, "keyFile"),
|
||||||
CAFile: metadata.GetString(md, "caFile"),
|
CAFile: metadata.GetString(md, "caFile"),
|
||||||
}
|
}
|
||||||
md.Del("certFile")
|
delete(m, "certFile")
|
||||||
md.Del("keyFile")
|
delete(m, "keyFile")
|
||||||
md.Del("caFile")
|
delete(m, "caFile")
|
||||||
|
|
||||||
if tlsConfig.CertFile == "" {
|
if tlsConfig.CertFile == "" {
|
||||||
tlsConfig = nil
|
tlsConfig = nil
|
||||||
@@ -352,28 +361,32 @@ func buildServiceConfig(url *url.URL) (*config.ServiceConfig, error) {
|
|||||||
}
|
}
|
||||||
if v := metadata.GetString(md, "interface"); v != "" {
|
if v := metadata.GetString(md, "interface"); v != "" {
|
||||||
svc.Interface = v
|
svc.Interface = v
|
||||||
md.Del("interface")
|
delete(m, "interface")
|
||||||
|
}
|
||||||
|
if v := metadata.GetInt(md, "so_mark"); v > 0 {
|
||||||
|
svc.SockOpts = &config.SockOptsConfig{
|
||||||
|
Mark: v,
|
||||||
|
}
|
||||||
|
delete(m, "so_mark")
|
||||||
}
|
}
|
||||||
|
|
||||||
if svc.Forwarder != nil {
|
if svc.Forwarder != nil {
|
||||||
svc.Forwarder.Selector = parseSelector(md)
|
svc.Forwarder.Selector = parseSelector(m)
|
||||||
}
|
}
|
||||||
|
|
||||||
svc.Handler = &config.HandlerConfig{
|
svc.Handler = &config.HandlerConfig{
|
||||||
Type: handler,
|
Type: handler,
|
||||||
Auth: auth,
|
Auth: auth,
|
||||||
Metadata: md,
|
Metadata: m,
|
||||||
}
|
}
|
||||||
svc.Listener = &config.ListenerConfig{
|
svc.Listener = &config.ListenerConfig{
|
||||||
Type: listener,
|
Type: listener,
|
||||||
TLS: tlsConfig,
|
TLS: tlsConfig,
|
||||||
Metadata: md,
|
Metadata: m,
|
||||||
}
|
}
|
||||||
|
|
||||||
if svc.Handler.Type == "sshd" {
|
if svc.Listener.Type == "ssh" || svc.Listener.Type == "sshd" {
|
||||||
svc.Handler.Auth = nil
|
svc.Handler.Auth = nil
|
||||||
}
|
|
||||||
if svc.Listener.Type == "sshd" {
|
|
||||||
svc.Listener.Auth = auth
|
svc.Listener.Auth = auth
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -414,12 +427,13 @@ func buildNodeConfig(url *url.URL) (*config.NodeConfig, error) {
|
|||||||
auth.Password, _ = url.User.Password()
|
auth.Password, _ = url.User.Password()
|
||||||
}
|
}
|
||||||
|
|
||||||
md := metadata.MapMetadata{}
|
m := map[string]any{}
|
||||||
for k, v := range url.Query() {
|
for k, v := range url.Query() {
|
||||||
if len(v) > 0 {
|
if len(v) > 0 {
|
||||||
md[k] = v[0]
|
m[k] = v[0]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
md := metadata.NewMetadata(m)
|
||||||
|
|
||||||
if sauth := metadata.GetString(md, "auth"); sauth != "" && auth == nil {
|
if sauth := metadata.GetString(md, "auth"); sauth != "" && auth == nil {
|
||||||
au, err := parseAuthFromCmd(sauth)
|
au, err := parseAuthFromCmd(sauth)
|
||||||
@@ -428,7 +442,7 @@ func buildNodeConfig(url *url.URL) (*config.NodeConfig, error) {
|
|||||||
}
|
}
|
||||||
auth = au
|
auth = au
|
||||||
}
|
}
|
||||||
md.Del("auth")
|
delete(m, "auth")
|
||||||
|
|
||||||
tlsConfig := &config.TLSConfig{
|
tlsConfig := &config.TLSConfig{
|
||||||
CertFile: metadata.GetString(md, "certFile"),
|
CertFile: metadata.GetString(md, "certFile"),
|
||||||
@@ -440,11 +454,11 @@ func buildNodeConfig(url *url.URL) (*config.NodeConfig, error) {
|
|||||||
if tlsConfig.ServerName == "" {
|
if tlsConfig.ServerName == "" {
|
||||||
tlsConfig.ServerName = url.Hostname()
|
tlsConfig.ServerName = url.Hostname()
|
||||||
}
|
}
|
||||||
md.Del("certFile")
|
delete(m, "certFile")
|
||||||
md.Del("keyFile")
|
delete(m, "keyFile")
|
||||||
md.Del("caFile")
|
delete(m, "caFile")
|
||||||
md.Del("secure")
|
delete(m, "secure")
|
||||||
md.Del("serverName")
|
delete(m, "serverName")
|
||||||
|
|
||||||
if !tlsConfig.Secure && tlsConfig.CertFile == "" && tlsConfig.CAFile == "" {
|
if !tlsConfig.Secure && tlsConfig.CertFile == "" && tlsConfig.CAFile == "" {
|
||||||
tlsConfig = nil
|
tlsConfig = nil
|
||||||
@@ -453,18 +467,16 @@ func buildNodeConfig(url *url.URL) (*config.NodeConfig, error) {
|
|||||||
node.Connector = &config.ConnectorConfig{
|
node.Connector = &config.ConnectorConfig{
|
||||||
Type: connector,
|
Type: connector,
|
||||||
Auth: auth,
|
Auth: auth,
|
||||||
Metadata: md,
|
Metadata: m,
|
||||||
}
|
}
|
||||||
node.Dialer = &config.DialerConfig{
|
node.Dialer = &config.DialerConfig{
|
||||||
Type: dialer,
|
Type: dialer,
|
||||||
TLS: tlsConfig,
|
TLS: tlsConfig,
|
||||||
Metadata: md,
|
Metadata: m,
|
||||||
}
|
}
|
||||||
|
|
||||||
if node.Connector.Type == "sshd" {
|
if node.Dialer.Type == "ssh" || node.Dialer.Type == "sshd" {
|
||||||
node.Connector.Auth = nil
|
node.Connector.Auth = nil
|
||||||
}
|
|
||||||
if node.Dialer.Type == "sshd" {
|
|
||||||
node.Dialer.Auth = auth
|
node.Dialer.Auth = auth
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -511,7 +523,8 @@ func parseAuthFromCmd(sa string) (*config.AuthConfig, error) {
|
|||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func parseSelector(md metadata.MapMetadata) *config.SelectorConfig {
|
func parseSelector(m map[string]any) *config.SelectorConfig {
|
||||||
|
md := metadata.NewMetadata(m)
|
||||||
strategy := metadata.GetString(md, "strategy")
|
strategy := metadata.GetString(md, "strategy")
|
||||||
maxFails := metadata.GetInt(md, "maxFails")
|
maxFails := metadata.GetInt(md, "maxFails")
|
||||||
failTimeout := metadata.GetDuration(md, "failTimeout")
|
failTimeout := metadata.GetDuration(md, "failTimeout")
|
||||||
@@ -528,9 +541,9 @@ func parseSelector(md metadata.MapMetadata) *config.SelectorConfig {
|
|||||||
failTimeout = time.Second
|
failTimeout = time.Second
|
||||||
}
|
}
|
||||||
|
|
||||||
md.Del("strategy")
|
delete(m, "strategy")
|
||||||
md.Del("maxFails")
|
delete(m, "maxFails")
|
||||||
md.Del("failTimeout")
|
delete(m, "failTimeout")
|
||||||
|
|
||||||
return &config.SelectorConfig{
|
return &config.SelectorConfig{
|
||||||
Strategy: strategy,
|
Strategy: strategy,
|
||||||
|
|||||||
+16
-8
@@ -5,12 +5,13 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/go-gost/core/logger"
|
"github.com/go-gost/core/logger"
|
||||||
metrics "github.com/go-gost/core/metrics/service"
|
|
||||||
"github.com/go-gost/core/registry"
|
|
||||||
"github.com/go-gost/core/service"
|
"github.com/go-gost/core/service"
|
||||||
"github.com/go-gost/x/api"
|
"github.com/go-gost/x/api"
|
||||||
"github.com/go-gost/x/config"
|
"github.com/go-gost/x/config"
|
||||||
"github.com/go-gost/x/config/parsing"
|
"github.com/go-gost/x/config/parsing"
|
||||||
|
xlogger "github.com/go-gost/x/logger"
|
||||||
|
metrics "github.com/go-gost/x/metrics/service"
|
||||||
|
"github.com/go-gost/x/registry"
|
||||||
)
|
)
|
||||||
|
|
||||||
func buildService(cfg *config.Config) (services []service.Service) {
|
func buildService(cfg *config.Config) (services []service.Service) {
|
||||||
@@ -61,6 +62,13 @@ func buildService(cfg *config.Config) (services []service.Service) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for _, recorderCfg := range cfg.Recorders {
|
||||||
|
if h := parsing.ParseRecorder(recorderCfg); h != nil {
|
||||||
|
if err := registry.RecorderRegistry().Register(recorderCfg.Name, h); err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for _, chainCfg := range cfg.Chains {
|
for _, chainCfg := range cfg.Chains {
|
||||||
c, err := parsing.ParseChain(chainCfg)
|
c, err := parsing.ParseChain(chainCfg)
|
||||||
@@ -94,15 +102,15 @@ func logFromConfig(cfg *config.LogConfig) logger.Logger {
|
|||||||
if cfg == nil {
|
if cfg == nil {
|
||||||
cfg = &config.LogConfig{}
|
cfg = &config.LogConfig{}
|
||||||
}
|
}
|
||||||
opts := []logger.LoggerOption{
|
opts := []xlogger.LoggerOption{
|
||||||
logger.FormatLoggerOption(logger.LogFormat(cfg.Format)),
|
xlogger.FormatLoggerOption(logger.LogFormat(cfg.Format)),
|
||||||
logger.LevelLoggerOption(logger.LogLevel(cfg.Level)),
|
xlogger.LevelLoggerOption(logger.LogLevel(cfg.Level)),
|
||||||
}
|
}
|
||||||
|
|
||||||
var out io.Writer = os.Stderr
|
var out io.Writer = os.Stderr
|
||||||
switch cfg.Output {
|
switch cfg.Output {
|
||||||
case "none", "null":
|
case "none", "null":
|
||||||
return logger.Nop()
|
return xlogger.Nop()
|
||||||
case "stdout":
|
case "stdout":
|
||||||
out = os.Stdout
|
out = os.Stdout
|
||||||
case "stderr", "":
|
case "stderr", "":
|
||||||
@@ -115,9 +123,9 @@ func logFromConfig(cfg *config.LogConfig) logger.Logger {
|
|||||||
out = f
|
out = f
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
opts = append(opts, logger.OutputLoggerOption(out))
|
opts = append(opts, xlogger.OutputLoggerOption(out))
|
||||||
|
|
||||||
return logger.NewLogger(opts...)
|
return xlogger.NewLogger(opts...)
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildAPIService(cfg *config.APIConfig) (service.Service, error) {
|
func buildAPIService(cfg *config.APIConfig) (service.Service, error) {
|
||||||
|
|||||||
+14
-4
@@ -11,10 +11,13 @@ import (
|
|||||||
"github.com/go-gost/core/logger"
|
"github.com/go-gost/core/logger"
|
||||||
"github.com/go-gost/core/metrics"
|
"github.com/go-gost/core/metrics"
|
||||||
"github.com/go-gost/x/config"
|
"github.com/go-gost/x/config"
|
||||||
|
"github.com/go-gost/x/config/parsing"
|
||||||
|
xlogger "github.com/go-gost/x/logger"
|
||||||
|
xmetrics "github.com/go-gost/x/metrics"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
log = logger.Default()
|
log logger.Logger
|
||||||
|
|
||||||
cfgFile string
|
cfgFile string
|
||||||
outputFormat string
|
outputFormat string
|
||||||
@@ -43,6 +46,9 @@ func init() {
|
|||||||
version, runtime.Version(), runtime.GOOS, runtime.GOARCH)
|
version, runtime.Version(), runtime.GOOS, runtime.GOARCH)
|
||||||
os.Exit(0)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log = xlogger.NewLogger()
|
||||||
|
logger.SetDefault(log)
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
@@ -113,7 +119,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if cfg.Metrics != nil {
|
if cfg.Metrics != nil {
|
||||||
metrics.SetGlobal(metrics.NewMetrics())
|
metrics.SetGlobal(xmetrics.NewMetrics())
|
||||||
if cfg.Metrics.Addr != "" {
|
if cfg.Metrics.Addr != "" {
|
||||||
s, err := buildMetricsService(cfg.Metrics)
|
s, err := buildMetricsService(cfg.Metrics)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -127,11 +133,15 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buildDefaultTLSConfig(cfg.TLS)
|
parsing.BuildDefaultTLSConfig(cfg.TLS)
|
||||||
|
|
||||||
services := buildService(cfg)
|
services := buildService(cfg)
|
||||||
for _, svc := range services {
|
for _, svc := range services {
|
||||||
go svc.Serve()
|
svc := svc
|
||||||
|
go func() {
|
||||||
|
svc.Serve()
|
||||||
|
svc.Close()
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
config.SetGlobal(cfg)
|
config.SetGlobal(cfg)
|
||||||
|
|||||||
+22
-25
@@ -1,33 +1,14 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
// core components
|
// Register connectors
|
||||||
_ "github.com/go-gost/core/connector/forward"
|
_ "github.com/go-gost/x/connector/forward"
|
||||||
_ "github.com/go-gost/core/connector/http"
|
_ "github.com/go-gost/x/connector/http"
|
||||||
_ "github.com/go-gost/core/connector/socks/v4"
|
|
||||||
_ "github.com/go-gost/core/connector/socks/v5"
|
|
||||||
|
|
||||||
_ "github.com/go-gost/core/dialer/tcp"
|
|
||||||
_ "github.com/go-gost/core/dialer/tls"
|
|
||||||
_ "github.com/go-gost/core/dialer/udp"
|
|
||||||
|
|
||||||
_ "github.com/go-gost/core/handler/auto"
|
|
||||||
_ "github.com/go-gost/core/handler/forward/local"
|
|
||||||
_ "github.com/go-gost/core/handler/forward/remote"
|
|
||||||
_ "github.com/go-gost/core/handler/http"
|
|
||||||
_ "github.com/go-gost/core/handler/socks/v4"
|
|
||||||
_ "github.com/go-gost/core/handler/socks/v5"
|
|
||||||
|
|
||||||
_ "github.com/go-gost/core/listener/rtcp"
|
|
||||||
_ "github.com/go-gost/core/listener/rudp"
|
|
||||||
_ "github.com/go-gost/core/listener/tcp"
|
|
||||||
_ "github.com/go-gost/core/listener/tls"
|
|
||||||
_ "github.com/go-gost/core/listener/udp"
|
|
||||||
|
|
||||||
// extended components
|
|
||||||
_ "github.com/go-gost/x/connector/http2"
|
_ "github.com/go-gost/x/connector/http2"
|
||||||
_ "github.com/go-gost/x/connector/relay"
|
_ "github.com/go-gost/x/connector/relay"
|
||||||
_ "github.com/go-gost/x/connector/sni"
|
_ "github.com/go-gost/x/connector/sni"
|
||||||
|
_ "github.com/go-gost/x/connector/socks/v4"
|
||||||
|
_ "github.com/go-gost/x/connector/socks/v5"
|
||||||
_ "github.com/go-gost/x/connector/ss"
|
_ "github.com/go-gost/x/connector/ss"
|
||||||
_ "github.com/go-gost/x/connector/ss/udp"
|
_ "github.com/go-gost/x/connector/ss/udp"
|
||||||
_ "github.com/go-gost/x/connector/sshd"
|
_ "github.com/go-gost/x/connector/sshd"
|
||||||
@@ -48,14 +29,24 @@ import (
|
|||||||
_ "github.com/go-gost/x/dialer/quic"
|
_ "github.com/go-gost/x/dialer/quic"
|
||||||
_ "github.com/go-gost/x/dialer/ssh"
|
_ "github.com/go-gost/x/dialer/ssh"
|
||||||
_ "github.com/go-gost/x/dialer/sshd"
|
_ "github.com/go-gost/x/dialer/sshd"
|
||||||
|
_ "github.com/go-gost/x/dialer/tcp"
|
||||||
|
_ "github.com/go-gost/x/dialer/tls"
|
||||||
|
_ "github.com/go-gost/x/dialer/udp"
|
||||||
_ "github.com/go-gost/x/dialer/ws"
|
_ "github.com/go-gost/x/dialer/ws"
|
||||||
|
|
||||||
// Register handlers
|
// Register handlers
|
||||||
|
_ "github.com/go-gost/x/handler/auto"
|
||||||
_ "github.com/go-gost/x/handler/dns"
|
_ "github.com/go-gost/x/handler/dns"
|
||||||
|
_ "github.com/go-gost/x/handler/forward/local"
|
||||||
|
_ "github.com/go-gost/x/handler/forward/remote"
|
||||||
|
_ "github.com/go-gost/x/handler/http"
|
||||||
_ "github.com/go-gost/x/handler/http2"
|
_ "github.com/go-gost/x/handler/http2"
|
||||||
_ "github.com/go-gost/x/handler/redirect"
|
_ "github.com/go-gost/x/handler/redirect/tcp"
|
||||||
|
_ "github.com/go-gost/x/handler/redirect/udp"
|
||||||
_ "github.com/go-gost/x/handler/relay"
|
_ "github.com/go-gost/x/handler/relay"
|
||||||
_ "github.com/go-gost/x/handler/sni"
|
_ "github.com/go-gost/x/handler/sni"
|
||||||
|
_ "github.com/go-gost/x/handler/socks/v4"
|
||||||
|
_ "github.com/go-gost/x/handler/socks/v5"
|
||||||
_ "github.com/go-gost/x/handler/ss"
|
_ "github.com/go-gost/x/handler/ss"
|
||||||
_ "github.com/go-gost/x/handler/ss/udp"
|
_ "github.com/go-gost/x/handler/ss/udp"
|
||||||
_ "github.com/go-gost/x/handler/sshd"
|
_ "github.com/go-gost/x/handler/sshd"
|
||||||
@@ -77,10 +68,16 @@ import (
|
|||||||
_ "github.com/go-gost/x/listener/obfs/tls"
|
_ "github.com/go-gost/x/listener/obfs/tls"
|
||||||
_ "github.com/go-gost/x/listener/pht"
|
_ "github.com/go-gost/x/listener/pht"
|
||||||
_ "github.com/go-gost/x/listener/quic"
|
_ "github.com/go-gost/x/listener/quic"
|
||||||
|
_ "github.com/go-gost/x/listener/redirect/tcp"
|
||||||
_ "github.com/go-gost/x/listener/redirect/udp"
|
_ "github.com/go-gost/x/listener/redirect/udp"
|
||||||
|
_ "github.com/go-gost/x/listener/rtcp"
|
||||||
|
_ "github.com/go-gost/x/listener/rudp"
|
||||||
_ "github.com/go-gost/x/listener/ssh"
|
_ "github.com/go-gost/x/listener/ssh"
|
||||||
_ "github.com/go-gost/x/listener/sshd"
|
_ "github.com/go-gost/x/listener/sshd"
|
||||||
_ "github.com/go-gost/x/listener/tap"
|
_ "github.com/go-gost/x/listener/tap"
|
||||||
|
_ "github.com/go-gost/x/listener/tcp"
|
||||||
|
_ "github.com/go-gost/x/listener/tls"
|
||||||
_ "github.com/go-gost/x/listener/tun"
|
_ "github.com/go-gost/x/listener/tun"
|
||||||
|
_ "github.com/go-gost/x/listener/udp"
|
||||||
_ "github.com/go-gost/x/listener/ws"
|
_ "github.com/go-gost/x/listener/ws"
|
||||||
)
|
)
|
||||||
|
|||||||
-107
@@ -1,107 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"crypto/rand"
|
|
||||||
"crypto/rsa"
|
|
||||||
"crypto/tls"
|
|
||||||
"crypto/x509"
|
|
||||||
"crypto/x509/pkix"
|
|
||||||
"encoding/pem"
|
|
||||||
"math/big"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
tls_util "github.com/go-gost/core/common/util/tls"
|
|
||||||
"github.com/go-gost/x/config"
|
|
||||||
)
|
|
||||||
|
|
||||||
func buildDefaultTLSConfig(cfg *config.TLSConfig) {
|
|
||||||
if cfg == nil {
|
|
||||||
cfg = &config.TLSConfig{
|
|
||||||
CertFile: "cert.pem",
|
|
||||||
KeyFile: "key.pem",
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tlsConfig, err := loadConfig(cfg.CertFile, cfg.KeyFile)
|
|
||||||
if err != nil {
|
|
||||||
// generate random self-signed certificate.
|
|
||||||
cert, err := genCertificate()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
tlsConfig = &tls.Config{
|
|
||||||
Certificates: []tls.Certificate{cert},
|
|
||||||
}
|
|
||||||
log.Warn("load TLS certificate files failed, use random generated certificate")
|
|
||||||
} else {
|
|
||||||
log.Info("load TLS certificate files OK")
|
|
||||||
}
|
|
||||||
tls_util.DefaultConfig = tlsConfig
|
|
||||||
}
|
|
||||||
|
|
||||||
func loadConfig(certFile, keyFile string) (*tls.Config, error) {
|
|
||||||
cert, err := tls.LoadX509KeyPair(certFile, keyFile)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
cfg := &tls.Config{
|
|
||||||
Certificates: []tls.Certificate{cert},
|
|
||||||
}
|
|
||||||
|
|
||||||
return cfg, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func genCertificate() (cert tls.Certificate, err error) {
|
|
||||||
rawCert, rawKey, err := generateKeyPair()
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
return tls.X509KeyPair(rawCert, rawKey)
|
|
||||||
}
|
|
||||||
|
|
||||||
func generateKeyPair() (rawCert, rawKey []byte, err error) {
|
|
||||||
// Create private key and self-signed certificate
|
|
||||||
// Adapted from https://golang.org/src/crypto/tls/generate_cert.go
|
|
||||||
|
|
||||||
priv, err := rsa.GenerateKey(rand.Reader, 2048)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
validFor := time.Hour * 24 * 365 * 10 // ten years
|
|
||||||
notBefore := time.Now()
|
|
||||||
notAfter := notBefore.Add(validFor)
|
|
||||||
serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), 128)
|
|
||||||
serialNumber, err := rand.Int(rand.Reader, serialNumberLimit)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
template := x509.Certificate{
|
|
||||||
SerialNumber: serialNumber,
|
|
||||||
Subject: pkix.Name{
|
|
||||||
Organization: []string{"gost"},
|
|
||||||
},
|
|
||||||
NotBefore: notBefore,
|
|
||||||
NotAfter: notAfter,
|
|
||||||
|
|
||||||
KeyUsage: x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature,
|
|
||||||
ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
|
|
||||||
BasicConstraintsValid: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
template.DNSNames = append(template.DNSNames, "gost.run")
|
|
||||||
derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
rawCert = pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: derBytes})
|
|
||||||
privBytes, err := x509.MarshalPKCS8PrivateKey(priv)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
rawKey = pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: privBytes})
|
|
||||||
|
|
||||||
return
|
|
||||||
}
|
|
||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
const (
|
const (
|
||||||
version = "3.0.0-beta.1"
|
version = "3.0.0-beta.2"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -5,18 +5,18 @@ go 1.18
|
|||||||
replace github.com/templexxx/cpu v0.0.7 => github.com/templexxx/cpu v0.0.10-0.20211111114238-98168dcec14a
|
replace github.com/templexxx/cpu v0.0.7 => github.com/templexxx/cpu v0.0.10-0.20211111114238-98168dcec14a
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/go-gost/core v0.0.0-20220317144108-bab2906aeb73
|
github.com/go-gost/core v0.0.0-20220413143512-acee88323487
|
||||||
github.com/go-gost/x v0.0.0-20220317145457-0f1f7790c52a
|
github.com/go-gost/x v0.0.0-20220413143619-7a334c173cb8
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/LiamHaworth/go-tproxy v0.0.0-20190726054950-ef7efd7f24ed // indirect
|
|
||||||
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect
|
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da // indirect
|
||||||
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect
|
github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
||||||
github.com/cheekybits/genny v1.0.0 // indirect
|
github.com/cheekybits/genny v1.0.0 // indirect
|
||||||
github.com/coreos/go-iptables v0.5.0 // indirect
|
github.com/coreos/go-iptables v0.5.0 // indirect
|
||||||
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
||||||
github.com/docker/libcontainer v2.2.1+incompatible // indirect
|
github.com/docker/libcontainer v2.2.1+incompatible // indirect
|
||||||
github.com/fsnotify/fsnotify v1.5.1 // indirect
|
github.com/fsnotify/fsnotify v1.5.1 // indirect
|
||||||
github.com/gin-contrib/cors v1.3.1 // indirect
|
github.com/gin-contrib/cors v1.3.1 // indirect
|
||||||
@@ -25,10 +25,11 @@ require (
|
|||||||
github.com/go-gost/gosocks4 v0.0.1 // indirect
|
github.com/go-gost/gosocks4 v0.0.1 // indirect
|
||||||
github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09 // indirect
|
github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09 // indirect
|
||||||
github.com/go-gost/relay v0.1.1-0.20211123134818-8ef7fd81ffd7 // indirect
|
github.com/go-gost/relay v0.1.1-0.20211123134818-8ef7fd81ffd7 // indirect
|
||||||
github.com/go-gost/tls-dissector v0.0.2-0.20211125135007-2b5d5bd9c07e // indirect
|
github.com/go-gost/tls-dissector v0.0.2-0.20220408131628-aac992c27451 // indirect
|
||||||
github.com/go-playground/locales v0.14.0 // indirect
|
github.com/go-playground/locales v0.14.0 // indirect
|
||||||
github.com/go-playground/universal-translator v0.18.0 // indirect
|
github.com/go-playground/universal-translator v0.18.0 // indirect
|
||||||
github.com/go-playground/validator/v10 v10.10.1 // indirect
|
github.com/go-playground/validator/v10 v10.10.1 // indirect
|
||||||
|
github.com/go-redis/redis/v8 v8.11.5 // indirect
|
||||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
|
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 // indirect
|
||||||
github.com/gobwas/glob v0.2.3 // indirect
|
github.com/gobwas/glob v0.2.3 // indirect
|
||||||
github.com/golang/protobuf v1.5.2 // indirect
|
github.com/golang/protobuf v1.5.2 // indirect
|
||||||
|
|||||||
@@ -45,8 +45,6 @@ dmitri.shuralyov.com/state v0.0.0-20180228185332-28bcc343414c/go.mod h1:0PRwlb0D
|
|||||||
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
|
git.apache.org/thrift.git v0.0.0-20180902110319-2566ecd5d999/go.mod h1:fPE2ZNJGynbRyZ4dJvy6G277gSllfV2HJqblrnkyeyg=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||||
github.com/LiamHaworth/go-tproxy v0.0.0-20190726054950-ef7efd7f24ed h1:eqa6queieK8SvoszxCu0WwH7lSVeL4/N/f1JwOMw1G4=
|
|
||||||
github.com/LiamHaworth/go-tproxy v0.0.0-20190726054950-ef7efd7f24ed/go.mod h1:rA52xkgZwql9LRZXWb2arHEFP6qSR48KY2xOfWzEciQ=
|
|
||||||
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
|
||||||
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY=
|
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da h1:KjTM2ks9d14ZYCvmHS9iAKVt9AyzRSqNU1qabPih5BY=
|
||||||
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA=
|
github.com/aead/chacha20 v0.0.0-20180709150244-8b13a72661da/go.mod h1:eHEWzANqSiWQsof+nXEI9bUVUyV6F53Fp89EuCh2EAA=
|
||||||
@@ -91,6 +89,8 @@ github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ3
|
|||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
|
||||||
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
|
||||||
github.com/docker/libcontainer v2.2.1+incompatible h1:++SbbkCw+X8vAd4j2gOCzZ2Nn7s2xFALTf7LZKmM1/0=
|
github.com/docker/libcontainer v2.2.1+incompatible h1:++SbbkCw+X8vAd4j2gOCzZ2Nn7s2xFALTf7LZKmM1/0=
|
||||||
github.com/docker/libcontainer v2.2.1+incompatible/go.mod h1:osvj61pYsqhNCMLGX31xr7klUBhHb/ZBuXS0o1Fvwbw=
|
github.com/docker/libcontainer v2.2.1+incompatible/go.mod h1:osvj61pYsqhNCMLGX31xr7klUBhHb/ZBuXS0o1Fvwbw=
|
||||||
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
|
||||||
@@ -121,18 +121,22 @@ github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm
|
|||||||
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-gost/core v0.0.0-20220317144108-bab2906aeb73 h1:N9iL7Jf+ahGBieyKu2iUqPVQFQzUjqGKl/lZM+YiSEo=
|
github.com/go-gost/core v0.0.0-20220411145302-03988fee0b9a h1:GYdVcUmEoFVzkPNDavMsDnGA6AM+jgORE4n3/tIiKqI=
|
||||||
github.com/go-gost/core v0.0.0-20220317144108-bab2906aeb73/go.mod h1:+Eqgm24sZ61yY9uPhRIPM79Ig+r2Rk5QIOcZWLL+5q0=
|
github.com/go-gost/core v0.0.0-20220411145302-03988fee0b9a/go.mod h1:bHVbCS9da6XtKNYMkMUVcck5UqDDUkyC37erVfs4GXQ=
|
||||||
|
github.com/go-gost/core v0.0.0-20220413143512-acee88323487 h1:boiBuK2m2jImLYkOlvey8bIrEl7TKM5ZbU+wNmX5oyg=
|
||||||
|
github.com/go-gost/core v0.0.0-20220413143512-acee88323487/go.mod h1:bHVbCS9da6XtKNYMkMUVcck5UqDDUkyC37erVfs4GXQ=
|
||||||
github.com/go-gost/gosocks4 v0.0.1 h1:+k1sec8HlELuQV7rWftIkmy8UijzUt2I6t+iMPlGB2s=
|
github.com/go-gost/gosocks4 v0.0.1 h1:+k1sec8HlELuQV7rWftIkmy8UijzUt2I6t+iMPlGB2s=
|
||||||
github.com/go-gost/gosocks4 v0.0.1/go.mod h1:3B6L47HbU/qugDg4JnoFPHgJXE43Inz8Bah1QaN9qCc=
|
github.com/go-gost/gosocks4 v0.0.1/go.mod h1:3B6L47HbU/qugDg4JnoFPHgJXE43Inz8Bah1QaN9qCc=
|
||||||
github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09 h1:A95M6UWcfZgOuJkQ7QLfG0Hs5peWIUSysCDNz4pfe04=
|
github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09 h1:A95M6UWcfZgOuJkQ7QLfG0Hs5peWIUSysCDNz4pfe04=
|
||||||
github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09/go.mod h1:1G6I7HP7VFVxveGkoK8mnprnJqSqJjdcASKsdUn4Pp4=
|
github.com/go-gost/gosocks5 v0.3.1-0.20211109033403-d894d75b7f09/go.mod h1:1G6I7HP7VFVxveGkoK8mnprnJqSqJjdcASKsdUn4Pp4=
|
||||||
github.com/go-gost/relay v0.1.1-0.20211123134818-8ef7fd81ffd7 h1:itaaJhQJ19kUXEB4Igb0EbY8m+1Py2AaNNSBds/9gk4=
|
github.com/go-gost/relay v0.1.1-0.20211123134818-8ef7fd81ffd7 h1:itaaJhQJ19kUXEB4Igb0EbY8m+1Py2AaNNSBds/9gk4=
|
||||||
github.com/go-gost/relay v0.1.1-0.20211123134818-8ef7fd81ffd7/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8=
|
github.com/go-gost/relay v0.1.1-0.20211123134818-8ef7fd81ffd7/go.mod h1:lcX+23LCQ3khIeASBo+tJ/WbwXFO32/N5YN6ucuYTG8=
|
||||||
github.com/go-gost/tls-dissector v0.0.2-0.20211125135007-2b5d5bd9c07e h1:73NGqAs22ey3wJkIYVD/ACEoovuIuOlEzQTEoqrO5+U=
|
github.com/go-gost/tls-dissector v0.0.2-0.20220408131628-aac992c27451 h1:xj8gUZGYO3nb5+6Bjw9+tsFkA9sYynrOvDvvC4uDV2I=
|
||||||
github.com/go-gost/tls-dissector v0.0.2-0.20211125135007-2b5d5bd9c07e/go.mod h1:/9QfdewqmHdaE362Hv5nDaSWLx3pCmtD870d6GaquXs=
|
github.com/go-gost/tls-dissector v0.0.2-0.20220408131628-aac992c27451/go.mod h1:/9QfdewqmHdaE362Hv5nDaSWLx3pCmtD870d6GaquXs=
|
||||||
github.com/go-gost/x v0.0.0-20220317145457-0f1f7790c52a h1:i2PGFgLyiFsOJICgYYAjeV+n9ce2yqOqfkuK0V3A5I8=
|
github.com/go-gost/x v0.0.0-20220413133030-65b44b07907f h1:v8OMxNIerw3z7JHQH6lXou0EQKp9h2gzusLplWlbpJQ=
|
||||||
github.com/go-gost/x v0.0.0-20220317145457-0f1f7790c52a/go.mod h1:iJgHCWLZB5zA/0NNZWbRxzpUwk5YS1elHTGmACI84C0=
|
github.com/go-gost/x v0.0.0-20220413133030-65b44b07907f/go.mod h1:YVqu5vX14GUmAoejgly0OBnC90NoLjcYLqv6gqW4egE=
|
||||||
|
github.com/go-gost/x v0.0.0-20220413143619-7a334c173cb8 h1:s841QQdMPu+CCNqRUckiV2PYGs6oQcMHIkV4xsEhB44=
|
||||||
|
github.com/go-gost/x v0.0.0-20220413143619-7a334c173cb8/go.mod h1:ydROJPX6cA2J3JIWEojvkKR9+HWfOCin9BlilLKMeg0=
|
||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
||||||
@@ -152,6 +156,8 @@ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl
|
|||||||
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
|
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
|
||||||
github.com/go-playground/validator/v10 v10.10.1 h1:uA0+amWMiglNZKZ9FJRKUAe9U3RX91eVn1JYXMWt7ig=
|
github.com/go-playground/validator/v10 v10.10.1 h1:uA0+amWMiglNZKZ9FJRKUAe9U3RX91eVn1JYXMWt7ig=
|
||||||
github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
|
github.com/go-playground/validator/v10 v10.10.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU=
|
||||||
|
github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
|
||||||
|
github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
|
||||||
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
|
||||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
|
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I=
|
||||||
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
|
||||||
@@ -331,8 +337,8 @@ github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
|||||||
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
||||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||||
github.com/onsi/gomega v1.13.0 h1:7lLHu94wT9Ij0o6EWWclhu0aOh32VxhkwEJvzuWPeak=
|
|
||||||
github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY=
|
github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY=
|
||||||
|
github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
|
||||||
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
|
github.com/openzipkin/zipkin-go v0.1.1/go.mod h1:NtoC/o8u3JlF1lSlyPNswIbeQH9bJTmOf0Erfk+hxe8=
|
||||||
github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
|
github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
|
||||||
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
|
||||||
|
|||||||
@@ -1,283 +1,110 @@
|
|||||||
log:
|
|
||||||
output: stderr # none, stderr, stdout, /path/to/file
|
|
||||||
level: debug # debug, info, warn, error, fatal
|
|
||||||
format: json # text, json
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
- name: http+tcp
|
- name: service-0
|
||||||
addr: ":28000"
|
addr: ":8080"
|
||||||
# bypass: bypass01
|
interface: eth0
|
||||||
|
admission: admission-0
|
||||||
|
bypass: bypass-0
|
||||||
|
resolver: resolver-0
|
||||||
|
hosts: hosts-0
|
||||||
handler:
|
handler:
|
||||||
type: http
|
type: http
|
||||||
chain: chain01
|
auth:
|
||||||
metadata:
|
username: user
|
||||||
proxyAgent: "gost/3.0"
|
password: pass
|
||||||
auths:
|
auther: auther-0
|
||||||
- user1:pass1
|
chain: chain-0
|
||||||
- user2:pass2
|
retries: 1
|
||||||
# probeResist: code:404 # code, web, host, file
|
metadata:
|
||||||
# knock: example.com
|
foo: bar
|
||||||
|
bar: baz
|
||||||
listener:
|
listener:
|
||||||
type: tcp
|
type: tcp
|
||||||
|
auth:
|
||||||
|
username: user
|
||||||
|
password: pass
|
||||||
|
auther: auther-0
|
||||||
|
chain: chain-0
|
||||||
|
tls:
|
||||||
|
certFile: cert.pem
|
||||||
|
keyFile: key.pem
|
||||||
|
caFile: ca.pem
|
||||||
metadata:
|
metadata:
|
||||||
keepAlive: 15s
|
abc: xyz
|
||||||
- name: ss
|
def: 456
|
||||||
addr: ":28338"
|
|
||||||
# bypass: bypass01
|
|
||||||
handler:
|
|
||||||
type: ss
|
|
||||||
# chain: chain01
|
|
||||||
metadata:
|
|
||||||
method: chacha20-ietf
|
|
||||||
password: gost
|
|
||||||
readTimeout: 5s
|
|
||||||
udp: true
|
|
||||||
bufferSize: 4096
|
|
||||||
listener:
|
|
||||||
type: tcp
|
|
||||||
metadata:
|
|
||||||
keepAlive: 15s
|
|
||||||
- name: socks5
|
|
||||||
addr: ":21080"
|
|
||||||
# bypass: bypass01
|
|
||||||
handler:
|
|
||||||
type: socks5
|
|
||||||
# chain: chain-ss
|
|
||||||
metadata:
|
|
||||||
auths:
|
|
||||||
- gost:gost
|
|
||||||
readTimeout: 5s
|
|
||||||
notls: true
|
|
||||||
bind: true
|
|
||||||
udp: true
|
|
||||||
# udpBufferSize: 4096 # range [512, 66560]
|
|
||||||
listener:
|
|
||||||
type: tcp
|
|
||||||
metadata:
|
|
||||||
keepAlive: 15s
|
|
||||||
- name: socks5+tcp
|
|
||||||
addr: ":21081"
|
|
||||||
handler:
|
|
||||||
type: socks5
|
|
||||||
metadata:
|
|
||||||
auths:
|
|
||||||
- gost:gost
|
|
||||||
readTimeout: 5s
|
|
||||||
notls: true
|
|
||||||
# udpBufferSize: 1024
|
|
||||||
listener:
|
|
||||||
type: tcp
|
|
||||||
metadata:
|
|
||||||
keepAlive: 15s
|
|
||||||
- name: forward
|
|
||||||
addr: ":10053"
|
|
||||||
forwarder:
|
forwarder:
|
||||||
targets:
|
targets:
|
||||||
- 192.168.8.8:53
|
- 192.168.1.1:1234
|
||||||
- 192.168.8.1:53
|
- 192.168.1.2:2345
|
||||||
- 1.1.1.1:53
|
|
||||||
selector:
|
selector:
|
||||||
strategy: fifo
|
strategy: rand
|
||||||
maxFails: 1
|
maxFails: 1
|
||||||
failTimeout: 30s
|
failTimeout: 30s
|
||||||
handler:
|
|
||||||
type: forward
|
|
||||||
chain: chain-ss
|
|
||||||
metadata:
|
|
||||||
readTimeout: 5s
|
|
||||||
listener:
|
|
||||||
type: udp
|
|
||||||
metadata:
|
|
||||||
keepAlive: 15s
|
|
||||||
|
|
||||||
- name: kcp-forward-tunnel
|
|
||||||
addr: ":8388"
|
|
||||||
forwarder:
|
|
||||||
targets:
|
|
||||||
- 127.0.0.1:28338
|
|
||||||
handler:
|
|
||||||
type: forward
|
|
||||||
metadata:
|
|
||||||
readTimeout: 5s
|
|
||||||
listener:
|
|
||||||
type: kcp
|
|
||||||
metadata:
|
|
||||||
keepAlive: 15s
|
|
||||||
|
|
||||||
- name: rtcp
|
|
||||||
addr: ":28100"
|
|
||||||
forwarder:
|
|
||||||
targets:
|
|
||||||
- 192.168.8.8:80
|
|
||||||
handler:
|
|
||||||
type: forward
|
|
||||||
metadata:
|
|
||||||
readTimeout: 5s
|
|
||||||
listener:
|
|
||||||
type: rtcp
|
|
||||||
# chain: chain-socks5
|
|
||||||
metadata:
|
|
||||||
keepAlive: 15s
|
|
||||||
mux: true
|
|
||||||
- name: rudp
|
|
||||||
addr: ":1053"
|
|
||||||
forwarder:
|
|
||||||
targets:
|
|
||||||
- 192.168.8.8:53
|
|
||||||
- 192.168.8.1:53
|
|
||||||
selector:
|
|
||||||
strategy: round
|
|
||||||
maxFails: 1
|
|
||||||
failTimeout: 30s
|
|
||||||
handler:
|
|
||||||
type: forward
|
|
||||||
metadata:
|
|
||||||
readTimeout: 5s
|
|
||||||
listener:
|
|
||||||
type: rudp
|
|
||||||
chain: chain-socks5
|
|
||||||
metadata:
|
|
||||||
keepAlive: 15s
|
|
||||||
|
|
||||||
chains:
|
chains:
|
||||||
- name: chain01
|
- name: chain-0
|
||||||
# chain level selector
|
|
||||||
selector:
|
selector:
|
||||||
strategy: round
|
strategy: round
|
||||||
maxFails: 1
|
maxFails: 1
|
||||||
failTimeout: 30s
|
failTimeout: 30s
|
||||||
hops:
|
hops:
|
||||||
- name: hop01
|
- name: hop-0
|
||||||
# hop level selector
|
interface: 192.168.1.2
|
||||||
selector:
|
selector:
|
||||||
strategy: round
|
strategy: rand
|
||||||
maxFails: 1
|
maxFails: 3
|
||||||
failTimeout: 30s
|
failTimeout: 60s
|
||||||
|
bypass: bypass-0
|
||||||
nodes:
|
nodes:
|
||||||
- name: node01
|
- name: node-0
|
||||||
addr: ":8081"
|
addr: ":1080"
|
||||||
# bypass: bypass01
|
interface: eth1
|
||||||
connector:
|
bypass: bypass-0
|
||||||
type: http
|
|
||||||
metadata:
|
|
||||||
userAgent: "gost/3.0"
|
|
||||||
auth: user1:pass1
|
|
||||||
dialer:
|
|
||||||
type: tcp
|
|
||||||
metadata: {}
|
|
||||||
- name: node02
|
|
||||||
addr: ":8082"
|
|
||||||
# bypass: bypass01
|
|
||||||
connector:
|
|
||||||
type: http
|
|
||||||
metadata:
|
|
||||||
userAgent: "gost/3.0"
|
|
||||||
auth: user2:pass2
|
|
||||||
dialer:
|
|
||||||
type: tcp
|
|
||||||
metadata: {}
|
|
||||||
- name: hop02
|
|
||||||
# hop level selector
|
|
||||||
selector:
|
|
||||||
strategy: round
|
|
||||||
maxFails: 1
|
|
||||||
failTimeout: 30s
|
|
||||||
nodes:
|
|
||||||
- name: node03
|
|
||||||
addr: ":8083"
|
|
||||||
# bypass: bypass01
|
|
||||||
connector:
|
|
||||||
type: http
|
|
||||||
metadata:
|
|
||||||
userAgent: "gost/3.0"
|
|
||||||
auth: user3:pass3
|
|
||||||
dialer:
|
|
||||||
type: tcp
|
|
||||||
metadata: {}
|
|
||||||
- name: chain-socks4
|
|
||||||
hops:
|
|
||||||
- name: hop01
|
|
||||||
nodes:
|
|
||||||
- name: node01
|
|
||||||
addr: ":8081"
|
|
||||||
url: "http://gost:gost@:8081"
|
|
||||||
# bypass: bypass01
|
|
||||||
connector:
|
|
||||||
type: socks4
|
|
||||||
metadata: {}
|
|
||||||
dialer:
|
|
||||||
type: tcp
|
|
||||||
metadata: {}
|
|
||||||
- name: chain-socks5
|
|
||||||
hops:
|
|
||||||
- name: hop01
|
|
||||||
nodes:
|
|
||||||
- name: node01
|
|
||||||
addr: ":21080"
|
|
||||||
# bypass: bypass01
|
|
||||||
connector:
|
connector:
|
||||||
type: socks5
|
type: socks5
|
||||||
|
auth:
|
||||||
|
username: user
|
||||||
|
password: pass
|
||||||
metadata:
|
metadata:
|
||||||
notls: true
|
foo: bar
|
||||||
auth: gost:gost
|
|
||||||
dialer:
|
dialer:
|
||||||
type: tcp
|
type: tcp
|
||||||
metadata: {}
|
auth:
|
||||||
- name: chain-ss
|
username: user
|
||||||
hops:
|
password: pass
|
||||||
- name: hop01
|
tls:
|
||||||
nodes:
|
caFile: "ca.pem"
|
||||||
- name: node01
|
secure: true
|
||||||
addr: ":28338"
|
serverName: "example.com"
|
||||||
url: "http://gost:gost@:8081"
|
metadata:
|
||||||
# bypass: bypass01
|
bar: baz
|
||||||
connector:
|
|
||||||
type: ss
|
tls:
|
||||||
metadata:
|
certFile: "cert.pem"
|
||||||
method: chacha20-ietf
|
keyFile: "key.pem"
|
||||||
password: gost
|
caFile: "ca.pem"
|
||||||
readTimeout: 5s
|
|
||||||
nodelay: true
|
authers:
|
||||||
udp: true
|
- name: auther-0
|
||||||
bufferSize: 4096
|
auths:
|
||||||
dialer:
|
- username: user1
|
||||||
type: tcp
|
password: pass1
|
||||||
metadata: {}
|
- username: user2
|
||||||
|
password: pass2
|
||||||
|
|
||||||
|
admissions:
|
||||||
|
- name: admission-0
|
||||||
|
reverse: false
|
||||||
|
matchers:
|
||||||
|
- 127.0.0.1
|
||||||
|
- 192.168.0.0/16
|
||||||
|
|
||||||
bypasses:
|
bypasses:
|
||||||
- name: bypass-0
|
- name: bypass-0
|
||||||
reverse: false
|
reverse: false
|
||||||
matchers:
|
matchers:
|
||||||
- .baidu.com
|
- "*.example.com"
|
||||||
- "*.example.com" # domain wildcard
|
- .example.org
|
||||||
- .example.org # will match example.org and *.example.org
|
- 0.0.0.0/8
|
||||||
|
|
||||||
# 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
|
|
||||||
|
|
||||||
tls:
|
|
||||||
cert: "cert.pem"
|
|
||||||
key: "key.pem"
|
|
||||||
# ca: "root.ca"
|
|
||||||
|
|
||||||
resolvers:
|
resolvers:
|
||||||
- name: resolver-0
|
- name: resolver-0
|
||||||
@@ -308,6 +135,23 @@ hosts:
|
|||||||
- bar
|
- bar
|
||||||
- baz
|
- baz
|
||||||
|
|
||||||
|
log:
|
||||||
|
output: stderr
|
||||||
|
level: debug
|
||||||
|
format: json
|
||||||
|
|
||||||
profiling:
|
profiling:
|
||||||
addr: ":6060"
|
addr: ":6060"
|
||||||
enabled: true
|
|
||||||
|
api:
|
||||||
|
addr: ":18080"
|
||||||
|
pathPrefix: /api
|
||||||
|
accesslog: true
|
||||||
|
auth:
|
||||||
|
username: user
|
||||||
|
password: pass
|
||||||
|
auther: auther-0
|
||||||
|
|
||||||
|
metrics:
|
||||||
|
addr: :9000
|
||||||
|
path: /metrics
|
||||||
|
|||||||
Reference in New Issue
Block a user