add tun/tap

This commit is contained in:
ginuerzh
2021-12-20 22:00:08 +08:00
parent a853d99d92
commit e21c35a47f
73 changed files with 1867 additions and 614 deletions

View File

@ -6,7 +6,7 @@ import (
"strings"
"time"
md "github.com/go-gost/gost/pkg/metadata"
mdata "github.com/go-gost/gost/pkg/metadata"
"golang.org/x/crypto/ssh"
)
@ -16,7 +16,7 @@ type metadata struct {
signer ssh.Signer
}
func (d *forwardDialer) parseMetadata(md md.Metadata) (err error) {
func (d *forwardDialer) parseMetadata(md mdata.Metadata) (err error) {
const (
handshakeTimeout = "handshakeTimeout"
user = "user"
@ -24,7 +24,7 @@ func (d *forwardDialer) parseMetadata(md md.Metadata) (err error) {
passphrase = "passphrase"
)
if v := md.GetString(user); v != "" {
if v := mdata.GetString(md, user); v != "" {
ss := strings.SplitN(v, ":", 2)
if len(ss) == 1 {
d.md.user = url.User(ss[0])
@ -33,13 +33,13 @@ func (d *forwardDialer) parseMetadata(md md.Metadata) (err error) {
}
}
if key := md.GetString(privateKeyFile); key != "" {
if key := mdata.GetString(md, privateKeyFile); key != "" {
data, err := ioutil.ReadFile(key)
if err != nil {
return err
}
pp := md.GetString(passphrase)
pp := mdata.GetString(md, passphrase)
if pp == "" {
d.md.signer, err = ssh.ParsePrivateKey(data)
} else {
@ -50,7 +50,7 @@ func (d *forwardDialer) parseMetadata(md md.Metadata) (err error) {
}
}
d.md.handshakeTimeout = md.GetDuration(handshakeTimeout)
d.md.handshakeTimeout = mdata.GetDuration(md, handshakeTimeout)
return
}

View File

@ -5,7 +5,7 @@ import (
"net"
tls_util "github.com/go-gost/gost/pkg/common/util/tls"
md "github.com/go-gost/gost/pkg/metadata"
mdata "github.com/go-gost/gost/pkg/metadata"
)
type metadata struct {
@ -14,7 +14,7 @@ type metadata struct {
tlsConfig *tls.Config
}
func (d *h2Dialer) parseMetadata(md md.Metadata) (err error) {
func (d *h2Dialer) parseMetadata(md mdata.Metadata) (err error) {
const (
certFile = "certFile"
keyFile = "keyFile"
@ -24,20 +24,20 @@ func (d *h2Dialer) parseMetadata(md md.Metadata) (err error) {
path = "path"
)
d.md.host = md.GetString(serverName)
d.md.host = mdata.GetString(md, serverName)
sn, _, _ := net.SplitHostPort(d.md.host)
if sn == "" {
sn = "localhost"
}
d.md.tlsConfig, err = tls_util.LoadClientConfig(
md.GetString(certFile),
md.GetString(keyFile),
md.GetString(caFile),
md.GetBool(secure),
mdata.GetString(md, certFile),
mdata.GetString(md, keyFile),
mdata.GetString(md, caFile),
mdata.GetBool(md, secure),
sn,
)
d.md.path = md.GetString(path)
d.md.path = mdata.GetString(md, path)
return
}

View File

@ -5,14 +5,14 @@ import (
"net"
tls_util "github.com/go-gost/gost/pkg/common/util/tls"
md "github.com/go-gost/gost/pkg/metadata"
mdata "github.com/go-gost/gost/pkg/metadata"
)
type metadata struct {
tlsConfig *tls.Config
}
func (d *http2Dialer) parseMetadata(md md.Metadata) (err error) {
func (d *http2Dialer) parseMetadata(md mdata.Metadata) (err error) {
const (
certFile = "certFile"
keyFile = "keyFile"
@ -21,15 +21,15 @@ func (d *http2Dialer) parseMetadata(md md.Metadata) (err error) {
serverName = "serverName"
)
sn, _, _ := net.SplitHostPort(md.GetString(serverName))
sn, _, _ := net.SplitHostPort(mdata.GetString(md, serverName))
if sn == "" {
sn = "localhost"
}
d.md.tlsConfig, err = tls_util.LoadClientConfig(
md.GetString(certFile),
md.GetString(keyFile),
md.GetString(caFile),
md.GetBool(secure),
mdata.GetString(md, certFile),
mdata.GetString(md, keyFile),
mdata.GetString(md, caFile),
mdata.GetBool(md, secure),
sn,
)

View File

@ -5,7 +5,7 @@ import (
"time"
kcp_util "github.com/go-gost/gost/pkg/common/util/kcp"
md "github.com/go-gost/gost/pkg/metadata"
mdata "github.com/go-gost/gost/pkg/metadata"
)
type metadata struct {
@ -13,19 +13,13 @@ type metadata struct {
config *kcp_util.Config
}
func (d *kcpDialer) parseMetadata(md md.Metadata) (err error) {
func (d *kcpDialer) parseMetadata(md mdata.Metadata) (err error) {
const (
config = "config"
handshakeTimeout = "handshakeTimeout"
)
if mm, _ := md.Get(config).(map[interface{}]interface{}); len(mm) > 0 {
m := make(map[string]interface{})
for k, v := range mm {
if sk, ok := k.(string); ok {
m[sk] = v
}
}
if m := mdata.GetStringMap(md, config); len(m) > 0 {
b, err := json.Marshal(m)
if err != nil {
return err
@ -36,11 +30,10 @@ func (d *kcpDialer) parseMetadata(md md.Metadata) (err error) {
}
d.md.config = cfg
}
if d.md.config == nil {
d.md.config = kcp_util.DefaultConfig
}
d.md.handshakeTimeout = md.GetDuration(handshakeTimeout)
d.md.handshakeTimeout = mdata.GetDuration(md, handshakeTimeout)
return
}

View File

@ -1,10 +1,9 @@
package http
import (
"fmt"
"net/http"
md "github.com/go-gost/gost/pkg/metadata"
mdata "github.com/go-gost/gost/pkg/metadata"
)
type metadata struct {
@ -12,19 +11,19 @@ type metadata struct {
header http.Header
}
func (d *obfsHTTPDialer) parseMetadata(md md.Metadata) (err error) {
func (d *obfsHTTPDialer) parseMetadata(md mdata.Metadata) (err error) {
const (
header = "header"
host = "host"
)
if mm, _ := md.Get(header).(map[interface{}]interface{}); len(mm) > 0 {
if m := mdata.GetStringMapString(md, header); len(m) > 0 {
h := http.Header{}
for k, v := range mm {
h.Add(fmt.Sprintf("%v", k), fmt.Sprintf("%v", v))
for k, v := range m {
h.Add(k, v)
}
d.md.header = h
}
d.md.host = md.GetString(host)
d.md.host = mdata.GetString(md, host)
return
}

View File

@ -1,18 +1,18 @@
package tls
import (
md "github.com/go-gost/gost/pkg/metadata"
mdata "github.com/go-gost/gost/pkg/metadata"
)
type metadata struct {
host string
}
func (d *obfsTLSDialer) parseMetadata(md md.Metadata) (err error) {
func (d *obfsTLSDialer) parseMetadata(md mdata.Metadata) (err error) {
const (
host = "host"
)
d.md.host = md.GetString(host)
d.md.host = mdata.GetString(md, host)
return
}

View File

@ -6,7 +6,7 @@ import (
"time"
tls_util "github.com/go-gost/gost/pkg/common/util/tls"
md "github.com/go-gost/gost/pkg/metadata"
mdata "github.com/go-gost/gost/pkg/metadata"
)
type metadata struct {
@ -18,7 +18,7 @@ type metadata struct {
tlsConfig *tls.Config
}
func (d *quicDialer) parseMetadata(md md.Metadata) (err error) {
func (d *quicDialer) parseMetadata(md mdata.Metadata) (err error) {
const (
keepAlive = "keepAlive"
handshakeTimeout = "handshakeTimeout"
@ -33,26 +33,26 @@ func (d *quicDialer) parseMetadata(md md.Metadata) (err error) {
cipherKey = "cipherKey"
)
d.md.handshakeTimeout = md.GetDuration(handshakeTimeout)
d.md.handshakeTimeout = mdata.GetDuration(md, handshakeTimeout)
if key := md.GetString(cipherKey); key != "" {
if key := mdata.GetString(md, cipherKey); key != "" {
d.md.cipherKey = []byte(key)
}
sn, _, _ := net.SplitHostPort(md.GetString(serverName))
sn, _, _ := net.SplitHostPort(mdata.GetString(md, serverName))
if sn == "" {
sn = "localhost"
}
d.md.tlsConfig, err = tls_util.LoadClientConfig(
md.GetString(certFile),
md.GetString(keyFile),
md.GetString(caFile),
md.GetBool(secure),
mdata.GetString(md, certFile),
mdata.GetString(md, keyFile),
mdata.GetString(md, caFile),
mdata.GetBool(md, secure),
sn,
)
d.md.keepAlive = md.GetBool(keepAlive)
d.md.handshakeTimeout = md.GetDuration(handshakeTimeout)
d.md.maxIdleTimeout = md.GetDuration(maxIdleTimeout)
d.md.keepAlive = mdata.GetBool(md, keepAlive)
d.md.handshakeTimeout = mdata.GetDuration(md, handshakeTimeout)
d.md.maxIdleTimeout = mdata.GetDuration(md, maxIdleTimeout)
return
}

View File

@ -6,7 +6,7 @@ import (
"strings"
"time"
md "github.com/go-gost/gost/pkg/metadata"
mdata "github.com/go-gost/gost/pkg/metadata"
"golang.org/x/crypto/ssh"
)
@ -16,7 +16,7 @@ type metadata struct {
signer ssh.Signer
}
func (d *sshDialer) parseMetadata(md md.Metadata) (err error) {
func (d *sshDialer) parseMetadata(md mdata.Metadata) (err error) {
const (
handshakeTimeout = "handshakeTimeout"
user = "user"
@ -24,7 +24,7 @@ func (d *sshDialer) parseMetadata(md md.Metadata) (err error) {
passphrase = "passphrase"
)
if v := md.GetString(user); v != "" {
if v := mdata.GetString(md, user); v != "" {
ss := strings.SplitN(v, ":", 2)
if len(ss) == 1 {
d.md.user = url.User(ss[0])
@ -33,13 +33,13 @@ func (d *sshDialer) parseMetadata(md md.Metadata) (err error) {
}
}
if key := md.GetString(privateKeyFile); key != "" {
if key := mdata.GetString(md, privateKeyFile); key != "" {
data, err := ioutil.ReadFile(key)
if err != nil {
return err
}
pp := md.GetString(passphrase)
pp := mdata.GetString(md, passphrase)
if pp == "" {
d.md.signer, err = ssh.ParsePrivateKey(data)
} else {
@ -50,7 +50,7 @@ func (d *sshDialer) parseMetadata(md md.Metadata) (err error) {
}
}
d.md.handshakeTimeout = md.GetDuration(handshakeTimeout)
d.md.handshakeTimeout = mdata.GetDuration(md, handshakeTimeout)
return
}

View File

@ -6,7 +6,7 @@ import (
"time"
tls_util "github.com/go-gost/gost/pkg/common/util/tls"
md "github.com/go-gost/gost/pkg/metadata"
mdata "github.com/go-gost/gost/pkg/metadata"
)
type metadata struct {
@ -14,7 +14,7 @@ type metadata struct {
handshakeTimeout time.Duration
}
func (d *tlsDialer) parseMetadata(md md.Metadata) (err error) {
func (d *tlsDialer) parseMetadata(md mdata.Metadata) (err error) {
const (
certFile = "certFile"
keyFile = "keyFile"
@ -25,19 +25,19 @@ func (d *tlsDialer) parseMetadata(md md.Metadata) (err error) {
handshakeTimeout = "handshakeTimeout"
)
sn, _, _ := net.SplitHostPort(md.GetString(serverName))
sn, _, _ := net.SplitHostPort(mdata.GetString(md, serverName))
if sn == "" {
sn = "localhost"
}
d.md.tlsConfig, err = tls_util.LoadClientConfig(
md.GetString(certFile),
md.GetString(keyFile),
md.GetString(caFile),
md.GetBool(secure),
mdata.GetString(md, certFile),
mdata.GetString(md, keyFile),
mdata.GetString(md, caFile),
mdata.GetBool(md, secure),
sn,
)
d.md.handshakeTimeout = md.GetDuration(handshakeTimeout)
d.md.handshakeTimeout = mdata.GetDuration(md, handshakeTimeout)
return
}

View File

@ -6,7 +6,7 @@ import (
"time"
tls_util "github.com/go-gost/gost/pkg/common/util/tls"
md "github.com/go-gost/gost/pkg/metadata"
mdata "github.com/go-gost/gost/pkg/metadata"
)
type metadata struct {
@ -21,7 +21,7 @@ type metadata struct {
muxMaxStreamBuffer int
}
func (d *mtlsDialer) parseMetadata(md md.Metadata) (err error) {
func (d *mtlsDialer) parseMetadata(md mdata.Metadata) (err error) {
const (
certFile = "certFile"
keyFile = "keyFile"
@ -39,25 +39,25 @@ func (d *mtlsDialer) parseMetadata(md md.Metadata) (err error) {
muxMaxStreamBuffer = "muxMaxStreamBuffer"
)
sn, _, _ := net.SplitHostPort(md.GetString(serverName))
sn, _, _ := net.SplitHostPort(mdata.GetString(md, serverName))
if sn == "" {
sn = "localhost"
}
d.md.tlsConfig, err = tls_util.LoadClientConfig(
md.GetString(certFile),
md.GetString(keyFile),
md.GetString(caFile),
md.GetBool(secure),
mdata.GetString(md, certFile),
mdata.GetString(md, keyFile),
mdata.GetString(md, caFile),
mdata.GetBool(md, secure),
sn,
)
d.md.handshakeTimeout = md.GetDuration(handshakeTimeout)
d.md.handshakeTimeout = mdata.GetDuration(md, handshakeTimeout)
d.md.muxKeepAliveDisabled = md.GetBool(muxKeepAliveDisabled)
d.md.muxKeepAliveInterval = md.GetDuration(muxKeepAliveInterval)
d.md.muxKeepAliveTimeout = md.GetDuration(muxKeepAliveTimeout)
d.md.muxMaxFrameSize = md.GetInt(muxMaxFrameSize)
d.md.muxMaxReceiveBuffer = md.GetInt(muxMaxReceiveBuffer)
d.md.muxMaxStreamBuffer = md.GetInt(muxMaxStreamBuffer)
d.md.muxKeepAliveDisabled = mdata.GetBool(md, muxKeepAliveDisabled)
d.md.muxKeepAliveInterval = mdata.GetDuration(md, muxKeepAliveInterval)
d.md.muxKeepAliveTimeout = mdata.GetDuration(md, muxKeepAliveTimeout)
d.md.muxMaxFrameSize = mdata.GetInt(md, muxMaxFrameSize)
d.md.muxMaxReceiveBuffer = mdata.GetInt(md, muxMaxReceiveBuffer)
d.md.muxMaxStreamBuffer = mdata.GetInt(md, muxMaxStreamBuffer)
return
}

View File

@ -2,13 +2,12 @@ package ws
import (
"crypto/tls"
"fmt"
"net"
"net/http"
"time"
tls_util "github.com/go-gost/gost/pkg/common/util/tls"
md "github.com/go-gost/gost/pkg/metadata"
mdata "github.com/go-gost/gost/pkg/metadata"
)
const (
@ -29,7 +28,7 @@ type metadata struct {
header http.Header
}
func (d *wsDialer) parseMetadata(md md.Metadata) (err error) {
func (d *wsDialer) parseMetadata(md mdata.Metadata) (err error) {
const (
path = "path"
host = "host"
@ -49,35 +48,35 @@ func (d *wsDialer) parseMetadata(md md.Metadata) (err error) {
header = "header"
)
d.md.path = md.GetString(path)
d.md.path = mdata.GetString(md, path)
if d.md.path == "" {
d.md.path = defaultPath
}
d.md.host = md.GetString(host)
d.md.host = mdata.GetString(md, host)
sn, _, _ := net.SplitHostPort(md.GetString(serverName))
sn, _, _ := net.SplitHostPort(mdata.GetString(md, serverName))
if sn == "" {
sn = "localhost"
}
d.md.tlsConfig, err = tls_util.LoadClientConfig(
md.GetString(certFile),
md.GetString(keyFile),
md.GetString(caFile),
md.GetBool(secure),
mdata.GetString(md, certFile),
mdata.GetString(md, keyFile),
mdata.GetString(md, caFile),
mdata.GetBool(md, secure),
sn,
)
d.md.handshakeTimeout = md.GetDuration(handshakeTimeout)
d.md.readHeaderTimeout = md.GetDuration(readHeaderTimeout)
d.md.readBufferSize = md.GetInt(readBufferSize)
d.md.writeBufferSize = md.GetInt(writeBufferSize)
d.md.enableCompression = md.GetBool(enableCompression)
d.md.handshakeTimeout = mdata.GetDuration(md, handshakeTimeout)
d.md.readHeaderTimeout = mdata.GetDuration(md, readHeaderTimeout)
d.md.readBufferSize = mdata.GetInt(md, readBufferSize)
d.md.writeBufferSize = mdata.GetInt(md, writeBufferSize)
d.md.enableCompression = mdata.GetBool(md, enableCompression)
if mm, _ := md.Get(header).(map[interface{}]interface{}); len(mm) > 0 {
if m := mdata.GetStringMapString(md, header); len(m) > 0 {
h := http.Header{}
for k, v := range mm {
h.Add(fmt.Sprintf("%v", k), fmt.Sprintf("%v", v))
for k, v := range m {
h.Add(k, v)
}
d.md.header = h
}

View File

@ -2,13 +2,12 @@ package mux
import (
"crypto/tls"
"fmt"
"net"
"net/http"
"time"
tls_util "github.com/go-gost/gost/pkg/common/util/tls"
md "github.com/go-gost/gost/pkg/metadata"
mdata "github.com/go-gost/gost/pkg/metadata"
)
const (
@ -36,7 +35,7 @@ type metadata struct {
header http.Header
}
func (d *mwsDialer) parseMetadata(md md.Metadata) (err error) {
func (d *mwsDialer) parseMetadata(md mdata.Metadata) (err error) {
const (
path = "path"
host = "host"
@ -63,42 +62,42 @@ func (d *mwsDialer) parseMetadata(md md.Metadata) (err error) {
muxMaxStreamBuffer = "muxMaxStreamBuffer"
)
d.md.path = md.GetString(path)
d.md.path = mdata.GetString(md, path)
if d.md.path == "" {
d.md.path = defaultPath
}
d.md.host = md.GetString(host)
d.md.host = mdata.GetString(md, host)
sn, _, _ := net.SplitHostPort(md.GetString(serverName))
sn, _, _ := net.SplitHostPort(mdata.GetString(md, serverName))
if sn == "" {
sn = "localhost"
}
d.md.tlsConfig, err = tls_util.LoadClientConfig(
md.GetString(certFile),
md.GetString(keyFile),
md.GetString(caFile),
md.GetBool(secure),
mdata.GetString(md, certFile),
mdata.GetString(md, keyFile),
mdata.GetString(md, caFile),
mdata.GetBool(md, secure),
sn,
)
d.md.muxKeepAliveDisabled = md.GetBool(muxKeepAliveDisabled)
d.md.muxKeepAliveInterval = md.GetDuration(muxKeepAliveInterval)
d.md.muxKeepAliveTimeout = md.GetDuration(muxKeepAliveTimeout)
d.md.muxMaxFrameSize = md.GetInt(muxMaxFrameSize)
d.md.muxMaxReceiveBuffer = md.GetInt(muxMaxReceiveBuffer)
d.md.muxMaxStreamBuffer = md.GetInt(muxMaxStreamBuffer)
d.md.muxKeepAliveDisabled = mdata.GetBool(md, muxKeepAliveDisabled)
d.md.muxKeepAliveInterval = mdata.GetDuration(md, muxKeepAliveInterval)
d.md.muxKeepAliveTimeout = mdata.GetDuration(md, muxKeepAliveTimeout)
d.md.muxMaxFrameSize = mdata.GetInt(md, muxMaxFrameSize)
d.md.muxMaxReceiveBuffer = mdata.GetInt(md, muxMaxReceiveBuffer)
d.md.muxMaxStreamBuffer = mdata.GetInt(md, muxMaxStreamBuffer)
d.md.handshakeTimeout = md.GetDuration(handshakeTimeout)
d.md.readHeaderTimeout = md.GetDuration(readHeaderTimeout)
d.md.readBufferSize = md.GetInt(readBufferSize)
d.md.writeBufferSize = md.GetInt(writeBufferSize)
d.md.enableCompression = md.GetBool(enableCompression)
d.md.handshakeTimeout = mdata.GetDuration(md, handshakeTimeout)
d.md.readHeaderTimeout = mdata.GetDuration(md, readHeaderTimeout)
d.md.readBufferSize = mdata.GetInt(md, readBufferSize)
d.md.writeBufferSize = mdata.GetInt(md, writeBufferSize)
d.md.enableCompression = mdata.GetBool(md, enableCompression)
if mm, _ := md.Get(header).(map[interface{}]interface{}); len(mm) > 0 {
if m := mdata.GetStringMapString(md, header); len(m) > 0 {
h := http.Header{}
for k, v := range mm {
h.Add(fmt.Sprintf("%v", k), fmt.Sprintf("%v", v))
for k, v := range m {
h.Add(k, v)
}
d.md.header = h
}