@@ -27,10 +27,12 @@ import (
2727
2828 kubespanadapter "github.com/siderolabs/talos/internal/app/machined/pkg/adapters/kubespan"
2929 "github.com/siderolabs/talos/pkg/machinery/constants"
30+ "github.com/siderolabs/talos/pkg/machinery/kernel"
3031 "github.com/siderolabs/talos/pkg/machinery/nethelpers"
3132 "github.com/siderolabs/talos/pkg/machinery/resources/config"
3233 "github.com/siderolabs/talos/pkg/machinery/resources/kubespan"
3334 "github.com/siderolabs/talos/pkg/machinery/resources/network"
35+ "github.com/siderolabs/talos/pkg/machinery/resources/runtime"
3436)
3537
3638// DefaultPeerReconcileInterval is interval between peer status reconciliation on timer.
@@ -108,6 +110,10 @@ func (ctrl *ManagerController) Outputs() []controller.Output {
108110 Type : kubespan .PeerStatusType ,
109111 Kind : controller .OutputExclusive ,
110112 },
113+ {
114+ Type : runtime .KernelParamSpecType ,
115+ Kind : controller .OutputShared ,
116+ },
111117 }
112118}
113119
@@ -378,6 +384,7 @@ func (ctrl *ManagerController) Run(ctx context.Context, r controller.Runtime, lo
378384 },
379385 Verdict : pointer .To (nethelpers .VerdictAccept ),
380386 },
387+ // Mark packets to be sent over the KubeSpan link.
381388 {
382389 MatchDestinationAddress : & network.NfTablesAddressMatch {
383390 IncludeSubnets : allowedIPsSet .Prefixes (),
@@ -388,6 +395,18 @@ func (ctrl *ManagerController) Run(ctx context.Context, r controller.Runtime, lo
388395 },
389396 Verdict : pointer .To (nethelpers .VerdictAccept ),
390397 },
398+ // Mark incoming packets from the KubeSpan link for rp_filter to find the correct routing table.
399+ {
400+ MatchIIfName : & network.NfTablesIfNameMatch {
401+ InterfaceNames : []string {constants .KubeSpanLinkName },
402+ Operator : nethelpers .OperatorEqual ,
403+ },
404+ SetMark : & network.NfTablesMark {
405+ Mask : ^ uint32 (constants .KubeSpanDefaultFirewallMask ),
406+ Xor : constants .KubeSpanDefaultForceFirewallMark ,
407+ },
408+ Verdict : pointer .To (nethelpers .VerdictAccept ),
409+ },
391410 }
392411
393412 return nil
@@ -554,6 +573,17 @@ func (ctrl *ManagerController) Run(ctx context.Context, r controller.Runtime, lo
554573 return fmt .Errorf ("error modifying link spec: %w" , err )
555574 }
556575
576+ if err = safe .WriterModify (ctx , r , runtime .NewKernelParamSpec (
577+ runtime .NamespaceName ,
578+ kernel .Sysctl + "." + "net.ipv4.conf." + constants .KubeSpanLinkName + ".src_valid_mark" ,
579+ ), func (res * runtime.KernelParamSpec ) error {
580+ res .TypedSpec ().Value = "1"
581+
582+ return nil
583+ }); err != nil {
584+ return err
585+ }
586+
557587 if rulesMgr == nil {
558588 rulesMgr = ctrl .RulesManagerFactory (constants .KubeSpanDefaultRoutingTable , constants .KubeSpanDefaultForceFirewallMark , constants .KubeSpanDefaultFirewallMask )
559589
0 commit comments