Commit 774c4ac4 authored by ibuler's avatar ibuler

[Update] Telnet支持网关

parent 46e92eb9
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
revision = "648efa622239a2f6ff949fed78ee37b48d499ba4" revision = "648efa622239a2f6ff949fed78ee37b48d499ba4"
[[projects]] [[projects]]
digest = "1:9cc80abecc469330afaa9cc72744b258419f5be8adc78b7898ada5d299152048" digest = "1:7b072517183e1d319b9127c2c43798e1e48f2d30b88e5a7e4f261a13c6ce5bbc"
name = "github.com/aws/aws-sdk-go" name = "github.com/aws/aws-sdk-go"
packages = [ packages = [
"aws", "aws",
...@@ -84,8 +84,8 @@ ...@@ -84,8 +84,8 @@
"service/sts", "service/sts",
] ]
pruneopts = "UT" pruneopts = "UT"
revision = "d6c5ccab427af7408a67e0f45c6e6a3d515fdaee" revision = "742c1495174cefd893992396b014bd6b7c91a293"
version = "v1.19.39" version = "v1.19.42"
[[projects]] [[projects]]
digest = "1:2af3a6e1f12e54cef95c6051cd1cb1e154629a4b82c692ac8a92f00259f570eb" digest = "1:2af3a6e1f12e54cef95c6051cd1cb1e154629a4b82c692ac8a92f00259f570eb"
...@@ -286,14 +286,14 @@ ...@@ -286,14 +286,14 @@
[[projects]] [[projects]]
branch = "master" branch = "master"
digest = "1:079999f5a3a0db923759948975e14ec0cee7195b9d99c566139307d971e7fc3c" digest = "1:4bb3e552e0c6745f9cf718126fcfb615775178146e6435ea8ba01b105f07102e"
name = "golang.org/x/sys" name = "golang.org/x/sys"
packages = [ packages = [
"cpu", "cpu",
"unix", "unix",
] ]
pruneopts = "UT" pruneopts = "UT"
revision = "854af27f14a7156d646cb0812811bbc293b2d6a7" revision = "4c4f7f33c9ed00de01c4c741d2177abfcfe19307"
[[projects]] [[projects]]
branch = "master" branch = "master"
...@@ -329,7 +329,6 @@ ...@@ -329,7 +329,6 @@
"github.com/aws/aws-sdk-go/aws", "github.com/aws/aws-sdk-go/aws",
"github.com/aws/aws-sdk-go/aws/credentials", "github.com/aws/aws-sdk-go/aws/credentials",
"github.com/aws/aws-sdk-go/aws/session", "github.com/aws/aws-sdk-go/aws/session",
"github.com/aws/aws-sdk-go/service/s3",
"github.com/aws/aws-sdk-go/service/s3/s3manager", "github.com/aws/aws-sdk-go/service/s3/s3manager",
"github.com/elastic/go-elasticsearch", "github.com/elastic/go-elasticsearch",
"github.com/gliderlabs/ssh", "github.com/gliderlabs/ssh",
......
...@@ -88,7 +88,7 @@ func GetDomainWithGateway(gID string) (domain model.Domain) { ...@@ -88,7 +88,7 @@ func GetDomainWithGateway(gID string) (domain model.Domain) {
url := fmt.Sprintf(DomainDetailURL, gID) url := fmt.Sprintf(DomainDetailURL, gID)
err := authClient.Get(url, &domain) err := authClient.Get(url, &domain)
if err != nil { if err != nil {
logger.Errorf("Get domain %s failed", gID) logger.Errorf("Get domain %s failed: %s", gID, err)
} }
return return
} }
......
...@@ -12,7 +12,7 @@ const ( ...@@ -12,7 +12,7 @@ const (
SystemUserCmdFilterRules = "/api/assets/v1/system-user/%s/cmd-filter-rules/" // 过滤规则url SystemUserCmdFilterRules = "/api/assets/v1/system-user/%s/cmd-filter-rules/" // 过滤规则url
SystemUserDetailURL = "/api/assets/v1/system-user/%s/" // 某个系统用户的信息 SystemUserDetailURL = "/api/assets/v1/system-user/%s/" // 某个系统用户的信息
AssetDetailURL = "/api/assets/v1/assets/%s/" // 某一个资产信息 AssetDetailURL = "/api/assets/v1/assets/%s/" // 某一个资产信息
DomainDetailURL = "/api/assets/v1/domain/%s/" DomainDetailURL = "/api/assets/v1/domain/%s/?gateway=1"
TerminalRegisterURL = "/api/terminal/v2/terminal-registrations/" // 注册当前coco TerminalRegisterURL = "/api/terminal/v2/terminal-registrations/" // 注册当前coco
TerminalConfigURL = "/api/terminal/v1/terminal/config/" // 从jumpserver获取coco的配置 TerminalConfigURL = "/api/terminal/v1/terminal/config/" // 从jumpserver获取coco的配置
......
...@@ -66,9 +66,13 @@ func (sc *SSHClientConfig) Config() (config *gossh.ClientConfig, err error) { ...@@ -66,9 +66,13 @@ func (sc *SSHClientConfig) Config() (config *gossh.ClientConfig, err error) {
func (sc *SSHClientConfig) DialProxy() (client *gossh.Client, err error) { func (sc *SSHClientConfig) DialProxy() (client *gossh.Client, err error) {
for _, p := range sc.Proxy { for _, p := range sc.Proxy {
logger.Debug("Connect proxy: .......")
client, err = p.Dial() client, err = p.Dial()
if err == nil { if err == nil {
logger.Debug("Connect proxy host %s:%s success", p.Host, p.Port)
return return
} else {
logger.Errorf("Connect proxy host %s:%s error: ", p.Host, p.Port, err)
} }
} }
return return
...@@ -113,12 +117,12 @@ func (sc *SSHClientConfig) String() string { ...@@ -113,12 +117,12 @@ func (sc *SSHClientConfig) String() string {
return fmt.Sprintf("%s@%s:%s", sc.User, sc.Host, sc.Port) return fmt.Sprintf("%s@%s:%s", sc.User, sc.Host, sc.Port)
} }
func newClient(asset *model.Asset, systemUser *model.SystemUser, timeout time.Duration) (client *gossh.Client, err error) { func MakeConfig(asset *model.Asset, systemUser *model.SystemUser, timeout time.Duration) (conf *SSHClientConfig) {
proxyConfigs := make([]*SSHClientConfig, 0) proxyConfigs := make([]*SSHClientConfig, 0)
// 如果有网关则从网关中连接 // 如果有网关则从网关中连接
if asset.Domain != "" { if asset.Domain != "" {
domain := service.GetDomainWithGateway(asset.Domain) domain := service.GetDomainWithGateway(asset.Domain)
if domain.ID != "" && len(domain.Gateways) > 1 { if domain.ID != "" && len(domain.Gateways) > 0 {
for _, gateway := range domain.Gateways { for _, gateway := range domain.Gateways {
proxyConfigs = append(proxyConfigs, &SSHClientConfig{ proxyConfigs = append(proxyConfigs, &SSHClientConfig{
Host: gateway.IP, Host: gateway.IP,
...@@ -131,7 +135,7 @@ func newClient(asset *model.Asset, systemUser *model.SystemUser, timeout time.Du ...@@ -131,7 +135,7 @@ func newClient(asset *model.Asset, systemUser *model.SystemUser, timeout time.Du
} }
} }
} }
sshConfig := SSHClientConfig{ conf = &SSHClientConfig{
Host: asset.IP, Host: asset.IP,
Port: strconv.Itoa(asset.Port), Port: strconv.Itoa(asset.Port),
User: systemUser.Username, User: systemUser.Username,
...@@ -140,6 +144,11 @@ func newClient(asset *model.Asset, systemUser *model.SystemUser, timeout time.Du ...@@ -140,6 +144,11 @@ func newClient(asset *model.Asset, systemUser *model.SystemUser, timeout time.Du
Timeout: timeout, Timeout: timeout,
Proxy: proxyConfigs, Proxy: proxyConfigs,
} }
return
}
func newClient(asset *model.Asset, systemUser *model.SystemUser, timeout time.Duration) (client *gossh.Client, err error) {
sshConfig := MakeConfig(asset, systemUser, timeout)
client, err = sshConfig.Dial() client, err = sshConfig.Dial()
return return
} }
......
...@@ -21,7 +21,6 @@ type ServerSSHConnection struct { ...@@ -21,7 +21,6 @@ type ServerSSHConnection struct {
stdin io.WriteCloser stdin io.WriteCloser
stdout io.Reader stdout io.Reader
closed bool closed bool
refCount int
connected bool connected bool
} }
......
...@@ -2,14 +2,16 @@ package srvconn ...@@ -2,14 +2,16 @@ package srvconn
import ( import (
"bytes" "bytes"
"cocogo/pkg/model"
"errors" "errors"
"net" "net"
"regexp" "regexp"
"strconv" "strconv"
"time" "time"
gossh "golang.org/x/crypto/ssh"
"cocogo/pkg/logger" "cocogo/pkg/logger"
"cocogo/pkg/model"
) )
const ( const (
...@@ -139,7 +141,29 @@ func (tc *ServerTelnetConnection) login(data []byte) AuthStatus { ...@@ -139,7 +141,29 @@ func (tc *ServerTelnetConnection) login(data []byte) AuthStatus {
func (tc *ServerTelnetConnection) Connect(h, w int, term string) (err error) { func (tc *ServerTelnetConnection) Connect(h, w int, term string) (err error) {
var ip = tc.Asset.IP var ip = tc.Asset.IP
var port = strconv.Itoa(tc.Asset.Port) var port = strconv.Itoa(tc.Asset.Port)
conn, err := net.DialTimeout("tcp", net.JoinHostPort(ip, port), tc.Timeout()) var asset = tc.Asset
var proxyConn *gossh.Client
if asset.Domain != "" {
sshConfig := MakeConfig(tc.Asset, tc.SystemUser, tc.Timeout())
proxyConn, err = sshConfig.DialProxy()
logger.Errorf("Proxy conn: ", proxyConn)
if err != nil {
logger.Error("Dial proxy host error")
return
}
}
addr := net.JoinHostPort(ip, port)
var conn net.Conn
// 判断是否有合适的proxy连接
if proxyConn != nil {
logger.Debug("Connect host via proxy")
conn, err = proxyConn.Dial("tcp", addr)
} else {
logger.Debug("Direct connect host")
conn, err = net.DialTimeout("tcp", addr, tc.Timeout())
}
if err != nil { if err != nil {
return return
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment