[Devel] [PATCH rh7 2/2] Revert "net: Show all connections in init namespace"
Kirill Tkhai
ktkhai at virtuozzo.com
Mon Apr 27 11:23:13 MSK 2020
On 24.04.2020 20:10, Konstantin Khorenko wrote:
> This reverts commit 201b85da71d3350f0228c6a35cf62e7b17efd9bb.
>
> Long ago in https://bugs.openvz.org/browse/OVZ-5192
> we've allowed host to see Container's connections,
> which is against usual net namespaces rules.
>
> In vz7 de facto host never was allowed to see Contaners' connections:
> * first - due to a bug https://bugs.openvz.org/browse/OVZ-6600
> * later due to a fix
> b6c0f8cf6332f ("ve/net: Exclude foreign CT sockets from
> /proc/net/tcp{,6}")
>
> As we consider the current behavior correct (a namespace should not leak
> info to other namespaces), let's drop patches which intended to provide
> this functionality.
>
> If one wants to check all connections from host, he can use
> "ip -all netns exec netstat -n" to get info about Container's root net
> namespaces.
> The latter command shows all netns which were create via "ip" utility.
>
> If he wants to be more precise and want to check really ALL net
> namespaces, it's enough to iterate over all net namespaces via
> "nsenter -t $PROC_PID -n netstat -n".
>
> https://bugs.openvz.org/browse/OVZ-7202
>
> Signed-off-by: Konstantin Khorenko <khorenko at virtuozzo.com>
Reviewed-by: Kirill Tkhai <ktkhai at virtuozzo.com>
> ---
> include/net/net_namespace.h | 10 ----------
> net/ipv4/raw.c | 4 ++--
> net/ipv4/tcp_ipv4.c | 7 +++----
> net/ipv4/udp.c | 4 ++--
> 4 files changed, 7 insertions(+), 18 deletions(-)
>
> diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h
> index 2edad00362601..e40d8f6e0b392 100644
> --- a/include/net/net_namespace.h
> +++ b/include/net/net_namespace.h
> @@ -281,11 +281,6 @@ int net_eq(const struct net *net1, const struct net *net2)
>
> extern void net_drop_ns(void *);
>
> -/* Returns whether curr can mess with net's objects */
> -static inline int net_access_allowed(const struct net *net, const struct net *curr)
> -{
> - return net_eq(curr, &init_net) || net_eq(curr, net);
> -}
> #else
>
> static inline struct net *get_net(struct net *net)
> @@ -309,11 +304,6 @@ int net_eq(const struct net *net1, const struct net *net2)
> }
>
> #define net_drop_ns NULL
> -
> -static inline int net_access_allowed(const struct net *net, const struct net *curr)
> -{
> - return 1;
> -}
> #endif
>
>
> diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c
> index 66fbfaac02afb..ae897dd78623c 100644
> --- a/net/ipv4/raw.c
> +++ b/net/ipv4/raw.c
> @@ -922,7 +922,7 @@ static struct sock *raw_get_first(struct seq_file *seq)
> for (state->bucket = 0; state->bucket < RAW_HTABLE_SIZE;
> ++state->bucket) {
> sk_for_each(sk, &state->h->ht[state->bucket])
> - if (net_access_allowed(sock_net(sk), seq_file_net(seq)))
> + if (sock_net(sk) == seq_file_net(seq))
> goto found;
> }
> sk = NULL;
> @@ -938,7 +938,7 @@ static struct sock *raw_get_next(struct seq_file *seq, struct sock *sk)
> sk = sk_next(sk);
> try_again:
> ;
> - } while (sk && !net_access_allowed(sock_net(sk), seq_file_net(seq)));
> + } while (sk && sock_net(sk) != seq_file_net(seq));
>
> if (!sk && ++state->bucket < RAW_HTABLE_SIZE) {
> sk = sk_head(&state->h->ht[state->bucket]);
> diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
> index 0417acc78e73b..f788d27369abe 100644
> --- a/net/ipv4/tcp_ipv4.c
> +++ b/net/ipv4/tcp_ipv4.c
> @@ -1980,7 +1980,7 @@ static void *listening_get_next(struct seq_file *seq, void *cur)
> }
> get_sk:
> sk_nulls_for_each_from(sk, node) {
> - if (!net_access_allowed(sock_net(sk), net))
> + if (!net_eq(sock_net(sk), net))
> continue;
> if (sk->sk_family == st->family) {
> cur = sk;
> @@ -2055,7 +2055,7 @@ static void *established_get_first(struct seq_file *seq)
> spin_lock_bh(lock);
> sk_nulls_for_each(sk, node, &tcp_hashinfo.ehash[st->bucket].chain) {
> if (sk->sk_family != st->family ||
> - !net_access_allowed(sock_net(sk), net)) {
> + !net_eq(sock_net(sk), net)) {
> continue;
> }
> rc = sk;
> @@ -2080,8 +2080,7 @@ static void *established_get_next(struct seq_file *seq, void *cur)
> sk = sk_nulls_next(sk);
>
> sk_nulls_for_each_from(sk, node) {
> - if (sk->sk_family == st->family &&
> - net_access_allowed(sock_net(sk), net))
> + if (sk->sk_family == st->family && net_eq(sock_net(sk), net))
> return sk;
> }
>
> diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
> index 2e622f13f4dce..b581c7dc1661c 100644
> --- a/net/ipv4/udp.c
> +++ b/net/ipv4/udp.c
> @@ -2465,7 +2465,7 @@ static struct sock *udp_get_first(struct seq_file *seq, int start)
>
> spin_lock_bh(&hslot->lock);
> sk_for_each(sk, &hslot->head) {
> - if (!net_access_allowed(sock_net(sk), net))
> + if (!net_eq(sock_net(sk), net))
> continue;
> if (sk->sk_family == state->family)
> goto found;
> @@ -2484,7 +2484,7 @@ static struct sock *udp_get_next(struct seq_file *seq, struct sock *sk)
>
> do {
> sk = sk_next(sk);
> - } while (sk && (!net_access_allowed(sock_net(sk), net) || sk->sk_family != state->family));
> + } while (sk && (!net_eq(sock_net(sk), net) || sk->sk_family != state->family));
>
> if (!sk) {
> if (state->bucket <= state->udp_table->mask)
>
More information about the Devel
mailing list