0%

Linux 网络虚拟化

Linux 网络虚拟化

本文主要记录Linux 中网络虚拟化,以及基本的配置

全文基于 CentOS 7.4

Namespace

Namespace 技术可以创建独立的网络空间
使用 ip netns 管理的网络,其路径在/var/run/netns/,如果是docker创建的网络空间,要创建软链接过去,才能用这个指令管理

管理 Namespace

1
2
3
4
5
6
7
8
9
# 添加 ns
ip netns add net0
# 查看
ip netns
# 在指定NS中操作
ip netns exec net0 /bin/bash --rcfile <(echo "PS1=\"ns net0> \"")

# del
ip netns del net0

默认创建后ns中只有一个lo的接口,并且是down,这种情况下,不能和其他主机网络,其他ns通信

netns 可以简写 net

veth

veth 是成对出现的网络设备,两个虚拟设备之间,有个直通的链路

管理veth

创建一对veth pair,这只能成对出现

1
2
3
4
5
6
ip link add type veth
# 手动指定名称
ip link add veth0 type veth peer name veth1

# 删一个,另一个也会删除掉
ip link del veth0

创建后可以看到

1
2
3
4
19: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether f6:5f:3a:36:6e:73 brd ff:ff:ff:ff:ff:ff
20: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
link/ether ea:53:eb:ff:d5:58 brd ff:ff:ff:ff:ff:ff

bridge

相当于交换机,连接不同设备,依靠mac地址做转发

管理 bridge

1
2
3
4
5
6
7
8
9
10
# add
ip link add br0 type bridge

# up
ip link set dev br0 up

# 把设备挂上去
ip link set dev eth1 master br0
# 取下来
ip link set dev eth1 nomaster

ns 之间通信

两个ns之间可以通过veth pair进行通信,意思就是在两个空间中加了个管道,拓扑如下:

1
2
3
4
5
6
+++++++++++++++++    +++++++++++++++++
+ ns0 + + ns1 +
+ ----------- + + ----------- +
+ | veth0 |----------| veth1 | +
+ ----------- + + ----------- +
+++++++++++++++++ +++++++++++++++++
  • 创建veth
  • 放入ns

创建veth

接👆

放入ns

首先要把veth放入各自ns中

1
2
ip link set veth0 netns net0
ip link set veth1 netns net1

然后需要配置ip地址

1
2
3
4
5
ip netns exec net0 ip addr add 192.168.1.1/24 dev veth0
ip netns exec net1 ip addr add 192.168.1.2/24 dev veth1

# 这里只要操作一个接口状态,另外一个会同步变化
ip netns exec net0 ip link set veth0 up

使用bridge连接不同ns

veth pair只能连接两个ns,当多个ns要通信时候需要使用bridge
拓扑如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+++++++++++++++++    +++++++++++++++++
+ ns0 + + ns1 +
+ ----------- + + ----------- +
+ | veth1 | + + | veth3 | +
+ ----------- + + ----------- +
+++++++ | +++++++ +++++++ | +++++++
| |
|--------------------|
||
=================
= br0 =
= =
= veth0 veth2 =
=================

创建bridge

1
2
3
4
# 添加
ip link add br0 type bridge
# 并且up
ip link set dev br0 up

创建veth

创建 veth,并且一端加入ns,一端连接 bridge

首先和之前一样创建veth,假设已经创建了两对

1
2
veth0@veth1
veth2@veth3

绑定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 把设备 veth0 加入到 br0
ip link set dev veth0 master br0
ip link set dev veth1 netns net0
ip link set dev veth2 master br0
ip link set dev veth3 netns net1


ip netns exec net0 ip link set dev veth1 name eth0
ip netns exec net0 ip addr add 192.168.1.2/24 dev eth0

ip netns exec net1 ip link set dev veth3 name eth0
ip netns exec net1 ip addr add 192.168.1.3/24 dev eth0

ip link set dev veth0 up
ip link set dev veth2 up

ip netns exec net0 ip link set dev eth0 up
ip netns exec net1 ip link set dev eth0 up

参考

linux 网络虚拟化: network namespace 简介