【 Linux 网络虚拟化 】Netns

netns 可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables等。总之,与网络有关的组件都是独立的。

创建网络空间:

# ip netns add ns1

查看网络空间:

# ip netns list

删除网络空间:

# ip netns del ns1

进入网络空间执行命令:

# ip netns exec ns1 `command`

实例一:
    用netns连接两个隔离环境中的虚拟机,如图:

在虚拟化中有两个虚拟机网络隔离环境需要通信。

系统: centos7.2 x64

安装程序包
# yum install bridge-utils libvirt libvirt-client virt-install virt-viewer net-tools -y

# brctl addbr br0
# brctl addbr br1
# ifconfig br0 up
# ifconfig br1 up
取消默认nat网络模式
# mv /etc/libvirt/qemu/networks/default.xml /etc/libvirt/qemu/networks/default.xml_bak
# systemctl start libvirtd
创建虚拟机并连接至br0
# virt-install --name vm1 --ram 512 --vcpus=1 --disk /images/linux/cirros-0.3.5-i386-disk-1.img --network bridge=br0,model=virtio --force --import --nographics --serial=pty --console=pty

打开第二个终端创建第二个虚拟机并连接至br1

# virt-install --name vm2 --ram 512 --vcpus=1 --disk /images/linux/cirros-0.3.5-i386-disk-2.img --network bridge=br1,model=virtio --force --import --nographics --serial=pty --console=pty

# brctl show
bridge name    bridge id        STP enabled    interfaces
br0        8000.fe54007e1861    no        vnet0
br1        8000.fe5400be1885    no        vnet1

到此,虚拟机已经连接上各自的桥设备了。完成如图:

创建虚拟网络空间:

# ip netns add ns1
# ip netns list
ns1

接下来创建一张虚拟网卡,虚拟网卡分为前半段和后半段,我们将前半段添加到br0中,并将后半段添加到虚拟网络空间中,这样br0桥设备中主机就能够连接到虚拟网络空间中。

# ip link add net-in type veth peer name net-out
# ifconfig net-in up
# ifconfig net-out up

将net-in虚拟网卡添加到br0中,将net-out虚拟网卡添加到ns1中

# brctl addif br0 net-in

查看是否添加成功
# brctl show br0
bridge name    bridge id        STP enabled    interfaces
br0        8000.46c7e9d2c0fa    no            net-in
                                        vnet0
将net-out添加到ns1中,并重命名为eth0
# ip link set dev net-out name eth0 netns ns1
查看是否添加成功
# ip netns exec ns1 ifconfig -a
eth0: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether a2:07:dc:ba:35:a2  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=8<LOOPBACK>  mtu 65536
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# ip netns exec ns1 ifconfig lo up

现在vm1 --> br0 --> ns1 网络做通了,完成如下图:

同理,和上面操作一样。

# ip link add net1-in type veth peer name net1-out
# ifconfig net1-in up
# ifconfig net1-out up

# brctl addif br1 net1-in

# brctl show br1
bridge name    bridge id        STP enabled    interfaces
br1        8000.1291a963b290    no        net1-in
                            vnet1

# ip link set dev net1-out name eth1 netns ns1

# ip netns exec ns1 ifconfig -a
eth0: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether a2:07:dc:ba:35:a2  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth1: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether 02:d4:3c:7d:3b:2e  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ip地址配置如下:

vm1 - eth0 : 192.168.1.2
ns1 - eth0 : 192.168.1.1

vm2 - eth0 : 172.168.10.2
ns1 - eth0 : 172.168.10.1

记住:当宿主机开启了网络转发功能,虚拟网络空间才会开启,在以上场景中,必须开启网络转发功能。

# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1

vm1 - eth0 网络配置如下:

# ifconfig lo up
# ifconfig eth0 192.168.1.2/24 up
# ifconfig
eth0      Link encap:Ethernet  HWaddr 52:54:00:7E:18:61
          inet addr:192.168.1.2  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::5054:ff:fe7e:1861/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:648 (648.0 B)  TX bytes:168 (168.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

ns1 - eth0 网络配置如下:

# ip netns exec ns1 ifconfig lo up
# ip netns exec ns1 ifconfig eth0 192.168.1.1/24 up
# ip netns exec ns1 ifconfig eth0
eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.1.1  netmask 255.255.255.0  broadcast 192.168.1.255
        ether a2:07:dc:ba:35:a2  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

vm2 - eth0 网络配置如下:

# ifconfig lo up
# ifconfig eth0 172.168.10.2/24 up
# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 52:54:00:BE:18:85
          inet addr:172.168.10.2  Bcast:172.168.255.255  Mask:255.255.0.0
          inet6 addr: fe80::5054:ff:febe:1885/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:648 (648.0 B)  TX bytes:168 (168.0 B)

ns1 - eth1 网络配置如下:

# ip netns exec ns1 ifconfig eth1 172.168.10.1/24 up
# ip netns exec ns1 ifconfig eth1
eth1: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.168.10.1  netmask 255.255.255.0  broadcast 172.168.10.255
        ether 02:d4:3c:7d:3b:2e  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

为虚拟机指定路由:

vm1 :
# ping 192.168.1.1 -c1
PING 192.168.1.1 (192.168.1.1): 56 data bytes
64 bytes from 192.168.1.1: seq=0 ttl=64 time=0.811 ms

--- 192.168.1.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.811/0.811/0.811 ms

# ip route add default via 192.168.1.1

注意:如果ping不通,请检查链路上的网卡状态是否是up状态。

vm2 :
# ping  172.168.10.1 -c1
PING 172.168.10.1 (172.168.10.1): 56 data bytes
64 bytes from 172.168.10.1: seq=0 ttl=64 time=2.385 ms

--- 172.168.10.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 2.385/2.385/2.385 ms

添加默认路由

# ip route add default via 172.168.10.1

接下来,使用ping测试。

vm1 - eth0 : 192.168.1.2  --> ns1 - eth1 : 172.168.10.1

# ping 172.168.10.1 -c1
PING 172.168.10.1 (172.168.10.1): 56 data bytes
64 bytes from 172.168.10.1: seq=0 ttl=64 time=0.426 ms

--- 172.168.10.1 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.426/0.426/0.426 ms

能够达到ns1 eth1网卡,说明ns1从eth0 - 192.168.10.1 转发到了 172.168.10.1

vm1 - eth0 : 192.168.1.2  --> vm2 - eth0 : 172.168.10.2

这样,就完成了在宿主机中,两个虚拟主机隔离模式的通信。

实例二:

说明:宿主机中两组隔离模型,其中只有一组可以访问公网

接下来,在模式一的基础上进行修改:

# ip netns del ns1

删除虚拟网络空间模式,所有和虚拟网络空间有关的虚拟网卡都会被删除。

现在的模式如下:

vm1: 192.168.1.2/24
vm2: 192.168.1.2/24
ns1: 192.168.1.1/24

这里故意把vm1和vm2的ip设置为一样,方便我们进行测试。

添加虚拟网络空间
# ip netns add ns1
# ip link add net-in type veth peer name net-out
# ifconfig net-in up
# ifconfig net-out up
添加net-in到br0,添加net-out到虚拟网络空间ns1

# brctl addif br0 net-in
# ip link set dev net-out name eth0 netns ns1

为ns1启动网卡并配置ip地址

# ip netns exec ns1 ifconfig lo up
# ip netns exec ns1 ifconfig eth0 192.168.1.1 netmask 255.255.255.0 up

为vm1配置网关为192.168.1.1

创建桥设备,并将物理网卡添加到桥设备中,这里建议直接修改物理网卡配置文件

cp -a ifcfg-eno16777736 ifcfg-br-out

# vim ifcfg-eno16777736 

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=eno16777736
UUID=100e462e-c0d0-4271-9b5a-1c8e47ff0d03
DEVICE=eno16777736
ONBOOT=yes
BRIDGE=br-out

# vim ifcfg-br-out 

TYPE=Bridge
BOOTPROTO=none
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=no
NAME=br-out
DEVICE=br-out
ONBOOT=yes
IPADDR=10.0.0.11
NETMASK=255.255.255.0
GATEWAY=10.0.0.1
DNS1=10.0.0.1
DNS2=114.114.114.114

重启下网络
# systemctl restart network

物理网卡添加成功
# brctl show br-out
bridge name    bridge id        STP enabled    interfaces
br-out        8000.000c2923e15d    no        eno16777736

现在创建一对网卡,连接ns1和br-out

# ip link add net1-in type veth peer name net1-out
# ifconfig net1-in up
# ifconfig net1-out up

# ip link set dev net1-in name eth1 netns ns1
# brctl addif br-out net1-out
# brctl show br-out
bridge name    bridge id        STP enabled    interfaces
br-out        8000.000c2923e15d    no        eno16777736
                                        net1-out

我真实局域网的ip为10.0.0.0/24

因此添加到ns1中的eth1要配置到同网段

# ip netns exec ns1 ifconfig eth1 10.0.0.12 netmask 255.255.255.0 up

能够到达网关了。

已实现如下:

在ns1中添加源地址转换

# ip netns exec ns1 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j SNAT --to-source 10.0.0.12
# ip netns exec ns1 ip route default via 10.0.0.1

再次通过vm1 ping 公网ip

这样就实现了宿主机内部分网络中的主机可以访问公网,部分主机没有访问公网权限。

总之,网络逻辑很重要。

时间: 2024-10-02 12:25:03

【 Linux 网络虚拟化 】Netns的相关文章

图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN

Linux的网卡驱动中内含了很多"虚拟网卡".早先的文章曾经详细分析过tun,ifb等虚拟网卡,类似的思路,在虚拟化大行其道的趋势下,Linux源码树中不断增加对"网络虚拟化"的支持,不光是为了支持"虚拟机"技术,更多的是给了用户和程序员更多的选择.       这些对网络虚拟化的支持技术包括任何重量级的虚拟化技术,比较重的比如对虚拟机技术的支持,轻量级的则是net namespace技术.近期的工作基于net namespace技术,关于这个技

网络虚拟化技术(一): Linux网络虚拟化

创建虚拟网络环境 使用命令 $ ip netns add net0 可以创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables,ebtables,等等.总之,与网络有关的组件都是独立的. ip命令需要root权限的,但是由于本文大量使用ip命令,于是笔者给ip命令添加了capability,使普通用户也能使用ip命令 使用命令 $ ip netns list net0 可以看到我们刚才创建的网络环境 进入虚拟网络环境 使用命令 $ ip ne

53 kvm及libvirt、使用virsh管理kvm虚拟机、网络虚拟化技术基础、网络名称空间netns用法详解

01 kvm及libvirt [[email protected] ~]# yum install libvirt libvirt-client python-virtinst virt-manager virt-install -y [[email protected] ~]# yum -y install qemu-kvm [[email protected] ~]# systemctl start libvirtd.service #创建桥 [[email protected] ~]# v

网络虚拟化基础一:linux名称空间Namespaces

一 为何要学习网络命名空间 名称空间 许多容器和虚拟化技术中都依赖于网络命名空间. 容器虚拟化技术的典型代表如LXC.Docker.Neutron也使用Linux网络命名空间. 当虚拟交换机,例如虚拟交换机,虚拟交换机 Openvswitch,已安装. 一 介绍 从Linux 2.6.24版的内核开始,Linux 就支持6种不同类型的命名空间.它们的出现,使用户创建的进程能够与系统分离得更加彻底,从而不需要使用更多的底层虚拟化技术. CLONE_NEWIPC: 进程间通信(IPC)的命名空间,可

玩转Linux网络namespace-单机自环测试与策略路由

上周有厂商到公司测试,拿了一块据说很猛的网络处理加速PCIe板卡,拎在手里沉甸甸的很有分量,最让人意淫的是那4个万兆光口,于是我迫不及待的想要一览光口转发时那种看不见的震撼.       可是,仅凭4个光口怎么测试?起码你要有个"对端"啊!任何人应该都不想扛着三台机器在客户们之间跑来跑去测试其转发性能,当然你也不能指望客户那里就一定有你需要的"对端"设备,比如我们公司就没有这种和万兆光口对接的设备,不过赶巧的是,那天还真有一台设备带有万兆光口,但是只是碰巧了.最佳的

Linux网络属性配置命令和管理详解

一.Linux网络属性配置 1.Linux主机接入到网络方式 IP/NETMASK:实现本地网络通信 路由(网关):可以进行跨网络通信 DNS服务器地址:基于主机名的通信,Linux可以有三个DNS地址 当第一个地址本身挂了,才会查找其备用地址:若第一个地址无法解析则停止 2.网络属性配置方式 (1)静态指定 1)命令方式 ifcfg系列命令: ifconfig:配置IP,NETMASK route:配置路由相关信息 netstat:状态及统计数据查看 iiproute2系列命令: ip OBJ

网络虚拟化

网络虚拟化技术OpenVSwitch:虚拟交换机VLAN, VXLAN虚拟路由器 什么是VLAN?Virtual LAN:LAN即为广播帧到的节点范围,也即能够直接通信的范围: VLAN:基于MAC地址基于交换机Port实现基于IP地址实现基于用户实现 交换机接口的类型:访问链接:access link汇聚链接:trunk link VLAN的汇聚方式:IEEE 802.1qISL:Inter Switch Link VLAN间路由:路由器:访问链接:router为每个VLAN提供一个接口汇聚链

Linux网络配置基础及命令使用

网络基础少不了,了解基本概念 MAC:Media Access Conctrol     网卡设备的固定且唯一的硬件地址,用于局域网通讯主机识别            IP:Internet Protocol     由网络号和主机号组成的通讯地址标识,用于界定源和目标主机 DNS:Domain Name System     1.DNS服务器是域名系统,用于解析主机名,实现基于主机名的通讯 2.全球的DNS服务器的域名数据都是相同的,备用DNS的作用是主DNS不可用时(挂掉)顶上,并非在主DN

Linux网络性能优化方法简析

Linux网络性能优化方法简析 2010-12-20 10:56 赵军 IBMDW 字号:T | T 性能问题永远是永恒的主题之一,而Linux在网络性能方面的优势则显而易见,这篇文章是对于Linux内核中提升网络性能的一些优化方法的简析,以让我们去后台看看魔术师表演用的盒子,同时也看看内核极客们是怎样灵活的,渐进的去解决这些实际的问题. AD:2014WOT全球软件技术峰会北京站 课程视频发布 对于网络的行为,可以简单划分为 3 条路径:1) 发送路径,2) 转发路径,3) 接收路径,而网络性