pptp服务器在特定情况下经常丢包的问题

在产品研发测试中,我们发现连接了pptp服务器后,有的网站无法从docker内部系统访问。通过curl调试输出以下信息:

root@db064b209cf8:/app# curl -v https://www.qq.com
* Rebuilt URL to: https://www.qq.com/
*   Trying 58.250.137.36...
* TCP_NODELAY set
* Connected to www.qq.com (58.250.137.36) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.2 (OUT), TLS header, Certificate Status (22):
* TLSv1.2 (OUT), TLS handshake, Client hello (1):

由此 ,我们可以确定tls做握手时出现了问题。

通过wireshark调试,我们更进一步确认了是tls握手流程中的ServerHello时发生了ip数据报文丢包的问题。经过反复调试,对比wireshark数据,查阅ip协议原文档,耗时2天后,我们终于确定是pptp协议转发数据报文的数据包(大于1500)过大所产生的问题。正因为此问题,才导致有时候pptp的数据报文总是丢失。大于1500的ip数据包在网络传输时会发生频繁的分割(fragment),很容易被丢失掉。

解决方案:

  1. 手动的修改ppp0网络接口的mtu值。操作方法为: sudo ifconfig ppp0 mtu 1400 up
  2. 上面那种方法只能临时的起效,但你重连网络后ppp0的mtu又会被重置。在centos系统下长久奏效的方法是修改/etc/ppp/options.pptpd。在里面加入mtu 1400这一行。加上之后重启pptpd服务器即可(sudo systemctl restart pptpd)

发表评论

邮箱地址不会被公开。 必填项已用*标注