OpenVPN 服务器丢包

Geo*_*rge 2 networking debian openvpn tcp udp

我有一个带有Debian 8和的 OpenVPN 服务器OpenVPN 2.3.14 x86_64-pc-linux-gnu。今天我发现丢包了。我的服务器位于 TCP 端口 443 上。

Ping statistics for 144.76.41.103:
    Packets: Sent = 1135, Received = 1121, Lost = 14 (1% loss),
Approximate round trip times in milli-seconds:
    Minimum = 29ms, Maximum = 961ms, Average = 51ms
Run Code Online (Sandbox Code Playgroud)

其他统计:

Ping statistics for 144.76.41.103:
    Packets: Sent = 1135, Received = 1121, Lost = 70 (5% loss),
Approximate round trip times in milli-seconds:
    Minimum = 29ms, Maximum = 961ms, Average = 51ms
Run Code Online (Sandbox Code Playgroud)

服务器配置:

port 443
float
proto tcp
dev tun2

ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/1.crt
key /etc/openvpn/keys/1.key
dh /etc/openvpn/keys/dh2048.pem
tls-auth /etc/openvpn/keys/ta.key 0

server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
script-security 3
auth-user-pass-verify "/etc/openvpn/auth.sh" via-env
keepalive 20 100
cipher BF-CBC
max-clients 100
persist-key
persist-tun
username-as-common-name
log logs/443tcp.log
log-append logs/443app.log
status status/443tcp_status.log 60
verb 2
mute 15
inactive 1200
comp-lzo
reneg-sec 86400
up /etc/openvpn/up.sh
Run Code Online (Sandbox Code Playgroud)

因此,我的应用程序、SSH 控制台,当然还有在线游戏经常出现延迟(冻结一秒钟)。

有什么想法可能导致这种情况吗?

Anu*_*ioz 5

您需要为 VPN 链接设置正确的 MTU。您可以使用命令确定该值ping。开始从客户端 ping 服务器

ping -M do -s 1500 -c 1 10.8.0.1
Run Code Online (Sandbox Code Playgroud)

大概会说ping: local error: Message too long, mtu=1500

每次将 1500 值减少 10,直到 ping 成功。一旦 ping 成功,所使用的值就是您应该使用的 MTU。OpenVPN 需要设置一个称为 MSS 的值。MSS 是 MTU 减去 40 的值。

例如。如果您的 MTU 是 1460,则您的 MSS 是 1420

MSS = MTU  - 40
MSS = 1460 - 40
MSS = 1420
Run Code Online (Sandbox Code Playgroud)

要设置 OpenVPN 的 MSS,请添加以下服务器配置行(将 1420 替换为适当的值)。

mssfix 1420
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下配置指令打开 MSS 自动发现:

tun-mtu 1460
mtu-disc yes
Run Code Online (Sandbox Code Playgroud)

更多信息

  • @bd1251252 确实不错,可以稍微改进一下:```for i in {1500..900..-2}; 做 ping -M 做 -c 1 10.8.0.1 -s "$i" 2>&1 | grep -q '1 收到' && 中断; 完毕; 回声 $i``` (3认同)
  • `对于 {1500..900..-10} 中的 i;做 ping -M 做 -c 1 10.8.0.1 -s "$i"; 完成`-当我看到 ping 成功时我就停止它。 (2认同)