Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add IPv6 listener config option #1300

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions pkg/config/configmap.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ const (
// enableCryptoMB is the config map for enabling CryptoMB private key provider.
enableCryptoMB = "enable-cryptomb"

// enableIPv6Listeners is the config map for enabling listeners on IPv6.
enableIPv6Listeners = "enable-ipv6-listeners"

// TracingCollectorFullEndpoint is the config map key to configure tracing at kourier gateway level
TracingCollectorFullEndpoint = "tracing-collector-full-endpoint"
)
Expand All @@ -63,6 +66,7 @@ func DefaultConfig() *Kourier {
TrustedHopsCount: 0,
CipherSuites: nil,
EnableCryptoMB: false,
EnableIPv6Listeners: false,
UseRemoteAddress: false,
}
}
Expand All @@ -80,6 +84,7 @@ func NewConfigFromMap(configMap map[string]string) (*Kourier, error) {
cm.AsBool(useRemoteAddress, &nc.UseRemoteAddress),
cm.AsStringSet(cipherSuites, &nc.CipherSuites),
cm.AsBool(enableCryptoMB, &nc.EnableCryptoMB),
cm.AsBool(enableIPv6Listeners, &nc.EnableIPv6Listeners),
asTracing(TracingCollectorFullEndpoint, &nc.Tracing),
); err != nil {
return nil, err
Expand Down Expand Up @@ -157,6 +162,8 @@ type Kourier struct {
// EnableCryptoMB specifies whether Kourier enable CryptoMB private provider to accelerate
// TLS handshake. The default value is "false".
EnableCryptoMB bool
// Create Listeners on ipv6.
EnableIPv6Listeners bool
// CipherSuites specifies the cipher suites for TLS external listener.
CipherSuites sets.Set[string]
// Tracing specifies the configuration for gateway tracing
Expand Down
20 changes: 13 additions & 7 deletions pkg/envoy/api/listener.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ type SNIMatch struct {
}

// NewHTTPListener creates a new Listener at the given port, backed by the given manager.
func NewHTTPListener(manager *hcm.HttpConnectionManager, port uint32, enableProxyProtocol bool) (*listener.Listener, error) {
func NewHTTPListener(manager *hcm.HttpConnectionManager, port uint32, enableProxyProtocol bool, enableIPv6Listeners bool) (*listener.Listener, error) {
filters, err := createFilters(manager)
if err != nil {
return nil, err
Expand All @@ -65,7 +65,7 @@ func NewHTTPListener(manager *hcm.HttpConnectionManager, port uint32, enableProx

return &listener.Listener{
Name: CreateListenerName(port),
Address: createAddress(port),
Address: createAddress(port, enableIPv6Listeners),
ListenerFilters: listenerFilter,
FilterChains: []*listener.FilterChain{{
Filters: filters,
Expand All @@ -74,7 +74,7 @@ func NewHTTPListener(manager *hcm.HttpConnectionManager, port uint32, enableProx
}

// NewHTTPSListener creates a new Listener at the given port with a given filter chain
func NewHTTPSListener(port uint32, filterChain []*listener.FilterChain, enableProxyProtocol bool) (*listener.Listener, error) {
func NewHTTPSListener(port uint32, filterChain []*listener.FilterChain, enableProxyProtocol bool, enableIPv6Listeners bool) (*listener.Listener, error) {
var listenerFilter []*listener.ListenerFilter
if enableProxyProtocol {
proxyProtocolListenerFilter, err := createProxyProtocolListenerFilter()
Expand All @@ -86,7 +86,7 @@ func NewHTTPSListener(port uint32, filterChain []*listener.FilterChain, enablePr

return &listener.Listener{
Name: CreateListenerName(port),
Address: createAddress(port),
Address: createAddress(port, enableIPv6Listeners),
ListenerFilters: listenerFilter,
FilterChains: filterChain,
}, nil
Expand Down Expand Up @@ -159,7 +159,7 @@ func NewHTTPSListenerWithSNI(manager *hcm.HttpConnectionManager, port uint32, sn

return &listener.Listener{
Name: CreateListenerName(port),
Address: createAddress(port),
Address: createAddress(port, kourierConfig.EnableIPv6Listeners),
FilterChains: filterChains,
ListenerFilters: listenerFilter,
}, nil
Expand All @@ -170,12 +170,18 @@ func CreateListenerName(port uint32) string {
return fmt.Sprintf("listener_%d", port)
}

func createAddress(port uint32) *core.Address {
func createAddress(port uint32, ipv6 bool) *core.Address {
var address string
if ipv6 {
address = "::"
} else {
address = "0.0.0.0"
}
return &core.Address{
Address: &core.Address_SocketAddress{
SocketAddress: &core.SocketAddress{
Protocol: core.SocketAddress_TCP,
Address: "0.0.0.0",
Address: address,
PortSpecifier: &core.SocketAddress_PortValue{
PortValue: port,
},
Expand Down
28 changes: 23 additions & 5 deletions pkg/envoy/api/listener_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ func TestNewHTTPListener(t *testing.T) {
}
manager := NewHTTPConnectionManager("test", &kourierConfig)

l, err := NewHTTPListener(manager, 8080, false)
l, err := NewHTTPListener(manager, 8080, false, false)
assert.NilError(t, err)

assert.Equal(t, core.SocketAddress_TCP, l.Address.GetSocketAddress().Protocol)
Expand All @@ -66,7 +66,7 @@ func TestNewHTTPListenerWithProxyProtocol(t *testing.T) {
}
manager := NewHTTPConnectionManager("test", &kourierConfig)

l, err := NewHTTPListener(manager, 8080, true)
l, err := NewHTTPListener(manager, 8080, true, false)
assert.NilError(t, err)

assert.Equal(t, core.SocketAddress_TCP, l.Address.GetSocketAddress().Protocol)
Expand All @@ -78,6 +78,24 @@ func TestNewHTTPListenerWithProxyProtocol(t *testing.T) {
assertListenerHasProxyProtocolConfigured(t, l.ListenerFilters[0])
}

func TestNewHTTPListenerWithIPv6(t *testing.T) {
kourierConfig := config.Kourier{
EnableIPv6Listeners: true,
IdleTimeout: 0 * time.Second,
}
manager := NewHTTPConnectionManager("test", &kourierConfig)

l, err := NewHTTPListener(manager, 8080, false, true)
assert.NilError(t, err)

assert.Equal(t, core.SocketAddress_TCP, l.Address.GetSocketAddress().Protocol)
assert.Equal(t, uint32(8080), l.Address.GetSocketAddress().GetPortValue())
assert.Assert(t, is.Nil(l.FilterChains[0].TransportSocket)) // TLS not configured

// Check if listening on ipv6
assert.Equal(t, "::", l.Address.GetSocketAddress().Address)
}

var c = Certificate{
Certificate: []byte("some_certificate_chain"),
PrivateKey: []byte("some_private_key"),
Expand All @@ -101,7 +119,7 @@ func TestNewHTTPSListener(t *testing.T) {
filterChain, err := CreateFilterChainFromCertificateAndPrivateKey(manager, &c)
assert.NilError(t, err)

l, err := NewHTTPSListener(8081, []*envoy_api_v3.FilterChain{filterChain}, false)
l, err := NewHTTPSListener(8081, []*envoy_api_v3.FilterChain{filterChain}, false, false)
assert.NilError(t, err)

assert.Equal(t, core.SocketAddress_TCP, l.Address.GetSocketAddress().Protocol)
Expand Down Expand Up @@ -141,7 +159,7 @@ func TestNewHTTPSListenerWithPrivatekeyProvider(t *testing.T) {
filterChain, err := CreateFilterChainFromCertificateAndPrivateKey(manager, &crypto)
assert.NilError(t, err)

l, err := NewHTTPSListener(8081, []*envoy_api_v3.FilterChain{filterChain}, false)
l, err := NewHTTPSListener(8081, []*envoy_api_v3.FilterChain{filterChain}, false, false)
assert.NilError(t, err)

assert.Equal(t, core.SocketAddress_TCP, l.Address.GetSocketAddress().Protocol)
Expand Down Expand Up @@ -205,7 +223,7 @@ func TestNewHTTPSListenerWithProxyProtocol(t *testing.T) {
filterChain, err := CreateFilterChainFromCertificateAndPrivateKey(manager, &c)
assert.NilError(t, err)

l, err := NewHTTPSListener(8081, []*envoy_api_v3.FilterChain{filterChain}, true)
l, err := NewHTTPSListener(8081, []*envoy_api_v3.FilterChain{filterChain}, true, false)
assert.NilError(t, err)

assert.Equal(t, core.SocketAddress_TCP, l.Address.GetSocketAddress().Protocol)
Expand Down
12 changes: 6 additions & 6 deletions pkg/generator/caches.go
Original file line number Diff line number Diff line change
Expand Up @@ -240,11 +240,11 @@ func generateListenersAndRouteConfigsAndClusters(
externalTLSManager := envoy.NewHTTPConnectionManager(externalTLSRouteConfig.Name, cfg.Kourier)
localManager := envoy.NewHTTPConnectionManager(localRouteConfig.Name, cfg.Kourier)

externalHTTPEnvoyListener, err := envoy.NewHTTPListener(externalManager, config.HTTPPortExternal, cfg.Kourier.EnableProxyProtocol)
externalHTTPEnvoyListener, err := envoy.NewHTTPListener(externalManager, config.HTTPPortExternal, cfg.Kourier.EnableProxyProtocol, cfg.Kourier.EnableIPv6Listeners)
if err != nil {
return nil, nil, nil, err
}
localEnvoyListener, err := envoy.NewHTTPListener(localManager, config.HTTPPortLocal, false)
localEnvoyListener, err := envoy.NewHTTPListener(localManager, config.HTTPPortLocal, false, cfg.Kourier.EnableIPv6Listeners)
if err != nil {
return nil, nil, nil, err
}
Expand All @@ -254,7 +254,7 @@ func generateListenersAndRouteConfigsAndClusters(
clusters := make([]cachetypes.Resource, 0, 1)

// create probe listeners
probHTTPListener, err := envoy.NewHTTPListener(externalManager, config.HTTPPortProb, false)
probHTTPListener, err := envoy.NewHTTPListener(externalManager, config.HTTPPortProb, false, cfg.Kourier.EnableIPv6Listeners)
if err != nil {
return nil, nil, nil, err
}
Expand Down Expand Up @@ -372,7 +372,7 @@ func generateListenersAndRouteConfigsAndClusters(
}

// create https prob listener
probHTTPSListener, err := envoy.NewHTTPSListener(config.HTTPSPortProb, externalHTTPSEnvoyListener.FilterChains, false)
probHTTPSListener, err := envoy.NewHTTPSListener(config.HTTPSPortProb, externalHTTPSEnvoyListener.FilterChains, false, cfg.Kourier.EnableIPv6Listeners)
if err != nil {
return nil, nil, nil, err
}
Expand Down Expand Up @@ -454,7 +454,7 @@ func newExternalEnvoyListenerWithOneCert(ctx context.Context, manager *httpconnm
return nil, err
}

return envoy.NewHTTPSListener(config.HTTPSPortExternal, []*v3.FilterChain{filterChain}, cfg.EnableProxyProtocol)
return envoy.NewHTTPSListener(config.HTTPSPortExternal, []*v3.FilterChain{filterChain}, cfg.EnableProxyProtocol, cfg.EnableIPv6Listeners)
}

func newLocalEnvoyListenerWithOneCertFilterChain(ctx context.Context, manager *httpconnmanagerv3.HttpConnectionManager, kubeClient kubeclient.Interface, cfg *config.Kourier) (*v3.FilterChain, error) {
Expand All @@ -475,7 +475,7 @@ func newLocalEnvoyListenerWithOneCert(ctx context.Context, manager *httpconnmana
if err != nil {
return nil, err
}
return envoy.NewHTTPSListener(config.HTTPSPortLocal, []*v3.FilterChain{filterChain}, cfg.EnableProxyProtocol)
return envoy.NewHTTPSListener(config.HTTPSPortLocal, []*v3.FilterChain{filterChain}, cfg.EnableProxyProtocol, cfg.EnableIPv6Listeners)
}

func privateKeyProvider(mbEnabled bool) string {
Expand Down