配置 UML 网络¶
UML网络被设计为模拟以太网连接。这种连接可以是点对点(类似于使用背靠背电缆的机器之间的连接),也可以是与交换机的连接。UML支持各种各样的方法来构建这些连接:本地机器、远程机器、本地和远程UML以及其他VM实例。
| Transport | Type | Capabilities | Throughput |
|---|---|---|---|
| tap | vector | checksum, tso | > 8Gbit |
| hybrid | vector | checksum, tso, multipacket rx | > 6GBit |
| raw | vector | checksum, tso, multipacket rx, tx” | > 6GBit |
| EoGRE | vector | multipacket rx, tx | > 3Gbit |
| Eol2tpv3 | vector | multipacket rx, tx | > 3Gbit |
| bess | vector | multipacket rx, tx | > 3Gbit |
| fd | vector | dependent on fd type | varies |
| tuntap | legacy | none | ~ 500Mbit |
| daemon | legacy | none | ~ 450Mbit |
| socket | legacy | none | ~ 450Mbit |
| pcap | legacy | rx only | ~ 450Mbit |
| ethertap | legacy | obsolete | ~ 500Mbit |
| vde | legacy | obsolete | ~ 500Mbit |
所有具有tso和校验和卸载的传输都可以在TCP流上提供接近10G的速度。
所有具有多包rx和/或tx的传输都可以提供高达1mp或更高的pps速率。
所有传统传输通常限制在~600-700MBit和0.05Mps。
GRE和L2TPv3允许连接到所有:本地机器、远程机器、远程网络设备和远程UML实例。
套接字只允许在UML实例之间建立连接。
daemon和bess需要运行本地交换机。该交换机也可以连接到主机。
网络配置权限¶
大多数支持的网络模式都需要root权限。例如,在传统的tuntap组网模式下,用户需要属于与隧道设备相关联的组。
对于较新的网络驱动程序,如矢量传输,需要root权限来触发ioctl来设置tun接口和/或在需要的地方使用原始套接字。
这可以通过授予用户特定的功能而不是作为根运行UML来实现。在矢量传输的情况下,用户可以将CAP_NET_ADMIN或CAP_NET_RAW功能添加到uml二进制文件中。从那时起,UML就可以在正常用户权限下运行,并具有完整的联网功能。
例如:
sudo setcap cap_net_raw,cap_net_admin+ep linux
配置适量传输¶
所有矢量传输都支持类似的语法:
如果X是接口编号,如vec0, vec1, vec2等,则选项的一般语法为:
vecX:transport="Transport Name",option=value,option=value,...,option=value
常见选项¶
这些选项在所有传输中都很常见:
depth=int -设置向量IO的队列深度。这是UML将尝试在单个系统调用中读取或写入的数据包数量。默认值是64,对于大多数需要2-4 Gbit范围内吞吐量的应用程序来说,这通常已经足够了。更高的速度可能需要更大的值。
mac=XX:XX:XX:XX:XX -设置接口的mac地址值。
gro=[0,1] -设置gro开关。启用接收/发送卸载。此选项的效果取决于正在配置的传输中的主机端支持。在大多数情况下,它将启用TCP分段和RX/TX校验和卸载。主机端和UML端的设置必须是相同的。如果不是,UML内核将产生警告。例如,GRO在默认情况下是在本地机器接口上启用的(例如,veth对,桥接,等等),因此它应该在UML中相应的UML传输(原始的,tap的,混合的)中启用,以便网络能够正确运行。
mtu=int -设置接口的mtu
headroom=int -如果需要将数据包重新封装到VXLAN中,则调整默认的预留空间(32字节)。
vec=0 -禁用多包IO,并回到包在一个时间模式
共享选项¶
绑定到本地网络接口的传输有一个共享选项——要绑定到的接口的名称。
src, dst, src_port, dst_port—所有使用套接字的传输都使用这些来指定源和目标和/或源端口和目标端口的概念。
v6=[0,1]指定是否希望在IP上运行的所有传输都使用v6连接。此外,对于在v4和v6上操作方式有所不同的传输(例如EoL2TPv3),设置正确的操作模式。在没有此选项的情况下,套接字类型是根据src和dst参数解析/解析到的内容来确定的
流式传输¶
例如:
vecX:transport=tap,ifname=tap0,depth=128,gro=1
这将把vec0连接到主机上的tap0。Tap0必须已经存在(例如使用tunctl创建)并且启用。
可以将tap0配置为点对点接口,并给它一个IP地址,以便UML可以与主机通信。另外,也可以将UML连接到连接到桥的tap接口。
虽然tap依赖于矢量基础设施,但在这一点上它不是一个真正的矢量传输,因为Linux不支持像UML这样的普通用户空间应用程序的tap文件描述符上的多包IO。这是一种特权,只提供给可以在内核级别通过专用接口(如vhost-net)连接到它的东西。计划在将来的某个时候为UML提供一个类似vhost-net的帮助器。
所需特权(tap传输需要):
点击接口以存在,并被创建为持久的,并由UML用户使用tunctl拥有。使用实例
tunctl -u uml-user -t tap0二进制文件具有CAP_NET_ADMIN权限
混合传输¶
例如:
vecX:transport=hybrid,ifname=tap0,depth=128,gro=1
这是一个实验/演示传输,它耦合了用于发送的tap和用于接收的原始套接字。原始套接字允许多数据包接收,导致数据包速率明显高于普通tap。
所需的特权:混合需要UML用户的CAP_NET_RAW能力,以及对tap传输的需求。
raw socket 传输¶
例如:
vecX:transport=raw,ifname=p-veth0,depth=128,gro=1
此传输在原始套接字上使用矢量IO。虽然您可以绑定到任何接口,包括物理接口,但最常用的是将其绑定到第v对的“对等”端和主机上配置的另一端。
debian的主机配置示例:
# /etc/network/interfaces:
auto veth0
iface veth0 inet static
address 192.168.4.1
netmask 255.255.255.252
broadcast 192.168.4.3
pre-up ip link add veth0 type veth peer name p-veth0 && \
ifconfig p-veth0 up
UML现在可以像这样绑定到p-veth0:
vec0:transport=raw,ifname=p-veth0,depth=128,gro=1
如果UML客户机配置了192.168.4.2和子网掩码255.255.255.0,它可以与192.168.4.1上的主机通信
原始传输还提供了一些支持,可以将一些过滤卸载到主机上。控制它的两个选项是:
bpffile =str作为套接字过滤器加载的原始BPF代码的文件名
bpfflash=int 0/1允许从用户模式Linux内部加载bpf。这个选项允许使用ethtool load firmware命令来加载bpf代码。
在这两种情况下,bpf代码都被加载到主机内核中。虽然这目前仅限于遗留的bpf语法(不是ebpf),但它仍然是一个安全风险。除非用户模式Linux实例被认为是可信的,否则不建议允许这样做。
所需特权:原始套接字传输需要CAP_NET_RAW功能。
GRE 套接字传输¶
例子:
vecX:transport=gre,src=$src_host,dst=$dst_host
这将配置一个以太网通过GRE(又名GRETAP或GREIRB)隧道,它将UML实例连接到主机dst_host上的GRE端点。GRE支持以下附加选项:
rx_key=int - GRE 32位整数rx报文的key值,如果设置了,则必须设置txkey值
tx_key=int - GRE的32位整数tx报文的key,如果设置了rx_key也必须设置
sequence=[0,1] -使能GRE序列
pin_sequence =[0,1] -假装序列总是在每个数据包上重置(需要与一些真正破碎的实现进行互操作)
v6=[0,1] - force IPv4或IPv6套接字
目前不支持GRE校验和
GRE有一些注意事项:
每个IP地址只能使用一个GRE连接。由于每个GRE隧道都直接在UML实例上终止,因此无法实现多路连接。
key并不是真正的安全功能。虽然它的本意是这样的,但它的“安全性”却是可笑的。然而,这是一个确保隧道没有被错误配置的有用特性。
一个本地地址为192.168.128.1的Linux主机连接到192.168.129.1的UML实例的示例配置
# /etc/network/interfaces:
auto gt0
iface gt0 inet static
address 10.0.0.1
netmask 255.255.255.0
broadcast 10.0.0.255
mtu 1500
pre-up ip link add gt0 type gretap local 192.168.128.1 \
remote 192.168.129.1 || true
down ip link del gt0 || true
此外,GRE已经在各种网络设备上进行了测试。
权限要求:GRE要求CAP_NET_RAW