mirror of
https://github.com/fosrl/newt.git
synced 2026-03-05 02:06:44 +00:00
Add rewriteTo
This commit is contained in:
@@ -37,6 +37,7 @@ type WgConfig struct {
|
|||||||
type Target struct {
|
type Target struct {
|
||||||
SourcePrefix string `json:"sourcePrefix"`
|
SourcePrefix string `json:"sourcePrefix"`
|
||||||
DestPrefix string `json:"destPrefix"`
|
DestPrefix string `json:"destPrefix"`
|
||||||
|
RewriteTo string `json:"rewriteTo,omitempty"`
|
||||||
PortRange []PortRange `json:"portRange,omitempty"`
|
PortRange []PortRange `json:"portRange,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -472,6 +473,15 @@ func (s *WireGuardService) ensureTargets(targets []Target) error {
|
|||||||
return fmt.Errorf("invalid CIDR %s: %v", target.DestPrefix, err)
|
return fmt.Errorf("invalid CIDR %s: %v", target.DestPrefix, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var rewriteTo netip.Prefix
|
||||||
|
if target.RewriteTo != "" {
|
||||||
|
rewriteTo, err = netip.ParsePrefix(target.RewriteTo)
|
||||||
|
if err != nil {
|
||||||
|
logger.Info("Invalid CIDR %s: %v", target.RewriteTo, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var portRanges []netstack2.PortRange
|
var portRanges []netstack2.PortRange
|
||||||
for _, pr := range target.PortRange {
|
for _, pr := range target.PortRange {
|
||||||
portRanges = append(portRanges, netstack2.PortRange{
|
portRanges = append(portRanges, netstack2.PortRange{
|
||||||
@@ -480,7 +490,7 @@ func (s *WireGuardService) ensureTargets(targets []Target) error {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
s.tnet.AddProxySubnetRule(sourcePrefix, destPrefix, portRanges)
|
s.tnet.AddProxySubnetRule(sourcePrefix, destPrefix, rewriteTo, portRanges)
|
||||||
|
|
||||||
logger.Info("Added target subnet from %s to %s with port ranges: %v", target.SourcePrefix, target.DestPrefix, target.PortRange)
|
logger.Info("Added target subnet from %s to %s with port ranges: %v", target.SourcePrefix, target.DestPrefix, target.PortRange)
|
||||||
}
|
}
|
||||||
@@ -864,6 +874,15 @@ func (s *WireGuardService) handleAddTarget(msg websocket.WSMessage) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var rewriteTo netip.Prefix
|
||||||
|
if target.RewriteTo != "" {
|
||||||
|
rewriteTo, err = netip.ParsePrefix(target.RewriteTo)
|
||||||
|
if err != nil {
|
||||||
|
logger.Info("Invalid CIDR %s: %v", target.RewriteTo, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var portRanges []netstack2.PortRange
|
var portRanges []netstack2.PortRange
|
||||||
for _, pr := range target.PortRange {
|
for _, pr := range target.PortRange {
|
||||||
portRanges = append(portRanges, netstack2.PortRange{
|
portRanges = append(portRanges, netstack2.PortRange{
|
||||||
@@ -872,7 +891,7 @@ func (s *WireGuardService) handleAddTarget(msg websocket.WSMessage) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
s.tnet.AddProxySubnetRule(sourcePrefix, destPrefix, portRanges)
|
s.tnet.AddProxySubnetRule(sourcePrefix, destPrefix, rewriteTo, portRanges)
|
||||||
|
|
||||||
logger.Info("Added target subnet from %s to %s with port ranges: %v", target.SourcePrefix, target.DestPrefix, target.PortRange)
|
logger.Info("Added target subnet from %s to %s with port ranges: %v", target.SourcePrefix, target.DestPrefix, target.PortRange)
|
||||||
}
|
}
|
||||||
@@ -979,6 +998,15 @@ func (s *WireGuardService) handleUpdateTarget(msg websocket.WSMessage) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var rewriteTo netip.Prefix
|
||||||
|
if target.RewriteTo != "" {
|
||||||
|
rewriteTo, err = netip.ParsePrefix(target.RewriteTo)
|
||||||
|
if err != nil {
|
||||||
|
logger.Info("Invalid CIDR %s: %v", target.RewriteTo, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var portRanges []netstack2.PortRange
|
var portRanges []netstack2.PortRange
|
||||||
for _, pr := range target.PortRange {
|
for _, pr := range target.PortRange {
|
||||||
portRanges = append(portRanges, netstack2.PortRange{
|
portRanges = append(portRanges, netstack2.PortRange{
|
||||||
@@ -987,7 +1015,7 @@ func (s *WireGuardService) handleUpdateTarget(msg websocket.WSMessage) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
s.tnet.AddProxySubnetRule(sourcePrefix, destPrefix, portRanges)
|
s.tnet.AddProxySubnetRule(sourcePrefix, destPrefix, rewriteTo, portRanges)
|
||||||
logger.Info("Added target subnet from %s to %s with port ranges: %v", target.SourcePrefix, target.DestPrefix, target.PortRange)
|
logger.Info("Added target subnet from %s to %s with port ranges: %v", target.SourcePrefix, target.DestPrefix, target.PortRange)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ type PortRange struct {
|
|||||||
type SubnetRule struct {
|
type SubnetRule struct {
|
||||||
SourcePrefix netip.Prefix // Source IP prefix (who is sending)
|
SourcePrefix netip.Prefix // Source IP prefix (who is sending)
|
||||||
DestPrefix netip.Prefix // Destination IP prefix (where it's going)
|
DestPrefix netip.Prefix // Destination IP prefix (where it's going)
|
||||||
|
RewriteTo netip.Prefix // Optional rewrite address for destination
|
||||||
PortRanges []PortRange // empty slice means all ports allowed
|
PortRanges []PortRange // empty slice means all ports allowed
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,7 +52,7 @@ func NewSubnetLookup() *SubnetLookup {
|
|||||||
|
|
||||||
// AddSubnet adds a subnet rule with source and destination prefixes and optional port restrictions
|
// AddSubnet adds a subnet rule with source and destination prefixes and optional port restrictions
|
||||||
// If portRanges is nil or empty, all ports are allowed for this subnet
|
// If portRanges is nil or empty, all ports are allowed for this subnet
|
||||||
func (sl *SubnetLookup) AddSubnet(sourcePrefix, destPrefix netip.Prefix, portRanges []PortRange) {
|
func (sl *SubnetLookup) AddSubnet(sourcePrefix, destPrefix, rewriteTo netip.Prefix, portRanges []PortRange) {
|
||||||
sl.mu.Lock()
|
sl.mu.Lock()
|
||||||
defer sl.mu.Unlock()
|
defer sl.mu.Unlock()
|
||||||
|
|
||||||
@@ -63,6 +64,7 @@ func (sl *SubnetLookup) AddSubnet(sourcePrefix, destPrefix netip.Prefix, portRan
|
|||||||
sl.rules[key] = &SubnetRule{
|
sl.rules[key] = &SubnetRule{
|
||||||
SourcePrefix: sourcePrefix,
|
SourcePrefix: sourcePrefix,
|
||||||
DestPrefix: destPrefix,
|
DestPrefix: destPrefix,
|
||||||
|
RewriteTo: rewriteTo,
|
||||||
PortRanges: portRanges,
|
PortRanges: portRanges,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -200,11 +202,11 @@ func NewProxyHandler(options ProxyHandlerOptions) (*ProxyHandler, error) {
|
|||||||
// sourcePrefix: The IP prefix of the peer sending the data
|
// sourcePrefix: The IP prefix of the peer sending the data
|
||||||
// destPrefix: The IP prefix of the destination
|
// destPrefix: The IP prefix of the destination
|
||||||
// If portRanges is nil or empty, all ports are allowed for this subnet
|
// If portRanges is nil or empty, all ports are allowed for this subnet
|
||||||
func (p *ProxyHandler) AddSubnetRule(sourcePrefix, destPrefix netip.Prefix, portRanges []PortRange) {
|
func (p *ProxyHandler) AddSubnetRule(sourcePrefix, destPrefix, rewriteTo netip.Prefix, portRanges []PortRange) {
|
||||||
if p == nil || !p.enabled {
|
if p == nil || !p.enabled {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
p.subnetLookup.AddSubnet(sourcePrefix, destPrefix, portRanges)
|
p.subnetLookup.AddSubnet(sourcePrefix, destPrefix, rewriteTo, portRanges)
|
||||||
}
|
}
|
||||||
|
|
||||||
// RemoveSubnetRule removes a subnet from the proxy handler
|
// RemoveSubnetRule removes a subnet from the proxy handler
|
||||||
|
|||||||
@@ -350,10 +350,10 @@ func (net *Net) ListenUDP(laddr *net.UDPAddr) (*gonet.UDPConn, error) {
|
|||||||
|
|
||||||
// AddProxySubnetRule adds a subnet rule to the proxy handler
|
// AddProxySubnetRule adds a subnet rule to the proxy handler
|
||||||
// If portRanges is nil or empty, all ports are allowed for this subnet
|
// If portRanges is nil or empty, all ports are allowed for this subnet
|
||||||
func (net *Net) AddProxySubnetRule(sourcePrefix, destPrefix netip.Prefix, portRanges []PortRange) {
|
func (net *Net) AddProxySubnetRule(sourcePrefix, destPrefix, rewriteTo netip.Prefix, portRanges []PortRange) {
|
||||||
tun := (*netTun)(net)
|
tun := (*netTun)(net)
|
||||||
if tun.proxyHandler != nil {
|
if tun.proxyHandler != nil {
|
||||||
tun.proxyHandler.AddSubnetRule(sourcePrefix, destPrefix, portRanges)
|
tun.proxyHandler.AddSubnetRule(sourcePrefix, destPrefix, rewriteTo, portRanges)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user