mirror of
				https://github.com/bjdgyc/anylink.git
				synced 2025-11-01 00:59:34 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			92 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package handler
 | |
| 
 | |
| import (
 | |
| 	"github.com/bjdgyc/anylink/dbdata"
 | |
| 	"github.com/bjdgyc/anylink/sessdata"
 | |
| 	"github.com/songgao/water/waterutil"
 | |
| )
 | |
| 
 | |
| func payloadIn(cSess *sessdata.ConnSession, lType sessdata.LType, pType byte, data []byte) bool {
 | |
| 	payload := &sessdata.Payload{
 | |
| 		LType: lType,
 | |
| 		PType: pType,
 | |
| 		Data:  data,
 | |
| 	}
 | |
| 
 | |
| 	return payloadInData(cSess, payload)
 | |
| }
 | |
| 
 | |
| func payloadInData(cSess *sessdata.ConnSession, payload *sessdata.Payload) bool {
 | |
| 	// 进行Acl规则判断
 | |
| 	check := checkLinkAcl(cSess.Group, payload)
 | |
| 	if !check {
 | |
| 		// 校验不通过直接丢弃
 | |
| 		return false
 | |
| 	}
 | |
| 
 | |
| 	closed := false
 | |
| 	select {
 | |
| 	case cSess.PayloadIn <- payload:
 | |
| 	case <-cSess.CloseChan:
 | |
| 		closed = true
 | |
| 	}
 | |
| 
 | |
| 	return closed
 | |
| }
 | |
| 
 | |
| func payloadOut(cSess *sessdata.ConnSession, lType sessdata.LType, pType byte, data []byte) bool {
 | |
| 	payload := &sessdata.Payload{
 | |
| 		LType: lType,
 | |
| 		PType: pType,
 | |
| 		Data:  data,
 | |
| 	}
 | |
| 
 | |
| 	return payloadOutData(cSess, payload)
 | |
| }
 | |
| 
 | |
| func payloadOutData(cSess *sessdata.ConnSession, payload *sessdata.Payload) bool {
 | |
| 	closed := false
 | |
| 
 | |
| 	select {
 | |
| 	case cSess.PayloadOut <- payload:
 | |
| 	case <-cSess.CloseChan:
 | |
| 		closed = true
 | |
| 	}
 | |
| 
 | |
| 	return closed
 | |
| }
 | |
| 
 | |
| // Acl规则校验
 | |
| func checkLinkAcl(group *dbdata.Group, payload *sessdata.Payload) bool {
 | |
| 	if payload.LType == sessdata.LTypeIPData && payload.PType == 0x00 && len(group.LinkAcl) > 0 {
 | |
| 	} else {
 | |
| 		return true
 | |
| 	}
 | |
| 
 | |
| 	ip_dst := waterutil.IPv4Destination(payload.Data)
 | |
| 	ip_port := waterutil.IPv4DestinationPort(payload.Data)
 | |
| 	// fmt.Println("sent:", ip_dst, ip_port)
 | |
| 
 | |
| 	// 优先放行dns端口
 | |
| 	for _, v := range group.ClientDns {
 | |
| 		if v.Val == ip_dst.String() && ip_port == 53 {
 | |
| 			return true
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	for _, v := range group.LinkAcl {
 | |
| 		// 循环判断ip和端口
 | |
| 		if v.IpNet.Contains(ip_dst) {
 | |
| 			if v.Port == ip_port || v.Port == 0 {
 | |
| 				if v.Action == dbdata.Allow {
 | |
| 					return true
 | |
| 				} else {
 | |
| 					return false
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	return false
 | |
| }
 |