当使用 OpenVPN 客户端从特定互联网连接传输大量数据时,OpenVPN 服务器网络的互联网连接将完全中断。其他 OpenVPN 客户端在传输相同数据时不会导致这种性能影响。
服务器网络具有异步互联网连接,上行速度为 9600kbit/s(用 测量iperf
),下行速度约为 50MBit/s。
从 OpenVPN 服务器到特定客户端的传输仅使用大约 2-3MBit/s,而可用的上行速度约为 10MBit/s。客户端的下行速度要大得多,因此这不是问题所在。
首先,我发现发往该特定客户端的 OpenVPN 数据包被碎片化,因此我tun-mtu
使用以下服务器端配置手动调整了 OpenVPN 中的设置:
tun-mtu 1492
push "tun-mtu 1492"
这不是问题的根源,因此我尝试在tc
调制解调器和服务器端网络之间的 Linux 路由器上配置流量整形。
这是我用来配置流量整形的脚本(eth2
是连接到互联网的接口):
tc qdisc add dev eth2 root handle 1: htb default 12
tc class add dev eth2 parent 1: classid 1:1 htb rate 9500kbit
tc class add dev eth2 parent 1:1 classid 1:10 htb rate 2Mbit ceil 9500kbit prio 0
tc class add dev eth2 parent 1:1 classid 1:11 htb rate 2Mbit ceil 9500kbit prio 1
tc class add dev eth2 parent 1:1 classid 1:12 htb rate 2Mbit ceil 9500kbit prio 2
tc class add dev eth2 parent 1:1 classid 1:13 htb rate 1Mbit ceil 9500kbit prio 3
tc class add dev eth2 parent 1:1 classid 1:14 htb rate 1Mbit ceil 3Mbit prio 4
# match tcp ack packets
tc filter add dev eth2 parent 1:0 protocol ip prio 0 u32 \
match ip protocol 6 0xff \
match u8 0x05 0x0f at 0 \
match u16 0x0000 0xffc0 at 2 \
match u8 0x10 0xff at 33 \
flowid 1:10
# match OpenVPN traffic in both directions
tc filter add dev eth2 parent 1:0 prio 1 u32 match ip sport 1194 0xffff match ip protocol 0x11 0xff flowid 1:14
tc filter add dev eth2 parent 1:0 prio 2 u32 match ip dport 1194 0xffff match ip protocol 0x11 0xff flowid 1:14
# match traffic using TOS flags to three bands mainly according to man 8 tc-prio
tc filter add dev eth2 parent 1:0 prio 3 u32 match ip tos 0x10 0x18 flowid 1:11
tc filter add dev eth2 parent 1:0 prio 4 u32 match ip tos 0x02 0x1E flowid 1:13
tc filter add dev eth2 parent 1:0 prio 5 u32 match ip tos 0x08 0x18 flowid 1:13
目的是使所有流量的优先级高于 OpenVPN 流量,并且仅额外提供少量可用带宽。
这仍然没有帮助。使用分析流量时,我无法找出任何重传tcpdump
。
我说的“网络连接完全中断”是指其他互联网连接几乎总是超时,传输速度非常慢(低于 1kbit/s)。尝试以 OpenVPN 连接以外的其他方式使用互联网不会影响正在运行的 OpenVPN 数据传输,从而导致速度变慢。
与服务器网络的“中断”的互联网连接相比,OpenVPN 传输速度“缓慢”并不是一个真正的问题。
哪些原因可能导致网络故障?
我可以在哪里进一步调查?