我好奇:开销有多大 SSH
相比介绍telnet
?
显然这里有不同的部分:
- 由于加密的额外往返而导致的初始连接时间开销
- 是否存在带宽开销?
- 每个传输的数据包是否有开销
- 或者我们最后只有一些填充?
- 客户端的 CPU 开销
- 服务器端的 CPU 开销
- 它有多大?
- 具有 AES 模块的较新的 CPU 怎么样?
- 那么具有数十或数百个 SSH 连接的服务器该怎么办?
- 客户端和服务器的每个连接的 CPU 开销是否对称?
- 有内存开销吗?
- 我是不是忘了什么?
这更像是一个理论问题。我完全清楚,在服务器仅维护几个 ssh 连接的典型情况下,这实际上没有什么区别。
答案1
我会快速回答你,因为冗长的解释很容易填满 90 分钟的讲座或演讲。这些只是估算,因为它很大程度上取决于系统负载、你在服务器上建立的连接类型,当然还有所使用的硬件。
- 是也不是。1 GB 数据或 1 小时连接时间后需要重新密钥。还可能取决于是否使用密钥进行身份验证。Diffie-Hellman 通常比 RSA 密钥交换更昂贵,但由于它只发生一次(左右),所以没什么大不了的。
- 是的,存在开销:您必须添加至少 4 个字节的随机填充(SSH2),并且每个数据包都会获得某种 HMAC。取决于使用的内容。我不知道具体是多少,但最多 33 个字节(完整 sha2 长度)时会更少,最大有效载荷为 35000 - 4 字节填充。您获得大约 37/34996 = 0.001% 的开销或更少。
- CPU 开销最小。这是 AES 标准的目标之一。
- 我也是。它大致是对称的,因为加密操作是对称的(类似于乘法和除法是对称的),当然这需要知道密钥。服务器可以处理多少个连接?取决于连接。如果您有简单的终端会话:很多。如果有人向您发送 1 GBit 连接并通过 scp 复制 10 GB 的数据:使用标准英特尔 i7 可能一次复制两三个。很可能您的 NIC 或存储瓶颈首先出现。
- 不确定。有点可能。我认为不会超过正常 telnet 会话内存的两倍。
答案2
总结
隧道模式下的 SSH 带宽开销可以忽略不计
在这个 LAN 测试场景中,相反方向的数据包甚至更少,减少了大约 50%。
如何获取带宽开销的详细信息:
设置:
在服务器上运行
iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 128 KByte (default)
------------------------------------------------------------
在客户端我们建立与服务器的 SSH 连接, 但未启用 SSH 压缩。ssh -L 5001:127.0.0.1:5001 [email protected]
为了监控流量,我们添加了
sudo iptables -A INPUT -p tcp --src 192.168.178.55/32 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dst 192.168.178.55/32 -j ACCEPT
因此首先尝试直接连接:
iperf -c 192.168.178.55 -n 1000M
------------------------------------------------------------
Client connecting to 192.168.178.55, TCP port 5001
TCP window size: 83.1 KByte (default)
------------------------------------------------------------
[ 3] local 192.168.178.21 port 60824 connected with 192.168.178.55 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-89.5 sec 1000 MBytes 93.8 Mbits/sec
第一个结果
sudo iptables -L -v
Chain INPUT (policy ACCEPT 609 packets, 30850 bytes)
pkts bytes target prot opt in out source destination
342K 14M ACCEPT tcp -- any any 192.168.178.55 anywhere
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 968 packets, 99600 bytes)
pkts bytes target prot opt in out source destination
93424 1053M ACCEPT tcp -- any any anywhere 192.168.178.55
iptables -Z
在第二次尝试中,计数器被刷新
sudo iptables -L -v
Chain INPUT (policy ACCEPT 387 packets, 19661 bytes)
pkts bytes target prot opt in out source destination
344K 14M ACCEPT tcp -- any any 192.168.178.55 anywhere
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 626 packets, 64440 bytes)
pkts bytes target prot opt in out source destination
93166 1053M ACCEPT tcp -- any any anywhere 192.168.178.55
现在 ssh 连接
iperf -c 127.0.0.1 -n 1000M
------------------------------------------------------------
Client connecting to 127.0.0.1, TCP port 5001
TCP window size: 2.50 MByte (default)
------------------------------------------------------------
[ 3] local 127.0.0.1 port 38080 connected with 127.0.0.1 port 5001
[ ID] Interval Transfer Bandwidth
[ 3] 0.0-89.4 sec 1000 MBytes 93.8 Mbits/sec
第一个发现:尽管我们有一个 Raspberry PI 3B 作为服务器和一个 Raspberry PI 4B 作为客户端,通过 2 个交换机通过有线 LAN 连接,并且 PI 3B 进行备份,从而在测试时发送了大量数据(这里我们只测量了从 PI4 发送到 PI3B 的数据),但速度是一样的
sudo iptables -L -v
Chain INPUT (policy ACCEPT 27327 packets, 1050M bytes)
pkts bytes target prot opt in out source destination
154K 6540K ACCEPT tcp -- any any 192.168.178.55 anywhere
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 27791 packets, 1050M bytes)
pkts bytes target prot opt in out source destination
79099 1053M ACCEPT tcp -- any any anywhere 192.168.178.55
使用 ssh 时,我们传输的数据包更少,但总数据量相同。因此带宽开销微不足道,尤其是与 OpenVPN 相比,OpenVPN 的最大数据包大小约为 5%https://serverfault.com/questions/249935/openvpn-performance
第二次尝试
sudo iptables -L -v
Chain INPUT (policy ACCEPT 27450 packets, 1050M bytes)
pkts bytes target prot opt in out source destination
190K 8025K ACCEPT tcp -- any any 192.168.178.55 anywhere
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 27683 packets, 1050M bytes)
pkts bytes target prot opt in out source destination
90036 1054M ACCEPT tcp -- any any anywhere 192.168.178.55
这里我们比第一次尝试多出了大约 14% 的数据包,但仍然比直接连接少了 3000 个数据包。与直接连接相比,我们多传输了 1MB。在这种情况下,也就是 0.09%,而且由于我们以 MB 级别进行测量,因此开销可能会少很多。
我认为输入端驻留的数据包明显较少,是因为 ssh 会合并一些 TCP_ACK 并将它们合并发送。我真的很惊讶通过 ssh 隧道传输的数据较少,并搜索了此实验中的任何错误,但找不到它。