Skip to content

Commit ba3d1f5

Browse files
(configurable VIP) added new config to configure virtual ip CIDRs in t-proxy
1 parent 1d9f57b commit ba3d1f5

File tree

12 files changed

+254
-25
lines changed

12 files changed

+254
-25
lines changed

.changelog/23085.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:improvement
2+
connect: added ability to configure Virtual IP range for t-proxy with CIDRs
3+
```

agent/agent.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1564,6 +1564,8 @@ func newConsulConfig(runtimeCfg *config.RuntimeConfig, logger hclog.Logger) (*co
15641564

15651565
cfg.CAConfig = ca
15661566
}
1567+
cfg.ConnectVirtualIPCIDR = runtimeCfg.ConnectVirtualIPCIDR
1568+
cfg.ConnectVirtualIPCIDRv6 = runtimeCfg.ConnectVirtualIPCIDRv6
15671569

15681570
// copy over auto runtimeCfg settings
15691571
cfg.AutoConfigEnabled = runtimeCfg.AutoConfig.Enabled

agent/config/builder.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
"github.com/hashicorp/consul/agent/consul"
3737
"github.com/hashicorp/consul/agent/consul/authmethod/ssoauth"
3838
consulrate "github.com/hashicorp/consul/agent/consul/rate"
39+
"github.com/hashicorp/consul/agent/consul/state"
3940
hcpconfig "github.com/hashicorp/consul/agent/hcp/config"
4041
"github.com/hashicorp/consul/agent/rpc/middleware"
4142
"github.com/hashicorp/consul/agent/structs"
@@ -691,6 +692,17 @@ func (b *builder) build() (rt RuntimeConfig, err error) {
691692
connectEnabled := boolVal(c.Connect.Enabled)
692693
connectCAProvider := stringVal(c.Connect.CAProvider)
693694
connectCAConfig := c.Connect.CAConfig
695+
connectVirtualIPCIDR := state.DefaultVirtualIPv4CIDR
696+
if c.Connect.VirtualIPCIDR != nil && *c.Connect.VirtualIPCIDR != "" {
697+
connectVirtualIPCIDR = *c.Connect.VirtualIPCIDR
698+
}
699+
connectVirtualIPCIDRv6 := state.DefaultVirtualIPv6CIDR
700+
if c.Connect.VirtualIPCIDRv6 != nil && *c.Connect.VirtualIPCIDRv6 != "" {
701+
connectVirtualIPCIDRv6 = *c.Connect.VirtualIPCIDRv6
702+
}
703+
if err := state.ValidateVirtualIPCIDRs(connectVirtualIPCIDR, connectVirtualIPCIDRv6); err != nil {
704+
return RuntimeConfig{}, err
705+
}
694706

695707
// autoEncrypt and autoConfig implicitly turns on connect which is why
696708
// they need to be above other settings that rely on connect.
@@ -999,6 +1011,8 @@ func (b *builder) build() (rt RuntimeConfig, err error) {
9991011
ConnectMeshGatewayWANFederationEnabled: connectMeshGatewayWANFederationEnabled,
10001012
ConnectSidecarMinPort: sidecarMinPort,
10011013
ConnectSidecarMaxPort: sidecarMaxPort,
1014+
ConnectVirtualIPCIDR: connectVirtualIPCIDR,
1015+
ConnectVirtualIPCIDRv6: connectVirtualIPCIDRv6,
10021016
ConnectTestCALeafRootChangeSpread: b.durationVal("connect.test_ca_leaf_root_change_spread", c.Connect.TestCALeafRootChangeSpread),
10031017
ExposeMinPort: exposeMinPort,
10041018
ExposeMaxPort: exposeMaxPort,

agent/config/config.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -642,6 +642,8 @@ type Connect struct {
642642
CAProvider *string `mapstructure:"ca_provider" json:"ca_provider,omitempty"`
643643
CAConfig map[string]interface{} `mapstructure:"ca_config" json:"ca_config,omitempty"`
644644
MeshGatewayWANFederationEnabled *bool `mapstructure:"enable_mesh_gateway_wan_federation" json:"enable_mesh_gateway_wan_federation,omitempty"`
645+
VirtualIPCIDR *string `mapstructure:"virtual_ip_cidr" json:"virtual_ip_cidr,omitempty"`
646+
VirtualIPCIDRv6 *string `mapstructure:"virtual_ip_cidr_v6" json:"virtual_ip_cidr_v6,omitempty"`
645647

646648
// TestCALeafRootChangeSpread controls how long after a CA roots change before new leaf certs will be generated.
647649
// This is only tuned in tests, generally set to 1ns to make tests deterministic with when to expect updated leaf

agent/config/runtime.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,12 @@ type RuntimeConfig struct {
526526
// datacenters should exclusively traverse mesh gateways.
527527
ConnectMeshGatewayWANFederationEnabled bool
528528

529+
// ConnectVirtualIPCIDR defines the IPv4 CIDR block used for automatic virtual IPs.
530+
ConnectVirtualIPCIDR string
531+
532+
// ConnectVirtualIPCIDRv6 defines the IPv6 CIDR block used for automatic virtual IPs.
533+
ConnectVirtualIPCIDRv6 string
534+
529535
// ConnectTestCALeafRootChangeSpread is used to control how long the CA leaf
530536
// cache with spread CSRs over when a root change occurs. For now we don't
531537
// expose this in public config intentionally but could later with a rename.

agent/config/runtime_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6674,6 +6674,8 @@ func TestLoad_FullConfig(t *testing.T) {
66746674
"CSRMaxPerSecond": float64(100),
66756675
"CSRMaxConcurrent": float64(2),
66766676
},
6677+
ConnectVirtualIPCIDR: "240.0.0.0/4",
6678+
ConnectVirtualIPCIDRv6: "2000::/3",
66776679
ConnectMeshGatewayWANFederationEnabled: false,
66786680
Cloud: hcpconfig.CloudConfig{
66796681
ResourceID: "N43DsscE",

agent/config/testdata/TestRuntimeConfig_Sanitize.golden

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@
149149
"ConnectSidecarMaxPort": 0,
150150
"ConnectSidecarMinPort": 0,
151151
"ConnectTestCALeafRootChangeSpread": "0s",
152+
"ConnectVirtualIPCIDR": "",
153+
"ConnectVirtualIPCIDRv6": "",
152154
"ConsulCoordinateUpdateBatchSize": 0,
153155
"ConsulCoordinateUpdateMaxBatches": 0,
154156
"ConsulCoordinateUpdatePeriod": "15s",

agent/consul/config.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,12 @@ type Config struct {
415415
// datacenters should exclusively traverse mesh gateways.
416416
ConnectMeshGatewayWANFederationEnabled bool
417417

418+
// ConnectVirtualIPCIDR defines the IPv4 CIDR block used for auto-allocated virtual IPs.
419+
ConnectVirtualIPCIDR string
420+
421+
// ConnectVirtualIPCIDRv6 defines the IPv6 CIDR block used for auto-allocated virtual IPs.
422+
ConnectVirtualIPCIDRv6 string
423+
418424
// DefaultIntentionPolicy is used to define a default intention action for all
419425
// sources and destinations. Possible values are "allow", "deny", or "" (blank).
420426
// For compatibility, falls back to ACLResolverSettings.ACLDefaultPolicy (which

agent/consul/server.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,9 @@ func NewServer(config *Config, flat Deps, externalGRPCServer *grpc.Server,
484484
if err := config.CheckEnumStrings(); err != nil {
485485
return nil, err
486486
}
487+
if err := state.SetVirtualIPConfig(config.ConnectVirtualIPCIDR, config.ConnectVirtualIPCIDRv6); err != nil {
488+
return nil, fmt.Errorf("failed to configure virtual IP ranges: %w", err)
489+
}
487490

488491
// Create the tombstone GC.
489492
gc, err := state.NewTombstoneGC(config.TombstoneTTL, config.TombstoneTTLGranularity)

agent/consul/state/catalog.go

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -42,26 +42,6 @@ const (
4242
)
4343

4444
var (
45-
// startingVirtualIP is the start of the virtual IP range we assign to services.
46-
// The effective CIDR range is startingVirtualIP to (startingVirtualIP + virtualIPMaxOffset).
47-
startingVirtualIP = net.IP{240, 0, 0, 0}
48-
49-
virtualIPMaxOffset = net.IP{15, 255, 255, 254}
50-
51-
startingVirtualIPv6 = net.IP{
52-
0x20, 0x00, 0x00, 0x00,
53-
0x00, 0x00, 0x00, 0x00,
54-
0x00, 0x00, 0x00, 0x00,
55-
0x00, 0x00, 0x00, 0x00,
56-
}
57-
58-
virtualIPv6MaxOffset = net.IP{
59-
0x1F, 0xFF, 0xFF, 0xFF,
60-
0xFF, 0xFF, 0xFF, 0xFF,
61-
0xFF, 0xFF, 0xFF, 0xFF,
62-
0xFF, 0xFF, 0xFF, 0xFF,
63-
}
64-
6545
ErrNodeNotFound = errors.New("node not found")
6646
)
6747

@@ -1074,9 +1054,10 @@ func assignServiceVirtualIP(tx WriteTxn, idx uint64, psn structs.PeeredServiceNa
10741054
break
10751055
}
10761056
}
1077-
maxIPOffset := virtualIPMaxOffset
1078-
if p := net.ParseIP(newEntry.IP.String()); p == nil || p.To4() == nil {
1079-
maxIPOffset = virtualIPv6MaxOffset
1057+
cfg := currentVirtualIPConfig()
1058+
maxIPOffset := cfg.maxOffsetFor(newEntry.IP)
1059+
if maxIPOffset == nil {
1060+
return "", fmt.Errorf("failed to determine max virtual IP offset for %q", newEntry.IP.String())
10801061
}
10811062
// Out of virtual IPs, fail registration.
10821063
if newEntry.IP.Equal(maxIPOffset) {
@@ -1232,16 +1213,17 @@ func updateVirtualIPMaxIndexes(txn WriteTxn, idx uint64, partition, peerName str
12321213
func addIPOffset(b net.IP) (net.IP, error) {
12331214
var vip net.IP
12341215
var err error
1216+
cfg := currentVirtualIPConfig()
12351217

12361218
ds, err := netutil.IsDualStack(nil, true)
12371219
if err != nil {
12381220
return nil, fmt.Errorf("failed to determine if dual-stack mode is enabled: %w", err)
12391221
}
12401222

12411223
if ds {
1242-
vip, err = addIPv6Offset(startingVirtualIPv6, b)
1224+
vip, err = addIPv6Offset(cfg.startingIPv6, b)
12431225
} else {
1244-
vip, err = addIPv4Offset(startingVirtualIP, b)
1226+
vip, err = addIPv4Offset(cfg.startingIPv4, b)
12451227
}
12461228
return vip, err
12471229
}

0 commit comments

Comments
 (0)