[CRIU] [PATCH 4/4] net: block all traffic in internal network (v2)

Pavel Emelyanov xemul at parallels.com
Thu Nov 19 04:21:16 PST 2015


On 11/17/2015 11:19 PM, Andrey Vagin wrote:
> From: Andrew Vagin <avagin at openvz.org>
> 
> Let's imagine that we have two local interconnected sockets.
> Whe we are restoring tcp sockets, we need to disable the repair mode
> to restore data in sending queues.
> 
> If traffic isn't blocked, a socket starts operating, but
> in this time another end can be not restored yet.
> 
> $ test/zdtm.sh -r ns/static/socket-tcpbuf-local
> ...
> (00.274632) 5: Error (sk-tcp.c:485): Can't restore 2 queue data (-1), want (1780919:1780919): Connection reset by peer
> 
> We create a separate chain to avoid conflicts with other rules.
> 
> https://bugs.openvz.org/browse/CRIU-96
> 
> v2: use iptables-restore to apply whole configuration for one call
> Signed-off-by: Andrew Vagin <avagin at virtuozzo.com>
> ---
>  net.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 83 insertions(+), 2 deletions(-)
> 
> diff --git a/net.c b/net.c
> index 43232b9..bfdebad 100644
> --- a/net.c
> +++ b/net.c
> @@ -956,6 +956,82 @@ int netns_keep_nsfd(void)
>  	pr_info("Saved netns fd for links restore\n");
>  	return 0;
>  }
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <fcntl.h>
> +
> +static int iptables_restore(bool ipv6, char *buf, int size)
> +{
> +	int pfd[2], ret = -1;
> +	char *cmd4[] = {"iptables-restore",  "--noflush", NULL};
> +	char *cmd6[] = {"ip6tables-restore", "--noflush", NULL};

Why do you use iptables-save/-restore commands instead of plain iptables one?

> +	char **cmd = ipv6 ? cmd6 : cmd4;;
> +
> +	if (pipe(pfd) < 0) {
> +		pr_perror("Unable to create pipe");
> +		return -1;
> +	}
> +
> +	if (write(pfd[1], buf, size) < size) {
> +		pr_perror("Unable to write iptables configugration");
> +		goto err;
> +	}
> +	close_safe(&pfd[1]);
> +
> +	ret = cr_system(pfd[0], -1, -1, cmd[0], cmd, 0);
> +err:
> +	close_safe(&pfd[1]);
> +	close_safe(&pfd[0]);
> +	return ret;
> +}
> +
> +static int network_lock_internal()
> +{
> +	char conf[] =	"*filter\n"
> +				":CRIU - [0:0]\n"
> +				"-I INPUT -j CRIU\n"
> +				"-I OUTPUT -j CRIU\n"
> +				"-A CRIU -j DROP\n"
> +				"COMMIT\n";
> +	int ret = 0, nsret;
> +
> +	if (switch_ns(root_item->pid.real, &net_ns_desc, &nsret))
> +		return -1;
> +
> +
> +	ret |= iptables_restore(false, conf, sizeof(conf) - 1);
> +	if (kdat.ipv6)
> +		ret |= iptables_restore(true, conf, sizeof(conf) - 1);
> +
> +	if (restore_ns(nsret, &net_ns_desc))
> +		ret = -1;
> +
> +	return ret;
> +}
> +
> +static int network_unlock_internal()
> +{
> +	char conf[] =	"*filter\n"
> +			":CRIU - [0:0]\n"
> +			"-D INPUT -j CRIU\n"
> +			"-D OUTPUT -j CRIU\n"
> +			"-X CRIU\n"
> +			"COMMIT\n";
> +	int ret = 0, nsret;
> +
> +	if (switch_ns(root_item->pid.real, &net_ns_desc, &nsret))
> +		return -1;
> +
> +
> +	ret |= iptables_restore(false, conf, sizeof(conf) - 1);
> +	if (kdat.ipv6)
> +		ret |= iptables_restore(true, conf, sizeof(conf) - 1);
> +
> +	if (restore_ns(nsret, &net_ns_desc))
> +		ret = -1;
> +
> +	return ret;
> +}
>  
>  int network_lock(void)
>  {
> @@ -965,7 +1041,10 @@ int network_lock(void)
>  	if  (!(root_ns_mask & CLONE_NEWNET))
>  		return 0;
>  
> -	return run_scripts(ACT_NET_LOCK);
> +	if (run_scripts(ACT_NET_LOCK))
> +		return -1;
> +
> +	return network_lock_internal();
>  }
>  
>  void network_unlock(void)
> @@ -975,8 +1054,10 @@ void network_unlock(void)
>  	cpt_unlock_tcp_connections();
>  	rst_unlock_tcp_connections();
>  
> -	if (root_ns_mask & CLONE_NEWNET)
> +	if (root_ns_mask & CLONE_NEWNET) {
>  		run_scripts(ACT_NET_UNLOCK);
> +		network_unlock_internal();
> +	}
>  }
>  
>  int veth_pair_add(char *in, char *out)
> 



More information about the CRIU mailing list