OpenVPN 성능이 저하됩니다. MTU 문제가 있습니까? 내부 덤프 나에게 이것은 거의 변하지

회선 속도에 도달하지 않는 OpenVPN 터널에 문제가 있습니다. 게이트웨이는 OVH에서 호스팅되는 Debian Jessy 가상 서버입니다. 클라이언트는 내 freebsd 10.2 홈 서버 (Intel I3 Ivy Bridge) 또는 내 RaspberryPI2입니다. 암호화 및 인증을 비활성화했습니다. 100mbit / s 대칭 FTTH 연결이 있지만 터널은 20-40mbit / s의 속도에만 도달합니다. 터널없이 직접 연결하면 항상 100mbit / s가 예상됩니다. iperf3로 성능을 테스트했습니다. 먼저 freebsd 홈 서버로 시도했습니다. mssfix, fragment 등에 대한 모든 권장 설정을 시도했습니다.

그렇다면 나는 그것이 내 freebsd 기계라고 생각했습니다. 그래서 나는 RPI2에 신선한 라즈 비안 Jessy를 설치하고 깊이 테스트를 더했습니다.

우선 OpenVPN 구성에서 모든 MTU 설정을 제거하고 경로 MTU가 물건을 처리하도록하십시오. 두 컴퓨터에서 방화벽이 활성화되어 있지 않으므로 작동해야합니다. 이들은 내 VPN 설정입니다 :

server 10.8.0.0 255.255.255.0
port 1194
proto udp
dev tun
sndbuf 0
rcvbuf 0

user nobody
group nogroup
persist-key
persist-tun
ifconfig-pool-persist ipp.txt
keepalive 10 120
push "redirect-gateway def1"
status openvpn-status.log
verb 3

ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/vpn.theissen.io.crt
key /etc/openvpn/easy-rsa/keys/vpn.theissen.io.key
dh /etc/openvpn/easy-rsa/keys/dh4096.pem
tls-auth /etc/openvpn/easy-rsa/keys/ta.key 0
cipher none
auth none
comp-lzo no



client
proto udp
dev tun12
remote xxx.io 1194
resolv-retry infinite
sndbuf 0
rcvbuf 0

nobind
user nobody
group nogroup
persist-key
persist-tun
verb 3

pkcs12 /etc/openvpn/vpn.theissen.io/alex.p12
tls-auth /etc/openvpn/vpn.theissen.io/ta.key 1
ns-cert-type server
cipher none
auth none
comp-lzo no

우선 터널이없는 테스트는 서버와의 연결이 거의 100mbit / s임을 보여줍니다.

iperf3 -c vpn.theissen.io
Connecting to host vpn.theissen.io, port 5201
[  4] local 192.168.1.253 port 34512 connected to 149.202.58.183 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  10.8 MBytes  90.5 Mbits/sec    0    335 KBytes
[  4]   1.00-2.00   sec  11.4 MBytes  95.7 Mbits/sec    0    335 KBytes
[  4]   2.00-3.00   sec  11.1 MBytes  93.0 Mbits/sec    0    352 KBytes
[  4]   3.00-4.00   sec  11.2 MBytes  94.0 Mbits/sec    0    369 KBytes
[  4]   4.00-5.00   sec  11.5 MBytes  95.9 Mbits/sec    0    390 KBytes
[  4]   5.00-6.00   sec  11.0 MBytes  92.5 Mbits/sec    0    390 KBytes
[  4]   6.00-7.00   sec  11.4 MBytes  95.2 Mbits/sec    0    390 KBytes
[  4]   7.00-8.00   sec  11.2 MBytes  94.3 Mbits/sec    0    390 KBytes
[  4]   8.00-9.00   sec  11.1 MBytes  93.3 Mbits/sec    0    390 KBytes
[  4]   9.00-10.00  sec  11.3 MBytes  95.1 Mbits/sec    0    390 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   112 MBytes  93.9 Mbits/sec    0             sender
[  4]   0.00-10.00  sec   112 MBytes  93.5 Mbits/sec                  receiver

iperf Done.

이 연결의 패킷은 서버에서 tcpdump로 덤프했습니다. 여기에서 다운로드 할 수 있습니다 (wireshark로 열려면 압축을 풀어야 함 ) : dumpraw.cap.xz

이것이 “OK”덤프의 모습입니다. 내가 발견 한 최대 프레임 크기는 1514입니다.
터널없는 iperf3 덤프

이제 터널에서 테스트를 실행했습니다.

iperf3 -c 10.8.0.1
Connecting to host 10.8.0.1, port 5201
[  4] local 10.8.0.14 port 36388 connected to 10.8.0.1 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  5.96 MBytes  50.0 Mbits/sec  127    133 KBytes
[  4]   1.00-2.00   sec  5.19 MBytes  43.5 Mbits/sec    6    120 KBytes
[  4]   2.00-3.00   sec  5.80 MBytes  48.7 Mbits/sec    0    151 KBytes
[  4]   3.00-4.00   sec  4.27 MBytes  35.9 Mbits/sec   23   96.5 KBytes
[  4]   4.00-5.00   sec  4.89 MBytes  41.0 Mbits/sec    0    129 KBytes
[  4]   5.00-6.00   sec  6.11 MBytes  51.2 Mbits/sec   26    111 KBytes
[  4]   6.00-7.00   sec  5.50 MBytes  46.1 Mbits/sec    0    143 KBytes
[  4]   7.00-8.00   sec  5.25 MBytes  44.1 Mbits/sec   15    126 KBytes
[  4]   8.00-9.00   sec  5.80 MBytes  48.7 Mbits/sec    0    158 KBytes
[  4]   9.00-10.00  sec  3.97 MBytes  33.3 Mbits/sec   22    105 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  52.7 MBytes  44.2 Mbits/sec  219             sender
[  4]   0.00-10.00  sec  52.3 MBytes  43.8 Mbits/sec                  receiver

iperf Done.

으악. 더 이상 좋지 않습니다. 특히이 “Retr”열은 그리 좋아 보이지 않습니다. 나는 이것이 tcp retransmit이라고 가정하고 덤프에 무언가가 있어야합니다. 우리는 그렇지 않다는 것을 알게 될 것입니다 : /. 암호화 및 인증을 비활성화했기 때문에 CPU가 병목 현상이 아닙니다. 테스트 중 CPU는 서버에서 20 %, PI에서 50 %입니다.

테스트의 OpenVPN 트래픽은 다음과 같습니다.

나에게 이것은 괜찮아 보인다. 그러나 나는 무엇을 찾아야할지 모르겠습니다. wireshark가있는 덤프를보십시오 : dump_physical.cap.xz

터널 인터페이스의 트래픽도 나에게 좋아 보인다. 그는 프레임 크기를 올바르게 낮추는 것처럼 보입니다 (1444로 보입니다).

덤프는 다음과 같습니다. dump_tunnel.cap.xz

나에게 이것은 모두 괜찮아 보이지만 정확히 무엇을 찾아야할지 전혀 모른다. OpenVPN 설정으로 모든 것을 실제로 테스트했습니다. 어쩌면 누군가 교통량이 괜찮은지 말해 줄 수 있습니다.

내가 대답으로 기대하는 것

적어도 여기서 일어나는 일과 왜 내가 사용하는 VPN 소프트웨어와 독립적 인 것처럼 보이는지 설명하십시오. 인터넷에서 찾은 모든 것은 MTU 문제에 관한 것이지만 터널 MTU 또는 OpenVPN의 다른 매개 변수를 줄이면 쉽게 해결할 수 있습니다. 나에게 이것은 거의 변하지 않는다. 덤프를 보면 tcp 세그먼트 크기가 줄어들고 패킷이 조각화되지 않음을 알 수 있습니다. 다른 것이 있어야합니다. 나는 정말로 무엇 을 알고 싶습니다 .

최신 정보

나는 이것을 strongswan과 softether로 테스트했습니다. 실제로 동일한 문제입니다 (비교할만한 속도, CPU 병목 현상 없음). 나는 여기서 문제가 무엇인지 정말로 당황합니다. 또한 다른 게이트웨이 (친구 100/100 홈 연결의 RaspberryPi2)를 시도했습니다.

업데이트 2

iperf3는 tcp 재전송 (retr)을보고하지만 덤프에는 재전송이 없습니다 (Wireshark가 강조 표시해야 함). 무슨 일이야?

로컬 네트워크 (RaspberryPi2 to FreebsdServer)에서 OpenVPN을 시도했습니다. 심지어 거기에도 많은 재전송이 있습니다 (LAN ?!) :

Connecting to host 192.168.222.11, port 5201
[  4] local 192.168.222.10 port 46196 connected to 192.168.222.11 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  9.19 MBytes  77.0 Mbits/sec    8    141 KBytes
[  4]   1.00-2.00   sec  8.71 MBytes  73.1 Mbits/sec    3    130 KBytes
[  4]   2.00-3.00   sec  8.59 MBytes  72.0 Mbits/sec    3    120 KBytes
[  4]   3.00-4.00   sec  8.65 MBytes  72.5 Mbits/sec    4    108 KBytes
[  4]   4.00-5.00   sec  8.65 MBytes  72.5 Mbits/sec    4   95.6 KBytes
[  4]   5.00-6.00   sec  8.52 MBytes  71.5 Mbits/sec    2   80.5 KBytes
[  4]   6.00-7.00   sec  8.83 MBytes  74.1 Mbits/sec    0    141 KBytes
[  4]   7.00-8.00   sec  8.59 MBytes  72.0 Mbits/sec    7    106 KBytes
[  4]   8.00-9.00   sec  8.71 MBytes  73.1 Mbits/sec    3   94.2 KBytes
[  4]   9.00-10.00  sec  8.59 MBytes  72.0 Mbits/sec    3   79.2 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  87.0 MBytes  73.0 Mbits/sec   37             sender
[  4]   0.00-10.00  sec  86.8 MBytes  72.8 Mbits/sec                  receiver

역 모드에서는 정말 이상한 혼잡 창이 있습니다 (wtf?).

Accepted connection from 192.168.222.10, port 46197
[  5] local 192.168.222.11 port 5201 connected to 192.168.222.10 port 46198
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  5]   0.00-1.00   sec  8.90 MBytes  74.7 Mbits/sec    3   1.48 GBytes
[  5]   1.00-2.00   sec  8.45 MBytes  70.9 Mbits/sec    2   1.59 GBytes
[  5]   2.00-3.00   sec  8.66 MBytes  72.7 Mbits/sec  518    214 MBytes
[  5]   3.00-4.00   sec  7.96 MBytes  66.8 Mbits/sec   37    703 MBytes
[  5]   4.00-5.00   sec  8.09 MBytes  67.9 Mbits/sec    0    719 MBytes
[  5]   5.00-6.00   sec  8.04 MBytes  67.5 Mbits/sec    0    734 MBytes
[  5]   6.00-7.00   sec  8.07 MBytes  67.7 Mbits/sec    1    703 MBytes
[  5]   7.00-8.00   sec  8.07 MBytes  67.7 Mbits/sec    1    703 MBytes
[  5]   8.00-9.00   sec  7.99 MBytes  67.1 Mbits/sec    2    693 MBytes
[  5]   9.00-10.00  sec  8.06 MBytes  67.6 Mbits/sec    1    693 MBytes
[  5]  10.00-10.09  sec   684 KBytes  64.5 Mbits/sec    0    695 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  5]   0.00-10.09  sec  83.0 MBytes  69.0 Mbits/sec  565             sender
[  5]   0.00-10.09  sec  0.00 Bytes  0.00 bits/sec                  receiver

업데이트 3

idpf를 udp와 함께 사용하면 ovh가 해당 포트를 일시적으로 차단하고 (공격에 대해 알려주는 이메일을 보내줍니다) 엄청난 패킷 손실이 발생합니다.

-----------------------------------------------------------
Server listening on 1194
-----------------------------------------------------------
Accepted connection from 185.22.143.160, port 15906
[  5] local 149.202.58.183 port 1194 connected to 185.22.143.160 port 4355
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  5]   0.00-1.00   sec  2.89 MBytes  24.2 Mbits/sec  0.727 ms  1017/1387 (73%)
iperf3: OUT OF ORDER - incoming packet = 1409 and received packet = 1470 AND SP = 5
iperf3: OUT OF ORDER - incoming packet = 1410 and received packet = 1471 AND SP = 5
iperf3: OUT OF ORDER - incoming packet = 1411 and received packet = 1472 AND SP = 5
iperf3: OUT OF ORDER - incoming packet = 1445 and received packet = 1473 AND SP = 5
iperf3: OUT OF ORDER - incoming packet = 1463 and received packet = 1473 AND SP = 5
[  5]   1.00-2.00   sec  3.29 MBytes  27.6 Mbits/sec  0.716 ms  1110/1526 (73%)
[  5]   2.00-3.00   sec  3.30 MBytes  27.7 Mbits/sec  0.732 ms  1103/1526 (72%)
[  5]   3.00-4.00   sec  3.27 MBytes  27.4 Mbits/sec  0.717 ms  1108/1526 (73%)
[  5]   4.00-5.00   sec  1.56 MBytes  13.1 Mbits/sec  0.837 ms  546/746 (73%)
[  5]   5.00-6.00   sec  0.00 Bytes  0.00 bits/sec  0.837 ms  0/0 (-nan%)
[  5]   6.00-7.00   sec  0.00 Bytes  0.00 bits/sec  0.837 ms  0/0 (-nan%)
[  5]   7.00-8.00   sec  0.00 Bytes  0.00 bits/sec  0.837 ms  0/0 (-nan%)
[  5]   8.00-9.00   sec  0.00 Bytes  0.00 bits/sec  0.837 ms  0/0 (-nan%)
[  5]   9.00-10.00  sec  0.00 Bytes  0.00 bits/sec  0.837 ms  0/0 (-nan%)
[  5]  10.00-10.06  sec  0.00 Bytes  0.00 bits/sec  0.837 ms  0/0 (-nan%)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  5]   0.00-10.06  sec   118 MBytes  98.5 Mbits/sec  0.837 ms  4884/6711 (73%)
[SUM]  0.0-10.1 sec  4884 datagrams received out-of-order


답변

초보자의 경우 ‘정상’외부 터널 iperf 실행은 TCP / 5201이 아니라 문제가있는 흐름으로 UDP / 1194 여야합니다. 먼저 -b 100M으로 시도하지만 VPN 트래픽을 대표하지 않는 최대 크기의 데이터 그램을 생성한다는 점을 명심하십시오 (데이터 그램 크기는 다소 임의적이어야 함). 데이터 그램 크기에 -l 옵션을 사용하여 조정하고 결과를 확인하십시오. 결과가 좋지 않으면 (> 15 또는 20 % 손실이라고 말하면) 인터넷 라우터가 과부하되어 (아마 최선의 노력으로 표시된) 패킷을 삭제하는 것으로 의심 될 수 있습니다.

또한 VPN 터널을 EF 클래스 UDP 포트 (RTP로 인해 5061이라고 말하지만 모든 인터넷 라우터가 올바르게 QoS를 구성했는지 확실하지는 않음)로 전환하면 어떤 성능을 얻는 지 흥미로울 수 있습니다. TCP 포트.

나에게는 설정에 아무런 문제가 없으며 진단에 이상한 것이 나타나지 않습니다. 또한 다른 버전의 OpenVPN 또는 다른 VPN 소프트웨어를 사용해보십시오.