Skip to content
Merged
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
18 changes: 18 additions & 0 deletions pkg/tcpip/stack/stack.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,10 @@ type Stack struct {
// externalNetworkingDisabled indicates whether external networking is
// disabled. This means all non-loopback NICs are disabled.
externalNetworkingDisabled bool

// allowConnectedOnSave indicates whether connections should be
// allowed to remain connected during save.
allowConnectedOnSave bool
}

// NetworkProtocolFactory instantiates a network protocol.
Expand Down Expand Up @@ -2548,6 +2552,20 @@ func (s *Stack) GetRemoveConf() bool {
return s.removeConf
}

// SetAllowConnectedOnSave sets allowConnectedOnSave in stack with the given value.
func (s *Stack) SetAllowConnectedOnSave(allowConnectedOnSave bool) {
s.mu.Lock()
defer s.mu.Unlock()
s.allowConnectedOnSave = allowConnectedOnSave
}

// GetAllowConnectedOnSave gets the allowConnectedOnSave from stack.
func (s *Stack) GetAllowConnectedOnSave() bool {
s.mu.RLock()
defer s.mu.RUnlock()
return s.allowConnectedOnSave
}

// DisableAllNonLoopbackNICs disables all non-loopback NICs in the stack.
func (s *Stack) DisableAllNonLoopbackNICs() {
s.mu.Lock()
Expand Down
2 changes: 1 addition & 1 deletion pkg/tcpip/transport/tcp/endpoint_state.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ func (e *Endpoint) beforeSave() {
case epState == StateInitial || epState == StateBound:
case epState.connected() || epState.handshake():
// Terminate valid connections only for restore.
if !e.route.HasSaveRestoreCapability() {
if !e.stack.GetAllowConnectedOnSave() && !e.route.HasSaveRestoreCapability() {
if e.stack.GetRemoveConf() {
// Terminate the endpoint when resume=false.
logDisconnect()
Expand Down
6 changes: 6 additions & 0 deletions runsc/boot/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,10 @@ type CreateLinksAndRoutesArgs struct {
// PauseExternalNetworking indicates whether external networking should be
// disabled initially.
PauseExternalNetworking bool

// AllowConnectedOnSave indicates whether connections should be allowed to
// remain connected during save.
AllowConnectedOnSave bool
}

// InitPluginStackArgs are arguments to InitPluginStack.
Expand Down Expand Up @@ -548,6 +552,8 @@ func (n *Network) CreateLinksAndRoutes(args *CreateLinksAndRoutesArgs, _ *struct
n.Stack.DisableAllNonLoopbackNICs()
}

n.Stack.SetAllowConnectedOnSave(args.AllowConnectedOnSave)

return nil
}

Expand Down
3 changes: 3 additions & 0 deletions runsc/config/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -419,6 +419,9 @@ type Config struct {
// and can be unpaused manually.
PauseExternalNetworking bool `flag:"pause-external-networking"`

// AllowConnectedOnSave allows network connections to stay established on save.
AllowConnectedOnSave bool `flag:"allow-connected-on-save"`

// AllowRootfsTarAnnotation indicates whether the rootfs tar annotation
// should be allowed.
AllowRootfsTarAnnotation bool `flag:"allow-rootfs-tar-annotation"`
Expand Down
8 changes: 5 additions & 3 deletions runsc/config/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,9 @@ const (
flagOverlay2 = "overlay2"
flagAllowFlagOverride = "allow-flag-override"
flagPauseExternalNetworking = "pause-external-networking"

defaultRootDir = "/var/run/runsc"
xdgRuntimeDirEnvVar = "XDG_RUNTIME_DIR"
flagAllowConnectedOnSave = "allow-connected-on-save"
defaultRootDir = "/var/run/runsc"
xdgRuntimeDirEnvVar = "XDG_RUNTIME_DIR"
)

// RegisterFlags registers flags used to populate Config.
Expand Down Expand Up @@ -158,6 +158,7 @@ func RegisterFlags(flagSet *flag.FlagSet) {
flagSet.Bool(flagReproduceNFTables, false, "Attempt to scrape and reproduce nftable rules inside the sandbox. Overrides reproduce-nat when true.")
flagSet.Bool(flagNetDisconnectOK, true, "Indicates whether open network connections and open unix domain sockets should be disconnected upon save.")
flagSet.Bool(flagPauseExternalNetworking, false, "Start the sandbox with external networking disabled. Only supported when using the sandbox network type. The network can be unpaused manually after the sandbox is running.")
flagSet.Bool(flagAllowConnectedOnSave, false, "Allow network connections to stay established on save.")

// Flags that control sandbox runtime behavior: accelerator related.
flagSet.Bool("nvproxy", false, "EXPERIMENTAL: enable support for Nvidia GPUs")
Expand Down Expand Up @@ -195,6 +196,7 @@ var overrideAllowlist = map[string]struct {
flagOverlay2: {check: checkOverlay2},
flagOCISeccomp: {check: checkOciSeccomp},
flagPauseExternalNetworking: {},
flagAllowConnectedOnSave: {},
}

// checkOverlay2 ensures that overlay2 can only be enabled using "memory" or
Expand Down
1 change: 1 addition & 0 deletions runsc/sandbox/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ func collectLinksAndRoutes(conf *config.Config, disableIPv6 bool) (boot.CreateLi

args := boot.CreateLinksAndRoutesArgs{
PauseExternalNetworking: conf.PauseExternalNetworking,
AllowConnectedOnSave: conf.AllowConnectedOnSave,
}

for _, iface := range ifaces {
Expand Down
Loading