mirror of
https://github.com/kubenetworks/kubevpn.git
synced 2025-10-08 00:30:29 +08:00
94 lines
2.1 KiB
Go
94 lines
2.1 KiB
Go
package handler
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"net"
|
|
"strings"
|
|
|
|
"github.com/pkg/errors"
|
|
|
|
"github.com/wencaiwulue/kubevpn/pkg/config"
|
|
"github.com/wencaiwulue/kubevpn/pkg/core"
|
|
"github.com/wencaiwulue/kubevpn/pkg/tun"
|
|
)
|
|
|
|
type Route struct {
|
|
ServeNodes []string // -L tun
|
|
ChainNode string // -F tcp
|
|
Retries int
|
|
}
|
|
|
|
func (r *Route) parseChain() (*core.Chain, error) {
|
|
// parse the base nodes
|
|
node, err := parseChainNode(r.ChainNode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return core.NewChain(r.Retries, node), nil
|
|
}
|
|
|
|
func parseChainNode(ns string) (*core.Node, error) {
|
|
node, err := core.ParseNode(ns)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
node.Client = &core.Client{
|
|
Connector: core.UDPOverTCPTunnelConnector(),
|
|
Transporter: core.TCPTransporter(),
|
|
}
|
|
return node, nil
|
|
}
|
|
|
|
func (r *Route) GenerateServers() ([]core.Server, error) {
|
|
chain, err := r.parseChain()
|
|
if err != nil && !errors.Is(err, core.ErrorInvalidNode) {
|
|
return nil, err
|
|
}
|
|
|
|
servers := make([]core.Server, 0, len(r.ServeNodes))
|
|
for _, serveNode := range r.ServeNodes {
|
|
node, err := core.ParseNode(serveNode)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var ln net.Listener
|
|
var handler core.Handler
|
|
|
|
switch node.Protocol {
|
|
case "tun":
|
|
handler = core.TunHandler(chain, node)
|
|
ln, err = tun.Listener(tun.Config{
|
|
Name: node.Get("name"),
|
|
Addr: node.Get("net"),
|
|
MTU: node.GetInt("mtu"),
|
|
Routes: parseIPRoutes(node.Get("route")),
|
|
Gateway: node.Get("gw"),
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
default:
|
|
handler = core.TCPHandler()
|
|
tcpListener, _ := core.TCPListener(node.Addr)
|
|
ln = tls.NewListener(tcpListener, config.TlsConfigServer)
|
|
}
|
|
servers = append(servers, core.Server{Listener: ln, Handler: handler})
|
|
}
|
|
return servers, nil
|
|
}
|
|
|
|
func parseIPRoutes(routeStringList string) (routes []tun.IPRoute) {
|
|
if len(routeStringList) == 0 {
|
|
return
|
|
}
|
|
|
|
routeList := strings.Split(routeStringList, ",")
|
|
for _, route := range routeList {
|
|
if _, ipNet, _ := net.ParseCIDR(strings.TrimSpace(route)); ipNet != nil {
|
|
routes = append(routes, tun.IPRoute{Dest: ipNet})
|
|
}
|
|
}
|
|
return
|
|
}
|