socat 与 TUN 设备

socat 与 TUN 设备

我一直在研究 socat,并尝试使用 socat 创建 TUN 设备,用于在两个 debian stretch 服务器之间建立隧道。但是,吞吐量似乎非常低,与 iperf 和本地主机上的 TCP/TCP-Listen 相比,TUN 的吞吐量大约低了 5 个数量级。

这是一个“最小工作示例”来展示速度是如何受到影响的。

socat 与 TUN 设备

服务器端:

# socat
socat TUN:10.10.0.2/16,iff-up TCP4-LISTEN:54321,bind=192.168.1.2,fork
# iperf service
iperf -s -p 15001 -B 10.10.0.2

客户端:

# socat
socat TUN:10.10.0.1/16,iff-up TCP4:192.168.1.2:54321
# iperf
iperf -c 10.10.0.2 -p 15001 -t 30

socat 与 TCP/TCP-LISTEN

服务器端:

# socat
socat TCP4-LISTEN:12345,bind=192.168.1.2,fork TCP4:127.0.0.1:15001
# iperf service
iperf -s -p 15001 -B 127.0.0.1

客户端:

# socat
socat TCP4-LISTEN:54321,bind=127.0.0.1,fork TCP4:192.168.1.2:12345
# iperf
iperf -c 127.0.0.1 -p 54321 -t 30

结果

TUN 设备:

[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-39.7 sec   640 KBytes   132 Kbits/sec

TCP/TCP监听:

[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-30.0 sec  3.30 GBytes   944 Mbits/sec

如果您想使用上面的行重现结果,您需要以某种方式在后台或守护进程中运行 socat 行和 iperf 服务器端,我只是使用屏幕会话。

因此,虽然我假设吞吐量会受到一定程度的影响,但对我来说,吞吐量从假设的千兆位(两台服务器在同一交换机上)降级到仅仅 100KBit 似乎很奇怪。快速浏览一下,atop没有发现任何明显的瓶颈,所以这不仅仅是 CPU 上限或消耗 RAM。

为什么吞吐量这么低?我犯了逻辑错误吗?还是内核出了问题,socat 实现错误,或者 iperf 使用错误?

是否有任何参数或设置(内核、socat 等)可以改善这种情况?我可以检查什么?而且,最重要的是,有没有办法使用 TUN 设备来提供有用的吞吐量?

答案1

socat当我使用蓝牙串行连接(通过)在两台计算机之间创建 IP 连接时,我遇到了类似的问题rfcomm。原始串行连接相当快(15 KiB/s 左右),但是当通过 socat 创建的 TUN 设备连接到 Web 服务器时,速度非常慢,浏览器在加载一段时间后最终放弃。

socat 手册页确实说明了以下内容。

Note that streaming eg. via TCP or SSL does not guarantee to retain packet boundaries and may thus cause packet loss.

这让我怀疑数据包是否被丢弃或截断。果然,tcpdump -i tun0显示许多数据包缺少字节(有些缺少超过 140 个字节)。查看的 MTU(最大传输单元 - 数据包大小)tun0,我发现它是 1500(ip link)。但是,根据hciconfig --all(如果我正确读取其输出的话),蓝牙 MTU 是 1021(?)字节。

因此,为了进行测试,我将 MTU tun0(隧道两侧 - 两台计算机上)减小到 100 字节。这有效……嗯,它仍然不是超级快,但我通过蓝牙连接,速度比以前快得多。至少我不再遇到任何连接问题。请注意,这个值可能可以设置得更大,但我只是在测试它是否能解决问题。

下面是将 socat 创建的设备上的 MTU 更新tun0为 100 字节的命令(在调用 socat 之后)。这需要在两个系统上运行(并且可能应该匹配)。

ip link set mtu 100 tun0

因此,您可以执行以下操作。

服务器端:

# socat
socat TUN:10.10.0.2/16,iff-up TCP4-LISTEN:54321,bind=192.168.1.2,fork

# set MTU to 100
ip link set mtu 100 tun0

# iperf service
iperf -s -p 15001 -B 10.10.0.2

客户端:

# socat
socat TUN:10.10.0.1/16,iff-up TCP4:192.168.1.2:54321

# Set MTU to 100
ip link set mtu 100 tun0

# iperf
iperf -c 10.10.0.2 -p 15001 -t 30

注意:您可以使用ip link显示所有链接 -如果不工作的话,tun寻找正确的设备。tun0

相关内容