linux虚拟网络设备

准备工作 CentOS7 网卡eth0(192.168.0.3/24)

1.网络命名空间(namespace)

在 Linux 中,网络名字空间可以被认为是隔离的拥有单独网络栈(网卡、路由转发表、iptables)的环境。网络名字空间经常用来隔离网络设备和服务,只有拥有同样网络名字空间的设备,才能看到彼此。

从逻辑上说,网络命名空间是网络栈的副本,有自己的网络设备、路由选择表、邻接表、Netfilter表、网络套接字、网络procfs条目、网络sysfs条目和其他网络资源。

从系统的角度来看,当通过clone()系统调用创建新进程时,传递标志CLONE_NEWNET将在新进程中创建一个全新的网络命名空间。

从用户的角度来看,我们只需使用工具ip来创建一个新的持久网络命名空间。

# 创建网络命名空间
ip netns add ns1

# 查看网络命名空间
ip netns list

# 删除网络命名空间
ip netns delete ns1

1.Linux虚拟网络设备介绍


tap/tun

TAP/TUN设备是一种让用户态程序向内核协议栈注入数据的设备,TAP等同于一个以太网设备,工作在二层;而TUN则是一个虚拟点对点设备,工作在三层。

# 创建tap/tun
ip tuntap add dev tap0 mod tap 
ip tuntap add dev tun0 mod tun

# 删除tap/tun
ip tuntap del dev tap0 mod tap 
ip tuntap del dev tun0 mod tun

veth pair

veth设备总是成对出现,也叫veth pair,一端发送的数据会由另外一端接收。

# 创建veth
ip link add veth type veth peer name veth-peer

# 删除veth,删除其中一个veth pair都会删除
ip link del veth

bridge

bridge,是Linux提供的一种虚拟网络设备之一。其工作方式非常类似于物理的网络交换机设备。Linux Bridge可以工作在二层,也可以工作在三层,默认工作在二层。工作在二层时,可以在同一网络的不同主机间转发以太网报文;一旦你给一个Linux Bridge分配了IP地址,也就开启了该Bridge的三层工作模式。网桥的简单命令如下。

# 创建网桥br1
ip link add br0 type bridge

# 删除网桥br1
ip link del br0

# 将eth0端口加入网桥br0
ip link set dev eth0 master br0

# 从网桥br1中删除eth0
ip link set dev eth0 nomaster

vlan

VLAN的基本原理是在二层协议里插入额外的VLAN协议数据(例如,VLAN Tag)对物理上相互连接的设备进行逻辑网络切割,同时保持和传统二层设备的兼容性。Linux里的VLAN设备是对IEEE 802.1.q 协议的一种内部软件实现,模拟现实世界中的 802.1.q 交换机。vlan的简单命令如下。

# 以太网接口 eth0 中创建名为 VLAN1、ID 为1 的 802.1Q VLAN 接口
ip link add link eth0 name eth0.1 type vlan id 1
# 删除vlan
ip link delete eth0.1

2.Linux虚拟网络设备使用

veth连接主机和namespace

# 创建 namespace
ip netns add ns1
ip netns add ns2

# 创建一对 veth-pair veth0 veth1
ip link add veth0 type veth peer name veth1

# 将 veth0 veth1 分别加入两个 ns
ip link set veth0 netns ns1
ip link set veth1 netns ns2

# 给两个 veth0 veth1 配上 IP 并启用
ip netns exec ns1 ip addr add 10.0.0.2/24 dev veth0
ip netns exec ns1 ip link set veth0 up
ip netns exec ns2 ip addr add 10.0.0.3/24 dev veth1
ip netns exec ns2 ip link set veth1 up

执行ping,查看结果

ip netns exec ns1 ping 10.0.0.3
ip netns exec ns2 ping 10.0.0.2

bridge连接namespace

# 首先创建 bridge br0
ip link add br0 type bridge
ip link set br0 up 

# 然后创建两对 veth-pair
ip link add br-veth0 type veth peer name br-veth0-peer
ip link add br-veth1 type veth peer name br-veth1-peer

# 分别将两对 veth-pair 加入两个 ns 和 br0
ip link set br-veth0 netns ns1
ip link set br-veth0-peer master br0
ip link set br-veth0-peer up

ip link set br-veth1 netns ns2
ip link set br-veth1-peer master br0
ip link set br-veth1-peer up

# 给两个 ns 中的 veth 配置 IP 并启用
ip netns exec ns1 ip addr add 10.0.1.2/24 dev br-veth0
ip netns exec ns1 ip link set br-veth0 up

ip netns exec ns2 ip a a 10.0.1.3/24 dev veth1
ip netns exec ns2 ip link set br-veth1 up

执行ping,查看结果

ip netns exec ns1 ping 10.0.1.3
ip netns exec ns2 ping 10.0.1.2

vlan

# 进入 ns1
ip netns exec ns1

# 设置子接口
ip link add link veth1 name veth0.1 type vlan id 1
ip link add link veth1 name veth0.2 type vlan id 2

ip address add 100.0.2.2/24 dev veth0.1
ip address add 100.0.3.2/24 dev veth0.2

ip link set veth1.1 up
ip link set veth1.2 up

#退出namespace
exit

# 进入 ns2
ip netns exec ns2

# 设置子接口
ip link add link veth1 name veth1.1 type vlan id 1
ip link add link veth1 name veth1.2 type vlan id 2

ip address add 100.0.2.3/24 dev veth1.1
ip address add 100.0.3.3/24 dev veth1.2

ip link set veth1.1 up
ip link set veth1.2 up

#退出namespace
exit

执行ping,查看结果

ip netns exec ns1 ping 10.0.2.3
ip netns exec ns2 ping 10.0.3.3

host与namespace通过veth连接

ip link add host-veth type veth peer name host-veth-peer
ip link set host-veth-peer netns ns1

ip netns exec ns1 ip addr add 10.0.4.2/24 dev host-veth-peer
ip netns exec ns1 ip link set host-veth-peer up
ip addr add 10.0.4.3/24 dev veth1
ip link set host-veth up

# ns配置默认route
ip route del default via 10.0.4.3

# 开启内核转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# 配置host使能IP伪装
iptables -t nat -A POSTROUTING -s 10.0.4.0/255.255.255.0 -o eth0 -j MASQUERADE

执行ping,查看结果

ip netns exec ns1 ping 192.168.0.3

# ping 192.168.0.3网关地址192.168.0.1
ip netns exec ns1 ping 192.168.0.1
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值