02-Linux 网络基础(Network Namespase、veth pair、bridge、Iptables)

本文详细介绍了Linux网络基础,涵盖网络命名空间(Network Namespace)的创建、配置及其管理,veth pair的创建与使用,Linux bridge的配置和应用,以及Iptables的Netfilter和iptables规则。内容涉及到网络隔离、虚拟化技术,特别是Docker和Kubernetes场景下的网络配置,强调了网络接口的混杂模式和NAT在容器网络中的应用。
摘要由CSDN通过智能技术生成

Linux 网络基础

Network Namespase

简单认识

Linux的namespace(名字空间)的作用就是“隔离内核资源”。在Linux的世界里,文件系统挂载点、主机名、POSIX进程间通信消息队列、进程PID数字空间、IP地址、userID数字空间等全局系统资源被namespace分割,装到一个个抽象的独立空间里。而隔离上述系统资源的namespace分别是Mount namespace、UTS namespace、IPC namespace、PID namespace、network namespace和user namespace。对进程来说,要想使用namespace里面的资源,首先要“进入”(具体操作方法,下文会介绍)到这个namespace,而且还无法跨namespace访问资源。

Linux的namespace给里面的进程造成了两个错觉:

(1)它是系统里唯一的进程。

(2)它独享系统的所有资源。

Docker容器作为一项轻量级的虚拟化技术,它的隔离能力来自Linux内核的namespace技术。

network namespace,它在Linux内核2.6版本引入,作用是隔离Linux系统的设备,以及IP地址、端口、路由表、防火墙规则等网络资源。因此,每个网络namespace里都有自己的网络设备(如IP地址、路由表、端口范围、/proc/net目录等)。

network namespace可以通过系统调用来创建,我们可以调用Linux的clone()(其实是UNIX系统调用fork()的延伸)API创建一个通用的namespace,然后传入CLONE_NEWNET参数表面创建一个network namespace。高阶读者可以参考下文的C代码创建一个network namespace。与其他namespace需要读者自己写C语言代码调用系统API才能创建不同,network namespace的增删改查功能已经集成到Linux的ip工具的netns子命令中,因此大大降低了初学者的体验门槛。下面先介绍几条简单的网络namespace管理的命令。

创建一个名为netns1的network namespace可以使用一下命令:

[root@bogon ~]# ip netns add netns1

当ip命令创建了一个network namespace时,系统会在/var/run/netns路径下面生成一个挂载点。挂载点的作用一方面是方便对namespace的管理,另一方面是使namespace即使没有进程运行也能继续存在。

image-20200227101716137

一个networknamespace被创建出来后,可以使用ip netns exec命令进入,做一些网络查询/配置的工作。

ip netns exec netns1 ip link list

image-20200227101906343

如上所示,就是进入netns1这个networknamespace查询网卡信息的命令。目前,我们没有任何配置,因此只有一块系统默认的本地回环设备lo。

想查看系统中有哪些network namespace,可以使用以下命令:

ip netns list

image-20200227102047532

想删除networknamespace,可以通过以下命令实现:

ip netns delete netns1

这条命令实际上并没有删除netns1这个networknamespace,它只是移除了这个network namespace对应的挂载点(下文会解释)。只要里面还有进程运行着,networknamespace便会一直存在。

配置Network Namespase

当namespace里面的进程涉及网络通信时,namespace里面的(虚拟)网络设备就必不可少了。我们已经知道,一个全新的network namespace会附带创建一个本地回环地址。除此之外,没有任何其他的网络设备。而且,network namespace自带的lo设备状态还是DOWN的,因此,当尝试访问本地回环地址时,网络也是不通的。下面的小测试就说明了这一点。

ip netns exec netns1 ping 127.0.0.1

image-20200227102758728

如果想访问本地回环地址,首先需要进入netns1这个network namespace,把设备状态设置成UP。

ip netns exec netns1 ip link set dev lo up

然后,尝试ping127.0.0.1,发现能够ping通。

ip netns exec netns1 ping 127.0.0.1

image-20200227103059788

但是,仅有一个本地回环设备是没法与外界通信的。如果我们想与外界(比如主机上的网卡)进行通信,就需要在namespace里再创建一对虚拟的以太网卡,即所谓的veth pair。顾名思义,veth pair总是成对出现且相互连接,它就像Linux的双向管道(pipe),报文从veth pair一端进去就会由另一端收到。

下面的命令将创建一对虚拟以太网卡,然后把vethpair的一端放到netns1 network namespace。

ip link add veth0 type veth peer name veth1
ip link set veth1 netns netns1

image-20200227103524948

我们创建了veth0和veth1这么一对虚拟以太网卡。在默认情况下,它们都在主机的根network namespce中,将其中一块虚拟网卡veth1通过ip link set命令移动到netns1 network namespace。那么,veth0和veth1之间能直接通信吗?还不能,因为这两块网卡刚创建出来还都是DOWN状态,如下所示:

ip netns exec netns1 ip link list

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值