searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Linux隔离技术-网络命名空间

2023-07-10 02:19:20
56
0

前言概述

软件是具有生命周期的产品,而近年安全的重要性逐步渗入大家意识,带火了诸如安全左移、SDL(软件安全开发周期)等。今天就SDL的安全设计(最小权限)和应急响应(影响抑制)中发挥重要作用的Linux下网络命名空间展开聊聊自己浅见。

空间简述

Linux 命名空间使得在一台真实机器上运行一系列应用程序成为可能,并确保它们中的任何两个都不会互相干扰。Linux内核从2.6.24开始支持命名空间,随着版本迭代不断支持新的命名空间类型。本文简述的网络命名空间,每个网络名称空间都有自己的资源,例如网络接口、IP 地址、路由表、iptables规则等,从而逻辑上完成了网络上的隔离。
图片来源知乎

实践应用

大家熟知的Docker和systemd也是使用到了网络命名空间技术,不过下面从更简单的ip命令介绍网名命名空间的使用。
环境: centos 7.9.2009,x86-64,kernel-3.10.0
前提: echo 1 > /proc/sys/net/ipv4/ip_forward; iptables -P FORWARD ACCEPT
 
// netns创建
ip netns add ns01
ip netns add ns02
// veth创建
ip link add veth01 type veth peer name br-veth01
ip link add veth02 type veth peer name br-veth02
// 挂netns
ip link set veth01 netns ns01
ip link set veth02 netns ns02
ip netns exec ns01 ip link set dev veth01 up
ip netns exec ns01 ifconfig veth01 192.168.88.11/24 up
ip netns exec ns02 ip link set dev veth02 up
ip netns exec ns02 ifconfig veth02 192.168.88.12/24 up
// 互ping
ip netns exec ns01 ping 192.168.88.12
// 结果
PING 192.168.88.12 (192.168.88.12) 56(84) bytes of data.
^C
--- 192.168.88.12 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 3999ms
// 这时是无法ping通的,因为各自在不同网络空间,且没有桥介可以互联起来,就跟两个物理机没有交换机串联。
// br创建
brctl addbr br01
ip link set dev br01 up
// 挂br
brctl addif br01 br-veth01
brctl addif br01 br-veth02
ip link set dev br-veth01 up
ip link set dev br-veth02 up
// 再次ping,结果
PING 192.168.88.12 (192.168.88.12) 56(84) bytes of data.
64 bytes from 192.168.88.12: icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from 192.168.88.12: icmp_seq=2 ttl=64 time=0.025 ms
64 bytes from 192.168.88.12: icmp_seq=3 ttl=64 time=0.025 ms
// 配置访问外网
ifconfig br01 192.168.88.1/24
ip netns exec ns01 ip route add default via 192.168.88.1
ip netns exec ns02 ip route add default via 192.168.88.1
iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -j MASQUERADE
ip netns exec ns01 ping baidu.com
 
另外的实际业务中应用,可参考另一篇文章《systemd在Linux安全的作用》设置PrivateNetwork=true

源码层次

首先是内核的网络命名空间定义,感兴趣可以深入研究(本人对内核源码了解属于小白级)
 
//file:include/net/net_namespace.h
struct net {
struct net_device loopback_dev; / The loopback */
//路由表、netfilter都在这里
struct netns_ipv4 ipv4;
......
unsigned int proc_inum;
}
其次是个人编码实现进程拥有独立网络命名空间
 
#define _GNU_SOURCE
#include
#include
#include
#include <sys/wait.h>
#include
static char child_stack[1048576];
static int child_fn() {
printf("New net Namespace:\n");
system("ip link");
printf("\n\n");
return 0;
}
int main() {
printf("Original net Namespace:\n");
system("ip link");
printf("\n\n");
pid_t child_pid = clone(child_fn, child_stack+1048576, CLONE_NEWPID | CLONE_NEWNET | SIGCHLD, NULL);
waitpid(child_pid, NULL, 0);
return 0;
}
gcc -o test namespace_op.c
运行test即可看到 New net Namespace 下默认只有lo网络设备(符合内核源码的定义),即程序员可以不用docker和systemd也可以实现更轻量级的进程网络隔离。

参考文献

[1] https://www.toptal.com/linux/separation-anxiety-isolating-your-system-with-linux-namespaces
[2] https://man7.org/linux/man-pages/man7/network_namespaces.7.html
[3] https://zhuanlan.zhihu.com/p/520309169
0条评论
0 / 1000
刘****成
15文章数
0粉丝数
刘****成
15 文章 | 0 粉丝
原创

Linux隔离技术-网络命名空间

2023-07-10 02:19:20
56
0

前言概述

软件是具有生命周期的产品,而近年安全的重要性逐步渗入大家意识,带火了诸如安全左移、SDL(软件安全开发周期)等。今天就SDL的安全设计(最小权限)和应急响应(影响抑制)中发挥重要作用的Linux下网络命名空间展开聊聊自己浅见。

空间简述

Linux 命名空间使得在一台真实机器上运行一系列应用程序成为可能,并确保它们中的任何两个都不会互相干扰。Linux内核从2.6.24开始支持命名空间,随着版本迭代不断支持新的命名空间类型。本文简述的网络命名空间,每个网络名称空间都有自己的资源,例如网络接口、IP 地址、路由表、iptables规则等,从而逻辑上完成了网络上的隔离。
图片来源知乎

实践应用

大家熟知的Docker和systemd也是使用到了网络命名空间技术,不过下面从更简单的ip命令介绍网名命名空间的使用。
环境: centos 7.9.2009,x86-64,kernel-3.10.0
前提: echo 1 > /proc/sys/net/ipv4/ip_forward; iptables -P FORWARD ACCEPT
 
// netns创建
ip netns add ns01
ip netns add ns02
// veth创建
ip link add veth01 type veth peer name br-veth01
ip link add veth02 type veth peer name br-veth02
// 挂netns
ip link set veth01 netns ns01
ip link set veth02 netns ns02
ip netns exec ns01 ip link set dev veth01 up
ip netns exec ns01 ifconfig veth01 192.168.88.11/24 up
ip netns exec ns02 ip link set dev veth02 up
ip netns exec ns02 ifconfig veth02 192.168.88.12/24 up
// 互ping
ip netns exec ns01 ping 192.168.88.12
// 结果
PING 192.168.88.12 (192.168.88.12) 56(84) bytes of data.
^C
--- 192.168.88.12 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 3999ms
// 这时是无法ping通的,因为各自在不同网络空间,且没有桥介可以互联起来,就跟两个物理机没有交换机串联。
// br创建
brctl addbr br01
ip link set dev br01 up
// 挂br
brctl addif br01 br-veth01
brctl addif br01 br-veth02
ip link set dev br-veth01 up
ip link set dev br-veth02 up
// 再次ping,结果
PING 192.168.88.12 (192.168.88.12) 56(84) bytes of data.
64 bytes from 192.168.88.12: icmp_seq=1 ttl=64 time=0.037 ms
64 bytes from 192.168.88.12: icmp_seq=2 ttl=64 time=0.025 ms
64 bytes from 192.168.88.12: icmp_seq=3 ttl=64 time=0.025 ms
// 配置访问外网
ifconfig br01 192.168.88.1/24
ip netns exec ns01 ip route add default via 192.168.88.1
ip netns exec ns02 ip route add default via 192.168.88.1
iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -j MASQUERADE
ip netns exec ns01 ping baidu.com
 
另外的实际业务中应用,可参考另一篇文章《systemd在Linux安全的作用》设置PrivateNetwork=true

源码层次

首先是内核的网络命名空间定义,感兴趣可以深入研究(本人对内核源码了解属于小白级)
 
//file:include/net/net_namespace.h
struct net {
struct net_device loopback_dev; / The loopback */
//路由表、netfilter都在这里
struct netns_ipv4 ipv4;
......
unsigned int proc_inum;
}
其次是个人编码实现进程拥有独立网络命名空间
 
#define _GNU_SOURCE
#include
#include
#include
#include <sys/wait.h>
#include
static char child_stack[1048576];
static int child_fn() {
printf("New net Namespace:\n");
system("ip link");
printf("\n\n");
return 0;
}
int main() {
printf("Original net Namespace:\n");
system("ip link");
printf("\n\n");
pid_t child_pid = clone(child_fn, child_stack+1048576, CLONE_NEWPID | CLONE_NEWNET | SIGCHLD, NULL);
waitpid(child_pid, NULL, 0);
return 0;
}
gcc -o test namespace_op.c
运行test即可看到 New net Namespace 下默认只有lo网络设备(符合内核源码的定义),即程序员可以不用docker和systemd也可以实现更轻量级的进程网络隔离。

参考文献

[1] https://www.toptal.com/linux/separation-anxiety-isolating-your-system-with-linux-namespaces
[2] https://man7.org/linux/man-pages/man7/network_namespaces.7.html
[3] https://zhuanlan.zhihu.com/p/520309169
文章来自个人专栏
信息安全
15 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
1
0