Files
EdgeNode/internal/nodes/origin_utils.go

134 lines
3.9 KiB
Go
Raw Permalink Normal View History

2020-09-26 19:54:26 +08:00
package nodes
import (
"crypto/tls"
"errors"
2024-07-27 15:42:50 +08:00
"net"
"strconv"
2022-06-29 21:58:41 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/configutils"
2020-09-26 19:54:26 +08:00
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
"github.com/TeaOSLab/EdgeNode/internal/remotelogs"
2022-06-29 21:58:41 +08:00
"github.com/iwind/TeaGo/types"
2020-09-26 19:54:26 +08:00
)
2021-06-07 15:45:47 +08:00
// OriginConnect 连接源站
2022-06-29 21:58:41 +08:00
func OriginConnect(origin *serverconfigs.OriginConfig, serverPort int, remoteAddr string, tlsHost string) (originConn net.Conn, originAddr string, err error) {
2020-09-26 19:54:26 +08:00
if origin.Addr == nil {
2022-06-29 21:58:41 +08:00
return nil, "", errors.New("origin server address should not be empty")
2020-09-26 19:54:26 +08:00
}
2020-12-03 10:17:28 +08:00
// 支持TOA的连接
2021-08-01 21:56:02 +08:00
// 这个条件很重要如果没有传递remoteAddr表示不使用TOA
if len(remoteAddr) > 0 {
2022-06-29 21:58:41 +08:00
var toaConfig = sharedTOAManager.Config()
2021-08-01 21:56:02 +08:00
if toaConfig != nil && toaConfig.IsOn {
2022-06-29 21:58:41 +08:00
var retries = 3
2021-08-01 21:56:02 +08:00
for i := 1; i <= retries; i++ {
2022-06-29 21:58:41 +08:00
var port = int(toaConfig.RandLocalPort())
err = sharedTOAManager.SendMsg("add:" + strconv.Itoa(port) + ":" + remoteAddr)
2021-08-01 21:56:02 +08:00
if err != nil {
remotelogs.Error("TOA", "add failed: "+err.Error())
} else {
2022-06-29 21:58:41 +08:00
var dialer = net.Dialer{
2021-08-01 21:56:02 +08:00
Timeout: origin.ConnTimeoutDuration(),
LocalAddr: &net.TCPAddr{
Port: port,
},
}
2022-06-29 21:58:41 +08:00
originAddr = origin.Addr.PickAddress()
// 端口跟随
if origin.FollowPort && serverPort > 0 {
originAddr = configutils.QuoteIP(origin.Addr.Host) + ":" + types.String(serverPort)
}
2021-08-01 21:56:02 +08:00
var conn net.Conn
switch origin.Addr.Protocol {
case "", serverconfigs.ProtocolTCP, serverconfigs.ProtocolHTTP:
// TODO 支持TCP4/TCP6
// TODO 支持指定特定网卡
2022-06-29 21:58:41 +08:00
conn, err = dialer.Dial("tcp", originAddr)
2021-08-01 21:56:02 +08:00
case serverconfigs.ProtocolTLS, serverconfigs.ProtocolHTTPS:
// TODO 支持TCP4/TCP6
// TODO 支持指定特定网卡
2022-01-16 19:58:07 +08:00
var tlsConfig = &tls.Config{
2021-08-01 21:56:02 +08:00
InsecureSkipVerify: true,
2022-01-16 19:58:07 +08:00
}
if origin.Cert != nil {
var obj = origin.Cert.CertObject()
if obj != nil {
tlsConfig.InsecureSkipVerify = false
tlsConfig.Certificates = []tls.Certificate{*obj}
if len(origin.Cert.ServerName) > 0 {
tlsConfig.ServerName = origin.Cert.ServerName
}
}
}
2022-06-27 12:01:33 +08:00
if len(tlsHost) > 0 {
tlsConfig.ServerName = tlsHost
}
2022-01-16 19:58:07 +08:00
2022-06-29 21:58:41 +08:00
conn, err = tls.DialWithDialer(&dialer, "tcp", originAddr, tlsConfig)
2021-08-01 21:56:02 +08:00
}
2020-12-03 10:17:28 +08:00
2021-08-01 21:56:02 +08:00
// TODO 需要在合适的时机删除TOA记录
if err == nil || i == retries {
2022-06-29 21:58:41 +08:00
return conn, originAddr, err
2021-08-01 21:56:02 +08:00
}
2020-12-03 10:17:28 +08:00
}
}
}
}
2022-06-29 21:58:41 +08:00
originAddr = origin.Addr.PickAddress()
// 端口跟随
if origin.FollowPort && serverPort > 0 {
originAddr = configutils.QuoteIP(origin.Addr.Host) + ":" + types.String(serverPort)
}
2020-09-26 19:54:26 +08:00
switch origin.Addr.Protocol {
case "", serverconfigs.ProtocolTCP, serverconfigs.ProtocolHTTP:
// TODO 支持TCP4/TCP6
// TODO 支持指定特定网卡
2022-06-29 21:58:41 +08:00
originConn, err = net.DialTimeout("tcp", originAddr, origin.ConnTimeoutDuration())
return originConn, originAddr, err
2020-09-26 19:54:26 +08:00
case serverconfigs.ProtocolTLS, serverconfigs.ProtocolHTTPS:
// TODO 支持TCP4/TCP6
// TODO 支持指定特定网卡
2022-01-16 19:58:07 +08:00
var tlsConfig = &tls.Config{
InsecureSkipVerify: true,
2022-01-16 19:58:07 +08:00
}
if origin.Cert != nil {
var obj = origin.Cert.CertObject()
if obj != nil {
tlsConfig.InsecureSkipVerify = false
tlsConfig.Certificates = []tls.Certificate{*obj}
if len(origin.Cert.ServerName) > 0 {
tlsConfig.ServerName = origin.Cert.ServerName
}
}
}
2022-06-27 12:01:33 +08:00
if len(tlsHost) > 0 {
tlsConfig.ServerName = tlsHost
}
2022-01-16 19:58:07 +08:00
2022-06-29 21:58:41 +08:00
originConn, err = tls.Dial("tcp", originAddr, tlsConfig)
return originConn, originAddr, err
2021-06-07 15:45:47 +08:00
case serverconfigs.ProtocolUDP:
2022-06-29 21:58:41 +08:00
addr, err := net.ResolveUDPAddr("udp", originAddr)
2021-06-07 15:45:47 +08:00
if err != nil {
2022-06-29 21:58:41 +08:00
return nil, originAddr, err
2021-06-07 15:45:47 +08:00
}
2022-06-29 21:58:41 +08:00
originConn, err = net.DialUDP("udp", nil, addr)
return originConn, originAddr, err
2020-09-26 19:54:26 +08:00
}
// TODO 支持从Unix、Pipe、HTTP、HTTPS中读取数据
2022-06-29 21:58:41 +08:00
return nil, originAddr, errors.New("invalid origin scheme '" + origin.Addr.Protocol.String() + "'")
2020-09-26 19:54:26 +08:00
}