2020-09-26 19:54:26 +08:00
|
|
|
|
package nodes
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"crypto/tls"
|
|
|
|
|
|
"errors"
|
|
|
|
|
|
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
2020-12-03 10:17:28 +08:00
|
|
|
|
"github.com/TeaOSLab/EdgeNode/internal/logs"
|
2020-09-26 19:54:26 +08:00
|
|
|
|
"net"
|
2020-12-03 10:17:28 +08:00
|
|
|
|
"strconv"
|
2020-09-26 19:54:26 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// 连接源站
|
2020-12-03 10:17:28 +08:00
|
|
|
|
func OriginConnect(origin *serverconfigs.OriginConfig, remoteAddr string) (net.Conn, error) {
|
2020-09-26 19:54:26 +08:00
|
|
|
|
if origin.Addr == nil {
|
|
|
|
|
|
return nil, errors.New("origin server address should not be empty")
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-12-03 10:17:28 +08:00
|
|
|
|
// 支持TOA的连接
|
|
|
|
|
|
toaConfig := sharedTOAManager.Config()
|
|
|
|
|
|
if toaConfig != nil && toaConfig.IsOn {
|
|
|
|
|
|
retries := 3
|
|
|
|
|
|
for i := 1; i <= retries; i++ {
|
|
|
|
|
|
port := int(toaConfig.RandLocalPort())
|
|
|
|
|
|
err := sharedTOAManager.SendMsg("add:" + strconv.Itoa(port) + ":" + remoteAddr)
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
logs.Error("TOA", "add failed: "+err.Error())
|
|
|
|
|
|
} else {
|
|
|
|
|
|
dialer := net.Dialer{
|
|
|
|
|
|
Timeout: origin.ConnTimeoutDuration(),
|
|
|
|
|
|
LocalAddr: &net.TCPAddr{
|
|
|
|
|
|
Port: port,
|
|
|
|
|
|
},
|
|
|
|
|
|
}
|
|
|
|
|
|
var conn net.Conn
|
|
|
|
|
|
switch origin.Addr.Protocol {
|
|
|
|
|
|
case "", serverconfigs.ProtocolTCP, serverconfigs.ProtocolHTTP:
|
|
|
|
|
|
// TODO 支持TCP4/TCP6
|
|
|
|
|
|
// TODO 支持指定特定网卡
|
|
|
|
|
|
// TODO Addr支持端口范围,如果有多个端口时,随机一个端口使用
|
|
|
|
|
|
conn, err = dialer.Dial("tcp", origin.Addr.Host+":"+origin.Addr.PortRange)
|
|
|
|
|
|
case serverconfigs.ProtocolTLS, serverconfigs.ProtocolHTTPS:
|
|
|
|
|
|
// TODO 支持TCP4/TCP6
|
|
|
|
|
|
// TODO 支持指定特定网卡
|
|
|
|
|
|
// TODO Addr支持端口范围,如果有多个端口时,随机一个端口使用
|
|
|
|
|
|
// TODO 支持使用证书
|
|
|
|
|
|
conn, err = tls.DialWithDialer(&dialer, "tcp", origin.Addr.Host+":"+origin.Addr.PortRange, &tls.Config{
|
|
|
|
|
|
InsecureSkipVerify: true,
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TODO 需要在合适的时机删除TOA记录
|
|
|
|
|
|
if err == nil || i == retries {
|
|
|
|
|
|
return conn, err
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-09-26 19:54:26 +08:00
|
|
|
|
switch origin.Addr.Protocol {
|
|
|
|
|
|
case "", serverconfigs.ProtocolTCP, serverconfigs.ProtocolHTTP:
|
|
|
|
|
|
// TODO 支持TCP4/TCP6
|
|
|
|
|
|
// TODO 支持指定特定网卡
|
|
|
|
|
|
// TODO Addr支持端口范围,如果有多个端口时,随机一个端口使用
|
|
|
|
|
|
return net.DialTimeout("tcp", origin.Addr.Host+":"+origin.Addr.PortRange, origin.ConnTimeoutDuration())
|
|
|
|
|
|
case serverconfigs.ProtocolTLS, serverconfigs.ProtocolHTTPS:
|
|
|
|
|
|
// TODO 支持TCP4/TCP6
|
|
|
|
|
|
// TODO 支持指定特定网卡
|
|
|
|
|
|
// TODO Addr支持端口范围,如果有多个端口时,随机一个端口使用
|
|
|
|
|
|
// TODO 支持使用证书
|
2020-11-30 15:29:02 +08:00
|
|
|
|
return tls.Dial("tcp", origin.Addr.Host+":"+origin.Addr.PortRange, &tls.Config{
|
|
|
|
|
|
InsecureSkipVerify: true,
|
|
|
|
|
|
})
|
2020-09-26 19:54:26 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// TODO 支持从Unix、Pipe、HTTP、HTTPS中读取数据
|
|
|
|
|
|
|
|
|
|
|
|
return nil, errors.New("invalid scheme '" + origin.Addr.Protocol.String() + "'")
|
|
|
|
|
|
}
|