Skip to content
Open
8 changes: 2 additions & 6 deletions api/v1/clusterwidenetworkpolicy_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ func validateIPBlocks(blocks []networking.IPBlock) error {
}

for _, e := range b.Except {
exceptIP, exceptNet, err := net.ParseCIDR(b.CIDR)
exceptIP, exceptNet, err := net.ParseCIDR(e)
if err != nil {
errs = append(errs, fmt.Errorf("%v is not a valid IP CIDR", e))
continue
Expand All @@ -280,14 +280,10 @@ func validateIPBlocks(blocks []networking.IPBlock) error {

blockSize, _ := blockNet.Mask.Size()
exceptSize, _ := exceptNet.Mask.Size()
if exceptSize > blockSize {
if exceptSize < blockSize {
errs = append(errs, fmt.Errorf("netmask size of network to be excluded must be smaller than netmask of the block CIDR"))
}
}
}
return errors.Join(errs...)
}

func init() {
SchemeBuilder.Register(&ClusterwideNetworkPolicy{}, &ClusterwideNetworkPolicyList{})
}
12 changes: 8 additions & 4 deletions api/v1/groupversion_info.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,28 @@
package v1

import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
runtime "k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
"sigs.k8s.io/controller-runtime/pkg/scheme"
)

var (
// GroupVersion is group version used to register these objects
GroupVersion = schema.GroupVersion{Group: "metal-stack.io", Version: "v1"}

// SchemeBuilder is used to add go types to the GroupVersionKind scheme
SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}
SchemeBuilder = runtime.NewSchemeBuilder(addKnownTypes)

// AddToScheme adds the types in this group-version to the given scheme.
AddToScheme = SchemeBuilder.AddToScheme
)

func init() {
SchemeBuilder.Register(
func addKnownTypes(scheme *runtime.Scheme) error {
scheme.AddKnownTypes(GroupVersion,
&ClusterwideNetworkPolicy{},
&ClusterwideNetworkPolicyList{},
)

metav1.AddToGroupVersion(scheme, GroupVersion)
return nil
}
2 changes: 1 addition & 1 deletion api/v1/zz_generated.deepcopy.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 13 additions & 2 deletions controllers/clusterwidenetworkpolicy_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import (

"go4.org/netipx"

apiv2 "github.com/metal-stack/api/go/metalstack/api/v2"
"github.com/metal-stack/firewall-controller/v2/pkg/dns"
"github.com/metal-stack/firewall-controller/v2/pkg/helper"
"github.com/metal-stack/firewall-controller/v2/pkg/nftables"
Expand Down Expand Up @@ -45,6 +46,9 @@ type ClusterwideNetworkPolicyReconciler struct {
Interval time.Duration
DnsProxy *dns.DNSProxy
SkipDNS bool

DefaultRouteIp string
MachineAllocation *apiv2.MachineAllocation
}

// SetupWithManager configures this controller to run in schedule
Expand Down Expand Up @@ -103,7 +107,7 @@ func (r *ClusterwideNetworkPolicyReconciler) Reconcile(ctx context.Context, _ ct
}
cwnps.Items = validCwnps

nftablesFirewall := nftables.NewFirewall(f, &cwnps, &services, r.DnsProxy, r.Log, r.Recorder)
nftablesFirewall := nftables.NewFirewall(f, &cwnps, &services, r.DnsProxy, r.Log, r.Recorder, r.MachineAllocation)
if err := r.manageDNSProxy(f, cwnps, nftablesFirewall); err != nil {
return ctrl.Result{}, err
}
Expand Down Expand Up @@ -142,7 +146,14 @@ func (r *ClusterwideNetworkPolicyReconciler) manageDNSProxy(

if enableDNS && r.DnsProxy == nil {
r.Log.Info("DNS Proxy is initialized")
if r.DnsProxy, err = dns.NewDNSProxy(r.Ctx, f.Spec.DNSServerAddress, f.Spec.DNSPort, r.ShootClient, ctrl.Log.WithName("DNS proxy")); err != nil {
dnsProxyConfig := &dns.DNSProxyConfig{
Log: ctrl.Log.WithName("DNS proxy"),
DNSServer: f.Spec.DNSServerAddress,
Port: f.Spec.DNSPort,
ShootClient: r.ShootClient,
BindAddress: r.DefaultRouteIp,
}
if r.DnsProxy, err = dns.NewDNSProxy(r.Ctx, dnsProxyConfig); err != nil {
return fmt.Errorf("failed to init DNS proxy: %w", err)
}
go r.DnsProxy.Run()
Expand Down
3 changes: 1 addition & 2 deletions controllers/droptailer_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@ type DroptailerReconciler struct {

HostsFile string

// FIXME is not filled properly
certificateBase string
oldPodIP string
hosts *txeh.Hosts
Expand Down Expand Up @@ -69,7 +68,7 @@ func (r *DroptailerReconciler) SetupWithManager(mgr ctrl.Manager) error {
r.hosts = hosts
certificateBase := os.Getenv("DROPTAILER_CLIENT_CERTIFICATE_BASE")

if certificateBase == "" {
if certificateBase != "" {
r.certificateBase = certificateBase
}

Expand Down
16 changes: 13 additions & 3 deletions controllers/firewall_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import (

"github.com/Masterminds/semver/v3"
"github.com/go-logr/logr"
apiv2 "github.com/metal-stack/api/go/metalstack/api/v2"
mn "github.com/metal-stack/metal-lib/pkg/net"
corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
Expand Down Expand Up @@ -52,7 +53,8 @@ type FirewallReconciler struct {

SeedUpdatedFunc func()

FrrVersion *semver.Version
FrrVersion *semver.Version
MachineAllocation *apiv2.MachineAllocation
}

const (
Expand Down Expand Up @@ -90,7 +92,14 @@ func (r *FirewallReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
if apierrors.IsNotFound(err) {
r.Log.Info("flushing k8s firewall rules")

defaultFw := nftables.NewFirewall(&firewallv2.Firewall{}, &firewallv1.ClusterwideNetworkPolicyList{}, &corev1.ServiceList{}, nil, logr.Discard(), r.Recorder)
defaultFw := nftables.NewFirewall(
&firewallv2.Firewall{},
&firewallv1.ClusterwideNetworkPolicyList{},
&corev1.ServiceList{},
nil, logr.Discard(),
r.Recorder,
r.MachineAllocation,
)

flushErr := defaultFw.Flush()
if flushErr != nil {
Expand Down Expand Up @@ -119,7 +128,8 @@ func (r *FirewallReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
r.Log.Info("reconciling network settings")

var errs []error
changed, err := network.ReconcileNetwork(f, r.FrrVersion)
nw := network.NewNetwork(r.Log, r.MachineAllocation)
changed, err := nw.ReconcileNetwork(f, r.FrrVersion)
if changed && err == nil {
r.recordFirewallEvent(f, corev1.EventTypeNormal, "Network settings", "reconciliation succeeded (frr.conf)")
} else if changed && err != nil {
Expand Down
76 changes: 40 additions & 36 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -10,41 +10,41 @@ require (
github.com/google/go-cmp v0.7.0
github.com/google/nftables v0.3.0
github.com/ks2211/go-suricata v0.0.0-20200823200910-986ce1470707
github.com/metal-stack/firewall-controller-manager v0.6.1
github.com/metal-stack/metal-go v0.45.0
github.com/metal-stack/api v0.8.1
github.com/metal-stack/firewall-controller-manager v0.6.2-0.20261008064416-b3a49d67b7bf
github.com/metal-stack/metal-lib v0.26.3
github.com/metal-stack/metal-networker v0.47.0
github.com/metal-stack/os-installer v0.3.1
github.com/metal-stack/v v1.0.3
github.com/miekg/dns v1.1.73
github.com/stretchr/testify v1.12.1
github.com/txn2/txeh v1.8.1
github.com/vishvananda/netlink v1.3.1
go4.org/netipx v0.0.0-20260823151212-3075585bcbeb
k8s.io/api v0.35.0
k8s.io/apiextensions-apiserver v0.35.0
k8s.io/apimachinery v0.35.0
k8s.io/client-go v0.35.0
sigs.k8s.io/controller-runtime v0.23.0
google.golang.org/protobuf v1.36.12
k8s.io/api v0.36.3
k8s.io/apiextensions-apiserver v0.36.3
k8s.io/apimachinery v0.36.3
k8s.io/client-go v0.36.3
sigs.k8s.io/controller-runtime v0.24.1
sigs.k8s.io/yaml v1.6.0
)

replace github.com/imdario/mergo => dario.cat/mergo v1.0.0

require (
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.12-20260825204119-511051f7f437.2 // indirect
dario.cat/mergo v1.0.2 // indirect
github.com/Masterminds/goutils v1.1.1 // indirect
github.com/Masterminds/sprig/v3 v3.3.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/emicklei/go-restful/v3 v3.13.0 // indirect
github.com/emicklei/go-restful/v3 v3.14.0 // indirect
github.com/evanphx/json-patch/v5 v5.9.11 // indirect
github.com/fsnotify/fsnotify v1.10.1 // indirect
github.com/fxamacker/cbor/v2 v2.9.6 // indirect
github.com/go-openapi/analysis v1.0.1 // indirect
github.com/go-openapi/errors v0.22.9 // indirect
github.com/go-openapi/jsonpointer v1.0.2 // indirect
github.com/go-openapi/jsonreference v1.0.3 // indirect
github.com/go-openapi/loads v0.25.3 // indirect
github.com/go-openapi/spec v1.0.1 // indirect
github.com/go-openapi/strfmt v0.27.3 // indirect
github.com/go-openapi/swag v0.29.2 // indirect
github.com/go-openapi/swag/cmdutils v0.29.2 // indirect
github.com/go-openapi/swag/conv v0.29.2 // indirect
Expand All @@ -57,50 +57,54 @@ require (
github.com/go-openapi/swag/stringutils v0.29.2 // indirect
github.com/go-openapi/swag/typeutils v0.29.2 // indirect
github.com/go-openapi/swag/yamlutils v0.29.2 // indirect
github.com/go-openapi/validate v1.0.0 // indirect
github.com/go-viper/mapstructure/v2 v2.5.0 // indirect
github.com/godbus/dbus/v5 v5.2.2 // indirect
github.com/google/btree v1.1.3 // indirect
github.com/godbus/dbus/v5 v5.2.4 // indirect
github.com/google/gnostic-models v0.7.1 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/huandu/xstrings v1.6.2 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/mattn/go-colorable v0.1.16 // indirect
github.com/mattn/go-isatty v0.0.24 // indirect
github.com/mdlayher/netlink v1.11.2 // indirect
github.com/mdlayher/socket v0.7.0 // indirect
github.com/metal-stack/metal-hammer v0.13.17 // indirect
github.com/mdlayher/socket v0.8.0 // indirect
github.com/mitchellh/copystructure v1.2.0 // indirect
github.com/mitchellh/reflectwalk v1.0.2 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/oklog/ulid/v2 v2.1.2 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.24.1 // indirect
github.com/prometheus/client_golang v1.25.0 // indirect
github.com/prometheus/client_model v0.6.3 // indirect
github.com/prometheus/common v0.72.0 // indirect
github.com/prometheus/common v0.72.1 // indirect
github.com/prometheus/procfs v0.22.0 // indirect
github.com/samber/lo v1.53.0 // indirect
github.com/shopspring/decimal v1.5.0 // indirect
github.com/spf13/afero v1.15.0 // indirect
github.com/spf13/cast v1.10.0 // indirect
github.com/spf13/pflag v1.0.10 // indirect
github.com/stretchr/objx v0.5.3 // indirect
github.com/stretchr/objx v0.7.0 // indirect
github.com/vishvananda/netns v0.0.5 // indirect
github.com/x448/float16 v0.8.4 // indirect
go.yaml.in/yaml/v2 v2.4.4 // indirect
go.yaml.in/yaml/v3 v3.0.5 // indirect
golang.org/x/net v0.59.0 // indirect
golang.org/x/crypto v0.58.0 // indirect
golang.org/x/exp v0.0.0-20261013213113-2ab7f3cbc5fb // indirect
golang.org/x/net v0.61.0 // indirect
golang.org/x/oauth2 v0.37.0 // indirect
golang.org/x/sync v0.23.0 // indirect
golang.org/x/sys v0.48.0 // indirect
golang.org/x/term v0.46.0 // indirect
golang.org/x/text v0.42.0 // indirect
golang.org/x/sync v0.24.0 // indirect
golang.org/x/sys v0.49.0 // indirect
golang.org/x/term v0.47.0 // indirect
golang.org/x/text v0.43.0 // indirect
golang.org/x/time v0.16.0 // indirect
golang.org/x/tools v0.52.0 // indirect
gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect
google.golang.org/protobuf v1.36.12 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20261012220534-4341edf3f941 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20261012220534-4341edf3f941 // indirect
gopkg.in/evanphx/json-patch.v4 v4.13.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
k8s.io/kube-openapi v0.0.0-20251125145642-4e65d59e963e // indirect
k8s.io/utils v0.0.0-20260108192941-914a6e750570 // indirect
k8s.io/klog/v2 v2.140.0 // indirect
k8s.io/kube-openapi v0.0.0-20260317180543-43fb72c5454a // indirect
k8s.io/utils v0.0.0-20260210185600-b8788abfbbc2 // indirect
sigs.k8s.io/json v0.0.0-20250730193827-2d320260d730 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/structured-merge-diff/v6 v6.3.1 // indirect
sigs.k8s.io/structured-merge-diff/v6 v6.3.3 // indirect
)
Loading
Loading