Files
kubevpn/pkg/handler/route.go
2022-08-05 15:23:34 +08:00

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
}