mirror of
https://github.com/apernet/OpenGFW.git
synced 2024-11-14 22:39:26 +08:00
109 lines
2.6 KiB
Go
109 lines
2.6 KiB
Go
package ruleset
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"strconv"
|
|
|
|
"github.com/apernet/OpenGFW/analyzer"
|
|
"github.com/apernet/OpenGFW/modifier"
|
|
"github.com/apernet/OpenGFW/ruleset/builtins/geo"
|
|
)
|
|
|
|
type Action int
|
|
|
|
const (
|
|
// ActionMaybe indicates that the ruleset hasn't seen anything worth blocking based on
|
|
// current information, but that may change if volatile fields change in the future.
|
|
ActionMaybe Action = iota
|
|
// ActionAllow indicates that the stream should be allowed regardless of future changes.
|
|
ActionAllow
|
|
// ActionBlock indicates that the stream should be blocked.
|
|
ActionBlock
|
|
// ActionDrop indicates that the current packet should be dropped,
|
|
// but the stream should be allowed to continue.
|
|
// Only valid for UDP streams. Equivalent to ActionBlock for TCP streams.
|
|
ActionDrop
|
|
// ActionModify indicates that the current packet should be modified,
|
|
// and the stream should be allowed to continue.
|
|
// Only valid for UDP streams. Equivalent to ActionMaybe for TCP streams.
|
|
ActionModify
|
|
)
|
|
|
|
func (a Action) String() string {
|
|
switch a {
|
|
case ActionMaybe:
|
|
return "maybe"
|
|
case ActionAllow:
|
|
return "allow"
|
|
case ActionBlock:
|
|
return "block"
|
|
case ActionDrop:
|
|
return "drop"
|
|
case ActionModify:
|
|
return "modify"
|
|
default:
|
|
return "unknown"
|
|
}
|
|
}
|
|
|
|
type Protocol int
|
|
|
|
func (p Protocol) String() string {
|
|
switch p {
|
|
case ProtocolTCP:
|
|
return "tcp"
|
|
case ProtocolUDP:
|
|
return "udp"
|
|
default:
|
|
return "unknown"
|
|
}
|
|
}
|
|
|
|
const (
|
|
ProtocolTCP Protocol = iota
|
|
ProtocolUDP
|
|
)
|
|
|
|
type StreamInfo struct {
|
|
ID int64
|
|
Protocol Protocol
|
|
SrcIP, DstIP net.IP
|
|
SrcPort, DstPort uint16
|
|
Props analyzer.CombinedPropMap
|
|
}
|
|
|
|
func (i StreamInfo) SrcString() string {
|
|
return net.JoinHostPort(i.SrcIP.String(), strconv.Itoa(int(i.SrcPort)))
|
|
}
|
|
|
|
func (i StreamInfo) DstString() string {
|
|
return net.JoinHostPort(i.DstIP.String(), strconv.Itoa(int(i.DstPort)))
|
|
}
|
|
|
|
type MatchResult struct {
|
|
Action Action
|
|
ModInstance modifier.Instance
|
|
}
|
|
|
|
type Ruleset interface {
|
|
// Analyzers returns the list of analyzers to use for a stream.
|
|
// It must be safe for concurrent use by multiple workers.
|
|
Analyzers(StreamInfo) []analyzer.Analyzer
|
|
// Match matches a stream against the ruleset and returns the result.
|
|
// It must be safe for concurrent use by multiple workers.
|
|
Match(StreamInfo) MatchResult
|
|
}
|
|
|
|
// Logger is the logging interface for the ruleset.
|
|
type Logger interface {
|
|
Log(info StreamInfo, name string)
|
|
MatchError(info StreamInfo, name string, err error)
|
|
}
|
|
|
|
type BuiltinConfig struct {
|
|
Logger Logger
|
|
GeoMatcher *geo.GeoMatcher
|
|
ProtectedDialContext func(ctx context.Context, network, address string) (net.Conn, error)
|
|
}
|