最近业务上新上了 Juniper 的防火墙。在防火墙上线后发现,原先业务上的调用同网段内 LVS VIP 的 HTTP 长连接在使用一段时间后频繁出现丢包重传现象,而其它网段连接此 LVS IP 则没有丢包。

概要

Juniper SRX 防火墙默认规则关于 TCP 连接建立的判定方法以及相关配置。

同网段中向DR模式 LVS 发出的TCP包,其回包不通过网关而是直接返回到发起机器。

使用python3 + urllib3 模拟 HTTP keepalive 长时间保持连接情况

症状

应用服务器上向 LVS IP 发的 HTTPS 请求丢包非常之惨烈。

网络拓扑

先上一张网络拓扑,方便说明问题。

LVS IP 是公网IP

Juniper 防火墙设备同时充当默认网关。

复现、调查与分析过程

复现

为了能够在不影响业务的情况下方便调查,稳定复现问题是关键。

在复现的方法上想了很多办法,耗费了最多时间。

第一种方法,也是直接想到的方法,尝试用 curl。

但是连接丢包是在长连接建立一段时间后才发生的,所以使用 curl 需要 1) 模拟长连接 2) 长连接需要保持一段时间。

查阅手册,发现使用 curl 保持长连接不难,但是由于内网请求速度非常快,因此要保持长连接一段时间难以做到。

第二种方法,使用 python 的urllib3。

查了下urllib3的手册,写出下面代码。

Python

import urllib3, certifi

import time

#http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())

http = urllib3.PoolManager()

for i in range(1000):

r = http.request("GET", "http://xxx.xiaomi.com")

print(i, r.status)

time.sleep(1)

1

2

3

4

5

6

7

8

9

10

importurllib3,certifi

importtime

#http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())

http=urllib3.PoolManager()

foriinrange(1000):

r=http.request("GET","http://xxx.xiaomi.com")

print(i,r.status)

time.sleep(1)

运行该代码约20秒后,输出卡住了。重复多次稳定复现。

调查

先在业务机器上和 Real Server 上抓包,发现连接建立一段时间后一定会出现丢包,然后整个连接被关闭。

后尝试在 LVS 机器上和业务机器上抓包分析。

LVS 上抓包图:

业务机器上抓包图:

蓝色的行为同一个包在 LVS 和业务机器上的同一个包。

通过在 LVS 机器和业务机器上抓包,确定是防火墙硬件将包丢弃。

至此,将调查重点放在防火墙配置上。

可疑的防火墙配置

现在问题已经明确为:

因为某个原因或者配置,防火墙将超过20秒的长连接的包丢弃了。

检查防火墙的配置,找找与 “20″ 相关的项目,在其默认配置中有所发现

set security screen ids-option untrust-screen tcp syn-flood alarm-threshold 1024

set security screen ids-option untrust-screen tcp syn-flood attack-threshold 200

set security screen ids-option untrust-screen tcp syn-flood source-threshold 1024

set security screen ids-option untrust-screen tcp syn-flood destination-threshold 2048

set security screen ids-option untrust-screen tcp syn-flood timeout 20

set security screen ids-option untrust-screen tcp land

1

2

3

4

5

6

setsecurityscreenids-optionuntrust-screentcpsyn-floodalarm-threshold1024

setsecurityscreenids-optionuntrust-screentcpsyn-floodattack-threshold200

setsecurityscreenids-optionuntrust-screentcpsyn-floodsource-threshold1024

setsecurityscreenids-optionuntrust-screentcpsyn-flooddestination-threshold2048

setsecurityscreenids-optionuntrust-screentcpsyn-floodtimeout20

setsecurityscreenids-optionuntrust-screentcpland

其中

set security screen ids-option untrust-screen tcp syn-flood timeout 20

这一条其意义是:TCP 连接的建立必须在20秒内完成,否则该连接请求将被丢弃。链接

至此,已大致可以确定问题所在了:防火墙将超过20秒的连接强行关闭了。

LVS DR模式

在 LVS DR 模式下,请求方向 LVS 发起 TCP 请求,但是 TCP 请求的回包并不从 LVS 返回,而是由 Real Server 直接返回给请求方。

如果请求方与 LVS 不在同网段,则返回的 TCP 包需要通过网关转发给请求方。但是如果请求方与 LVS 是同网段且网关是防火墙设备,那情况要稍微复杂些。

如图:

TCP包流向图

注意到经过防火墙的 TCP 包是单方向的。防火墙一直认为 TCP 连接没有建立。

解决方法

根据之前的分析,想到的解决方法有两个:

调整防火墙配置和应用程序的配置,让 HTTP 长连接保持一个合适的时间。

在该网段搭建内网 LVS,流量不经由防火墙。

juniper服务器连接显示都是网关,Juniper防火墙,LVS DR mode 与 HTTP keepalive 丢包问题追查...相关推荐

  1. 客人刷卡显示成功但是服务器连接显示超时,POS机刷卡故障解决方案.xls

    POS机刷卡故障解决方案.xls POS联系人 POS故障分类统计 POS故障记录 培训内容 故障分类 开机故障 故障描述 在线排查 线下排查 后台对应的POS交易日志 故障解决 是否存在 日志描述 ...

  2. inode服务器连接显示网络,上不了网的问题

    1.宿舍iNode认证出错:"服务器没有响应,请确认当前认证网卡已连接到合适的网络". 解决:端口坏了,拨打26032975报修. 2.宿舍iNode认证成功,但上不了网 解决:i ...

  3. 我的世界服务器连接显示不见了,我的世界服务器为什么进去就卡,然后几十秒后显示“连接已丢失”怎么? 爱问知识人...

    2017-10-27 04:06:05 不是网络的问题,可能那个服务器已关闭了,或者崩了的情况. 可能您不知道,服主注册服务器需要花钱,花多少都开不了永久的! ? ? ? ? ? ? ? ? ? ? ...

  4. 服务器连接显示无法识别网卡,解决常见Windows 7无法识别网络的问题

    1.在计算机图标上鼠标右键单击"属性"按钮 2.在控制面板主页栏中单击"设备管理器"命令 3.弹出的设备管理器窗口下展开网络适配器,双击打开网卡 4.切换到&q ...

  5. 服务器连接显示18456,服务器:消息18456,级别16,状态1 用户‘sa’登录失败解决方法...

    无法连接到服务器**:  服务器:消息18456,级别16,状态1   [Microsoft][ODBC   SQL   Server   Driver][Sql   server]   用户 'sa ...

  6. 服务器连接显示18456,SQL2008无法连接到服务器,用户’XX’登录失败(错误18456)解决方法...

    SQL2008无法连接到.\SQLEXPRESS,用户'sa'登录失败(错误18456)图文解决方法 SQL2008无法连接到.\SQLEXPRESS,用户'sa'登录失败(错误18456)图文解决方 ...

  7. 通过跳板服务器连接学校内网服务器并连接pycharm

    推荐大家非常好的ssh入门教程,详细地介绍了本地转发 阮一峰大佬ssh 朱双印大佬的教程,也是老熟人了 更形象地解释本地转发 pycharm官方文档 扩展小知识: 转发=映射 "本地转发&q ...

  8. 主服务器连接异常帮助修复,LOL服务器连接异常怎么解决

    LOL英雄联盟提示"服务器连接异常,即将退出,请重新连接游戏",对此该如何解决呢?下面是学习啦小编收集整理的LOL服务器连接异常怎么解决,希望对大家有帮助~~ LOL服务器连接异常 ...

  9. Ping网关间歇性丢包,Ping同局域网电脑正常

    故障现象:服务器B ping路由器网关地址192.168.1.1会出现间歇性丢包,服务器A ping路由器网关地址192.168.1.1正常,服务器B ping服务器A正常. 网络环境,如下图所示: ...

  10. 电视盒子显示ntp服务器异常,ntp服务器连接异常咋办

    ntp服务器连接异常咋办 内容精选 换一换 云服务器列表页面显示了所有已创建的GPU加速型云服务器信息.您可以参考如下操作查看云服务器详情.云服务器详情中展示了如下信息:云服务器名称.ID.状态等.云 ...

最新文章

  1. 动态规划——洛谷_P1057传球游戏
  2. wordpress php 7 速度优化,WordPress优化提速必做的6种操作代码篇
  3. memcached ---- 学习笔记
  4. 谈谈我理解的文化包容性
  5. Dollar Dayz POJ - 3181(动态规划+大数高低位分离输出)
  6. *【HDU - 6201】transaction transaction transaction(树形dp 或 spfa最长路 或 网络流)
  7. 服务器部署docker
  8. qwidget show 是否有信号_PyQt5信号与槽机制入门(一)
  9. python安装notebook_Jupyter Notebook环境安装
  10. 有界、无界队列对ThreadPoolExcutor执行的影响
  11. 演绎、归纳与前言结构——Leo鉴书83
  12. 矩阵分析之 伪逆矩阵,左逆,右逆,广义逆
  13. 一款开源短视频去水印程序,大爱!
  14. 商业研究(17):以小见大,看互联网经济(4个股权众筹平台,4个领域,10个项目,8个图)
  15. IDA6.8 爱加密脱壳简单示例
  16. 虚拟接口和SD-WAN
  17. java ant解压缩_java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解
  18. 【转】现代c++开发利器folly教程系列之:future/promise
  19. uva 11183 Teen Girl Squad
  20. ATP的SDOI2017R1续命记

热门文章

  1. Oracle 星期(周末处理)
  2. 微信小程序中 三元运算符的嵌套使用
  3. vs2017c语言运行库,microsoft visual c++ 2017运行库下载-microsoft visual c++ 2017运行库32位64位下载官方版-西西软件下载...
  4. C++学习第六天——数组
  5. 《横向领导力》-简述
  6. 蓝桥杯 带分数 By Assassin
  7. 骚操作!那些富有感情的影视台词截图都是哪来的?
  8. 利用CH341A编程器刷新BIOS,恢复BIOS,妈妈再也不用担心BIOS刷坏了
  9. 12_传智播客iOS视频教程_注释和函数的定义和调用
  10. js实现文本相似度对比