mirror of https://github.com/fatedier/frp
				
				
				
			
		
			
				
	
	
		
			247 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			247 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Go
		
	
	
// Copyright 2016 fatedier, fatedier@gmail.com
 | 
						|
//
 | 
						|
// Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
// you may not use this file except in compliance with the License.
 | 
						|
// You may obtain a copy of the License at
 | 
						|
//
 | 
						|
//     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
//
 | 
						|
// Unless required by applicable law or agreed to in writing, software
 | 
						|
// distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
// See the License for the specific language governing permissions and
 | 
						|
// limitations under the License.
 | 
						|
 | 
						|
package msg
 | 
						|
 | 
						|
import (
 | 
						|
	"net"
 | 
						|
	"reflect"
 | 
						|
)
 | 
						|
 | 
						|
const (
 | 
						|
	TypeLogin              = 'o'
 | 
						|
	TypeLoginResp          = '1'
 | 
						|
	TypeNewProxy           = 'p'
 | 
						|
	TypeNewProxyResp       = '2'
 | 
						|
	TypeCloseProxy         = 'c'
 | 
						|
	TypeNewWorkConn        = 'w'
 | 
						|
	TypeReqWorkConn        = 'r'
 | 
						|
	TypeStartWorkConn      = 's'
 | 
						|
	TypeNewVisitorConn     = 'v'
 | 
						|
	TypeNewVisitorConnResp = '3'
 | 
						|
	TypePing               = 'h'
 | 
						|
	TypePong               = '4'
 | 
						|
	TypeUDPPacket          = 'u'
 | 
						|
	TypeNatHoleVisitor     = 'i'
 | 
						|
	TypeNatHoleClient      = 'n'
 | 
						|
	TypeNatHoleResp        = 'm'
 | 
						|
	TypeNatHoleSid         = '5'
 | 
						|
	TypeNatHoleReport      = '6'
 | 
						|
)
 | 
						|
 | 
						|
var msgTypeMap = map[byte]interface{}{
 | 
						|
	TypeLogin:              Login{},
 | 
						|
	TypeLoginResp:          LoginResp{},
 | 
						|
	TypeNewProxy:           NewProxy{},
 | 
						|
	TypeNewProxyResp:       NewProxyResp{},
 | 
						|
	TypeCloseProxy:         CloseProxy{},
 | 
						|
	TypeNewWorkConn:        NewWorkConn{},
 | 
						|
	TypeReqWorkConn:        ReqWorkConn{},
 | 
						|
	TypeStartWorkConn:      StartWorkConn{},
 | 
						|
	TypeNewVisitorConn:     NewVisitorConn{},
 | 
						|
	TypeNewVisitorConnResp: NewVisitorConnResp{},
 | 
						|
	TypePing:               Ping{},
 | 
						|
	TypePong:               Pong{},
 | 
						|
	TypeUDPPacket:          UDPPacket{},
 | 
						|
	TypeNatHoleVisitor:     NatHoleVisitor{},
 | 
						|
	TypeNatHoleClient:      NatHoleClient{},
 | 
						|
	TypeNatHoleResp:        NatHoleResp{},
 | 
						|
	TypeNatHoleSid:         NatHoleSid{},
 | 
						|
	TypeNatHoleReport:      NatHoleReport{},
 | 
						|
}
 | 
						|
 | 
						|
var TypeNameNatHoleResp = reflect.TypeOf(&NatHoleResp{}).Elem().Name()
 | 
						|
 | 
						|
type ClientSpec struct {
 | 
						|
	// Due to the support of VirtualClient, frps needs to know the client type in order to
 | 
						|
	// differentiate the processing logic.
 | 
						|
	// Optional values: ssh-tunnel
 | 
						|
	Type string `json:"type,omitempty"`
 | 
						|
	// If the value is true, the client will not require authentication.
 | 
						|
	AlwaysAuthPass bool `json:"always_auth_pass,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
// When frpc start, client send this message to login to server.
 | 
						|
type Login struct {
 | 
						|
	Version      string            `json:"version,omitempty"`
 | 
						|
	Hostname     string            `json:"hostname,omitempty"`
 | 
						|
	Os           string            `json:"os,omitempty"`
 | 
						|
	Arch         string            `json:"arch,omitempty"`
 | 
						|
	User         string            `json:"user,omitempty"`
 | 
						|
	PrivilegeKey string            `json:"privilege_key,omitempty"`
 | 
						|
	Timestamp    int64             `json:"timestamp,omitempty"`
 | 
						|
	RunID        string            `json:"run_id,omitempty"`
 | 
						|
	Metas        map[string]string `json:"metas,omitempty"`
 | 
						|
 | 
						|
	// Currently only effective for VirtualClient.
 | 
						|
	ClientSpec ClientSpec `json:"client_spec,omitempty"`
 | 
						|
 | 
						|
	// Some global configures.
 | 
						|
	PoolCount int `json:"pool_count,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type LoginResp struct {
 | 
						|
	Version string `json:"version,omitempty"`
 | 
						|
	RunID   string `json:"run_id,omitempty"`
 | 
						|
	Error   string `json:"error,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
// When frpc login success, send this message to frps for running a new proxy.
 | 
						|
type NewProxy struct {
 | 
						|
	ProxyName          string            `json:"proxy_name,omitempty"`
 | 
						|
	ProxyType          string            `json:"proxy_type,omitempty"`
 | 
						|
	UseEncryption      bool              `json:"use_encryption,omitempty"`
 | 
						|
	UseCompression     bool              `json:"use_compression,omitempty"`
 | 
						|
	BandwidthLimit     string            `json:"bandwidth_limit,omitempty"`
 | 
						|
	BandwidthLimitMode string            `json:"bandwidth_limit_mode,omitempty"`
 | 
						|
	Group              string            `json:"group,omitempty"`
 | 
						|
	GroupKey           string            `json:"group_key,omitempty"`
 | 
						|
	Metas              map[string]string `json:"metas,omitempty"`
 | 
						|
	Annotations        map[string]string `json:"annotations,omitempty"`
 | 
						|
 | 
						|
	// tcp and udp only
 | 
						|
	RemotePort int `json:"remote_port,omitempty"`
 | 
						|
 | 
						|
	// http and https only
 | 
						|
	CustomDomains     []string          `json:"custom_domains,omitempty"`
 | 
						|
	SubDomain         string            `json:"subdomain,omitempty"`
 | 
						|
	Locations         []string          `json:"locations,omitempty"`
 | 
						|
	HTTPUser          string            `json:"http_user,omitempty"`
 | 
						|
	HTTPPwd           string            `json:"http_pwd,omitempty"`
 | 
						|
	HostHeaderRewrite string            `json:"host_header_rewrite,omitempty"`
 | 
						|
	Headers           map[string]string `json:"headers,omitempty"`
 | 
						|
	ResponseHeaders   map[string]string `json:"response_headers,omitempty"`
 | 
						|
	RouteByHTTPUser   string            `json:"route_by_http_user,omitempty"`
 | 
						|
 | 
						|
	// stcp, sudp, xtcp
 | 
						|
	Sk         string   `json:"sk,omitempty"`
 | 
						|
	AllowUsers []string `json:"allow_users,omitempty"`
 | 
						|
 | 
						|
	// tcpmux
 | 
						|
	Multiplexer string `json:"multiplexer,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type NewProxyResp struct {
 | 
						|
	ProxyName  string `json:"proxy_name,omitempty"`
 | 
						|
	RemoteAddr string `json:"remote_addr,omitempty"`
 | 
						|
	Error      string `json:"error,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type CloseProxy struct {
 | 
						|
	ProxyName string `json:"proxy_name,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type NewWorkConn struct {
 | 
						|
	RunID        string `json:"run_id,omitempty"`
 | 
						|
	PrivilegeKey string `json:"privilege_key,omitempty"`
 | 
						|
	Timestamp    int64  `json:"timestamp,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type ReqWorkConn struct{}
 | 
						|
 | 
						|
type StartWorkConn struct {
 | 
						|
	ProxyName string `json:"proxy_name,omitempty"`
 | 
						|
	SrcAddr   string `json:"src_addr,omitempty"`
 | 
						|
	DstAddr   string `json:"dst_addr,omitempty"`
 | 
						|
	SrcPort   uint16 `json:"src_port,omitempty"`
 | 
						|
	DstPort   uint16 `json:"dst_port,omitempty"`
 | 
						|
	Error     string `json:"error,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type NewVisitorConn struct {
 | 
						|
	RunID          string `json:"run_id,omitempty"`
 | 
						|
	ProxyName      string `json:"proxy_name,omitempty"`
 | 
						|
	SignKey        string `json:"sign_key,omitempty"`
 | 
						|
	Timestamp      int64  `json:"timestamp,omitempty"`
 | 
						|
	UseEncryption  bool   `json:"use_encryption,omitempty"`
 | 
						|
	UseCompression bool   `json:"use_compression,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type NewVisitorConnResp struct {
 | 
						|
	ProxyName string `json:"proxy_name,omitempty"`
 | 
						|
	Error     string `json:"error,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type Ping struct {
 | 
						|
	PrivilegeKey string `json:"privilege_key,omitempty"`
 | 
						|
	Timestamp    int64  `json:"timestamp,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type Pong struct {
 | 
						|
	Error string `json:"error,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type UDPPacket struct {
 | 
						|
	Content    string       `json:"c,omitempty"`
 | 
						|
	LocalAddr  *net.UDPAddr `json:"l,omitempty"`
 | 
						|
	RemoteAddr *net.UDPAddr `json:"r,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type NatHoleVisitor struct {
 | 
						|
	TransactionID string   `json:"transaction_id,omitempty"`
 | 
						|
	ProxyName     string   `json:"proxy_name,omitempty"`
 | 
						|
	PreCheck      bool     `json:"pre_check,omitempty"`
 | 
						|
	Protocol      string   `json:"protocol,omitempty"`
 | 
						|
	SignKey       string   `json:"sign_key,omitempty"`
 | 
						|
	Timestamp     int64    `json:"timestamp,omitempty"`
 | 
						|
	MappedAddrs   []string `json:"mapped_addrs,omitempty"`
 | 
						|
	AssistedAddrs []string `json:"assisted_addrs,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type NatHoleClient struct {
 | 
						|
	TransactionID string   `json:"transaction_id,omitempty"`
 | 
						|
	ProxyName     string   `json:"proxy_name,omitempty"`
 | 
						|
	Sid           string   `json:"sid,omitempty"`
 | 
						|
	MappedAddrs   []string `json:"mapped_addrs,omitempty"`
 | 
						|
	AssistedAddrs []string `json:"assisted_addrs,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type PortsRange struct {
 | 
						|
	From int `json:"from,omitempty"`
 | 
						|
	To   int `json:"to,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type NatHoleDetectBehavior struct {
 | 
						|
	Role              string       `json:"role,omitempty"` // sender or receiver
 | 
						|
	Mode              int          `json:"mode,omitempty"` // 0, 1, 2...
 | 
						|
	TTL               int          `json:"ttl,omitempty"`
 | 
						|
	SendDelayMs       int          `json:"send_delay_ms,omitempty"`
 | 
						|
	ReadTimeoutMs     int          `json:"read_timeout,omitempty"`
 | 
						|
	CandidatePorts    []PortsRange `json:"candidate_ports,omitempty"`
 | 
						|
	SendRandomPorts   int          `json:"send_random_ports,omitempty"`
 | 
						|
	ListenRandomPorts int          `json:"listen_random_ports,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type NatHoleResp struct {
 | 
						|
	TransactionID  string                `json:"transaction_id,omitempty"`
 | 
						|
	Sid            string                `json:"sid,omitempty"`
 | 
						|
	Protocol       string                `json:"protocol,omitempty"`
 | 
						|
	CandidateAddrs []string              `json:"candidate_addrs,omitempty"`
 | 
						|
	AssistedAddrs  []string              `json:"assisted_addrs,omitempty"`
 | 
						|
	DetectBehavior NatHoleDetectBehavior `json:"detect_behavior,omitempty"`
 | 
						|
	Error          string                `json:"error,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type NatHoleSid struct {
 | 
						|
	TransactionID string `json:"transaction_id,omitempty"`
 | 
						|
	Sid           string `json:"sid,omitempty"`
 | 
						|
	Response      bool   `json:"response,omitempty"`
 | 
						|
	Nonce         string `json:"nonce,omitempty"`
 | 
						|
}
 | 
						|
 | 
						|
type NatHoleReport struct {
 | 
						|
	Sid     string `json:"sid,omitempty"`
 | 
						|
	Success bool   `json:"success,omitempty"`
 | 
						|
}
 |