增加policy的校验
This commit is contained in:
parent
50dbe9ecae
commit
0edf2a34c3
@ -45,7 +45,7 @@ public class SDLConfiguration {
|
||||
let exitNodeIp: UInt32
|
||||
}
|
||||
|
||||
public struct ACL {
|
||||
public struct ACL: Sendable {
|
||||
let tcpPorts: Set<UInt16>
|
||||
let udpPorts: Set<UInt16>
|
||||
|
||||
|
||||
@ -103,7 +103,7 @@ actor SDLContextActor {
|
||||
let sessionManager = SessionManager()
|
||||
let arpResolver = ArpResolver()
|
||||
let flowTracer = SDLFlowTracer()
|
||||
let policyService = PolicyService(identityId: config.identityId)
|
||||
let policyService = PolicyService(identityId: config.identityId, acl: config.acl)
|
||||
let superServiceProxy = SDLSuperServiceProxy()
|
||||
let udpHoleServiceProxy = SDLUDPHoleServiceProxy()
|
||||
let tunNetworkManager = SDLTunNetworkManager(provider: provider)
|
||||
|
||||
@ -16,13 +16,20 @@ struct PolicyRuntime: @unchecked Sendable {
|
||||
|
||||
private let policyRuleSnapshot: PolicyRuleSnapshot
|
||||
private let flowSessionTable: FlowSessionTable
|
||||
private let acl: SDLConfiguration.ACL
|
||||
|
||||
init(policyRuleSnapshot: PolicyRuleSnapshot, flowSessionTable: FlowSessionTable) {
|
||||
init(policyRuleSnapshot: PolicyRuleSnapshot, flowSessionTable: FlowSessionTable, acl: SDLConfiguration.ACL) {
|
||||
self.policyRuleSnapshot = policyRuleSnapshot
|
||||
self.flowSessionTable = flowSessionTable
|
||||
self.acl = acl
|
||||
}
|
||||
|
||||
func evaluateInbound(srcIdentityID: UInt32, ipPacket: IPPacketView) -> InboundDecision {
|
||||
if self.isExposedService(ipPacket: ipPacket) {
|
||||
SDLLogger.log("[PolicyRuntime] acl hit, src_identify_id: \(srcIdentityID), check rule: \(debugInfo(ipPacket: ipPacket))")
|
||||
return self.evaluateByRule(srcIdentityID: srcIdentityID, ipPacket: ipPacket)
|
||||
}
|
||||
|
||||
if self.isAllowedBySession(ipPacket: ipPacket) {
|
||||
SDLLogger.log("[PolicyRuntime] session hit, src_identify_id: \(srcIdentityID), allow: \(debugInfo(ipPacket: ipPacket))")
|
||||
return .allow
|
||||
@ -33,6 +40,10 @@ struct PolicyRuntime: @unchecked Sendable {
|
||||
return .allow
|
||||
}
|
||||
|
||||
return self.evaluateByRule(srcIdentityID: srcIdentityID, ipPacket: ipPacket)
|
||||
}
|
||||
|
||||
private func evaluateByRule(srcIdentityID: UInt32, ipPacket: IPPacketView) -> InboundDecision {
|
||||
guard let ruleMap = self.policyRuleSnapshot.lookup(srcIdentityID) else {
|
||||
return .missingPolicy
|
||||
}
|
||||
@ -43,6 +54,17 @@ struct PolicyRuntime: @unchecked Sendable {
|
||||
return isAllowed ? .allow : .deny
|
||||
}
|
||||
|
||||
private func isExposedService(ipPacket: IPPacketView) -> Bool {
|
||||
switch ipPacket.transportPacket {
|
||||
case .tcp(_, let dstPort, _):
|
||||
return ipPacket.header.proto == TransportProtocol.tcp.rawValue && self.acl.tcpPorts.contains(dstPort)
|
||||
case .udp(_, let dstPort, _):
|
||||
return ipPacket.header.proto == TransportProtocol.udp.rawValue && self.acl.udpPorts.contains(dstPort)
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
private func isAllowedByRule(ruleMap: PolicyRuleMap, ipPacket: IPPacketView) -> Bool {
|
||||
let proto = ipPacket.header.proto
|
||||
|
||||
|
||||
@ -16,9 +16,11 @@ actor PolicyService {
|
||||
|
||||
// 当前节点的identityId值
|
||||
let identityId: UInt32
|
||||
private let acl: SDLConfiguration.ACL
|
||||
|
||||
init(identityId: UInt32) {
|
||||
init(identityId: UInt32, acl: SDLConfiguration.ACL) {
|
||||
self.identityId = identityId
|
||||
self.acl = acl
|
||||
// 权限控制
|
||||
let snapshotPublisher = SnapshotPublisher(initial: PolicyRuleSnapshot.empty())
|
||||
self.policyRuleStore = PolicyRuleStore(publisher: snapshotPublisher)
|
||||
@ -26,7 +28,7 @@ actor PolicyService {
|
||||
}
|
||||
|
||||
nonisolated func policyRuntime() -> PolicyRuntime {
|
||||
return PolicyRuntime(policyRuleSnapshot: self.snapshotPublisher.current(), flowSessionTable: self.flowSessionTable)
|
||||
return PolicyRuntime(policyRuleSnapshot: self.snapshotPublisher.current(), flowSessionTable: self.flowSessionTable, acl: self.acl)
|
||||
}
|
||||
|
||||
nonisolated func recordOutboundFlow(ipPacket: IPPacketView) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user