iptables模拟网络连接问题并分析

  • Post author:
  • Post category:其他


以下说明了日常开发中常见的网络问题的模拟方法、异常表现,及定位问题的方法,并提供了Linux网络请求命令nc、curl,防火墙命令iptables的使用说明。



1.  前言



相关内容如下:

Windows抓包与网络分析工具总结:

https://blog.csdn.net/a82514921/article/details/104609924

Linux抓包与网络分析工具总结:

https://blog.csdn.net/a82514921/article/details/104616502

Java程序网络连接分析方法总结:

https://blog.csdn.net/a82514921/article/details/104616519

iptables模拟网络连接问题并分析:

https://blog.csdn.net/a82514921/article/details/104616548



2.  问题分类



在开发过程中,经常发生的网络连接失败包括:连接拒绝、连接超时、读返回超时等,以下主要分析这些比较常见的异常。



3.  Linux网络请求与防火墙命令



以下使用Linux版本为2.6.32-642.6.2.el6.x86_64。



3.1  nc

命令


man nc的说明为“nc(或netcat)应用程序可对TCP或UDP进行处理,可以打开TCP连接,发送UDP数据包,监听任意TCP和UDP端口,进行端口扫描,以及处理IPv4和IPv6”。


nc命令可能没有预装,需要进行安装。


以下对下文需要使用的nc命令进行说明(使用代理等其他复杂功能未涉及)。



3.1.1  nc选项



l  -k


-k选项只能与-l选项结合使用,使nc的当前连接完成后,保持监听,等待后续的连接。


当使用-l选项但不使用-k选项时,nc命令在接收到一次连接后会自动退出;当使用-l选项且使用-k选项时,nc命令在接收到连接后不会自动退出,会继续处理连接。


l  -l


使nc监听并处理接入的连接,而不是向远程主机发起连接。


该选项无法与“-p”“-s”“-z”选项同时使用,-w选项指定的超时时间会被忽略。


l  -n


不对任何地址、主机名或端口进行DNS或服务查找。


当指定-n选项后,会导致无法使用域名或主机名,localhost也无法使用。


l  -u


使用UDP替代默认的TCP协议。


l  -v


使nc打印更详细的输出。


当nc连接远程主机失败时,默认无提示;当指定-v选项后,会打印错误信息。


当nc监听端口时,连接成功后默认不会显示客户端连接信息;指定-v选项后,会显示客户端连接信息。


l  -w timeout


指定超时时间,如果连接和标准输入的空闲时间超过超时时间,连接会被静默关闭。


-w选项对-l选项没有效果,即无论是否使用-w选项,nc都会永远监听等待连接。


超时时间默认不存在。


l  -z


指定nc只是扫描监听,不向其发送数据。


使用nc连接远程主机成功时,当指定-z选项时,nc会自动退出,并显示连接成功的信息。


nc连接成功时,若不指定-z选项,nc不会自动退出,可在标准输入输入数据,回车后会发送给服务器;若服务器使用nc -l监听,会显示客户端发送的数据,在服务器的nc标准输入输入数据并回车后,在客户端的nc也会显示数据。


l  port[s]


使用nc连接远程主机时,可以只指定一个端口,也可指定某个范围的端口,当指定端口范围时,格式为“nn-mm”,如“80-90”,nc会对每个端口进行扫描,并输出结果。



3.1.2  nc使用示例



执行“nc -l 8080”,使nc监听8080端口,当有连接建立成功后,nc会自动退出。若指定了-v选项,会显示客户端连接信息,如“Connection from [客户端IP] port 8080 [tcp/webcache] accepted”。


执行“nc -l 8080 -k”,使nc监听8080端口,当有连接建立成功后,nc不会自动退出,会继续监听等待连接,且会显示客户端发送的数据。


执行“nc localhost 8080”,会连接本机的8080端口。若连接成功,可以在标准输入输入数据,回车后发送给服务器;若连接失败(端口未监听),默认自动退出且无输出,若指定了-v选项,会自动退出并提示“nc: connect to localhost port 8080 (tcp) failed: Connection refused”。


执行“nc localhost 8080 -z”,会连接本机的8080端口。若连接成功,会自动退出并显示“Connection to localhost 8080 port [tcp/webcache] succeeded!”;若连接失败(端口未监听),默认自动退出且无输出,若指定了-v选项,会自动退出并提示“nc: connect to localhost port 8080 (tcp) failed: Connection refused”。



3.2  curl

命令


man curl的说明为“curl是用于从服务器获取或向服务器传输数据的工具,支持的协议包括HTTP、HTTPS、FTP、FTPS、SCP、SFTP、TFTP、DICT、TELNET、LDAP或文件。该命令被设计为不需要用户交互。curl提供了大量有用的技巧,如代理支持,用户身份验证,FTP上传,HTTP POST,SSL连接,Cookies,文件传输及恢复等”。


以下对下文需要使用的curl命令进行说明(指定请求方法、请求数据、HTTP头,发送HTTPS请求,使用代理,keey-alive配置,使用其他协议等其他复杂功能未涉及)。



3.2.1  curl选项



curl命令的使用方式为“curl [options] [URL…]”。


l  –connect-timeout <seconds>


设置连接服务器时的超时时间秒数,只限制连接阶段的超时时间,当curl已完成连接后,该选项不再生效。


l  -m/–max-time <seconds>


设置整个操作的超时时间秒数。



3.2.2  curl示例



执行“curl http://127.0.0.1:12345 –connect-timeout 2”,访问http://127.0.0.1:12345,连接超时时间设置为2秒。当连接超时时,提示为“curl: (28) connect() timed out!”。


执行“curl http://127.0.0.1:12345 -m 2”,访问http://127.0.0.1:12345,操作总超时时间设置为2秒。当连接成功但访问请求超时时,提示为“curl: (28) Operation timed out after 2000 milliseconds with 0 bytes received”。



3.3  iptables

命令


man iptables的说明为“用于IPv4包过滤及NAT的管理工具。用于在Linux内核中设置、维护及检查IPv4数据包过滤规则表。可以定义几个不同的表,每个表包含许多内置链,也可以包含用户定义的链。每个链都是可以匹配一系列数据包的规则列表。每个规则都指定如何处理匹配的数据包”。


执行iptables需要root权限。


iptables可以作为软件防火墙使用,以下对下文需要使用的iptables命令进行说明(其他复杂功能未介绍),使用的iptables版本为1.4.7。



3.3.1  iptables targets



防火墙规则指定了数据包和目标的处理条件。如果数据包不匹配,则使用规则链中的下一个进行检查;如果数据包匹配,则使用对应的目标进行处理。目标可以为用户定义的链名称,也可以特殊值ACCEPT、DROP、QUEUE或RETURN之一。


l  ACCEPT


ACCEPT代表允许数据包通过。


l  DROP


DROP代表丢弃数据包。



3.3.2  iptables targets扩展



iptables还可以使用扩展的target模块,在标准发布中包含了很多targets扩展,以下仅对REJECT进行说明。


l  REJECT


REJECT用于在匹配的数据包返回中发送错误数据包,REJECT是一个终止target,会终止规则遍历。REJECT仅能用于INPUT、FORWARD及OUTPUT链中,以及仅从这些链调用的用户定义链。


“–reject-with type”选项可以控制返回的错误数据包的性质,type可为icmp-net-unreachable、icmp-host-unreach-able、icmp-port-unreachable、icmp-proto-unreachable、icmp-net-prohibited、icmp-host-prohibited或icmp-admin-prohib-ited。默认值为port-unreachable。


tcp-reset选项仅可用于TCP协议,会发送TCP RST包。



3.3.3  iptables表



“-t, –table table”选项用于指定命令作用的数据包匹配的表。如果内核配置了自动模块加载,则会尝试加载该表的相应模块(如果该表尚不存在)。


iptables中具有以下表:


l  filter


filter是iptables使用的默认的表(如果没有指定-t选项)。


filter表包含以下的内置的链:


内置链名


作用

INPUT

对应发往本地套接字的数据包

FORWARD

对应通过本机路由的数据包

OUTPUT

对应本地生成的数据包


l  nat


略。


l  mangle


略。


l  raw


略。



3.3.4  iptables命令



l  -A, –append chain rule-specification


在指定的链的末尾附加一条或多条规则。


l  -D, –delete chain rule-specification/-D, –delete chain rulenum


从指定的链中删除一条或多条规则。


l  -I, –insert chain [rulenum] rule-specification


在指定的链使用指定的规则编号插入一条或多条规则。若指定的规则编号(rulenum)为1,则在链的头部插入。当未指定规则编号时,默认使用1。


l  -L, –list [chain]


列出指定的链中的全部规则。若未指定链,则列出所有链中的规则。和iptables的其他命令类似,该命令使用于指定的表(默认为filter)。


l  -F, –flush [chain]


清空指定的链,若未指定链,则清空指定表的全部链。该命令与逐个删除全部的规则效果相同。



3.3.5  iptables参数



l  [!] -p, –protocol protocol


指定规则或需要检查的包对应的协议。可为tcp、udp、udplite、icmp、esp、ah、sctp或all中的一个,也可以是数值。允许使用/etc/protocols文件中的协议名称。数字0等同于all,协议all将与所有协议匹配,并作为该参数的默认值。


“!”可以使参数含义反转,如“! -p tcp”,代表不是tcp协议则匹配。


“! -p tcp ”会导致–dport等参数无法使用。


l  [!] -s, –source address[/mask][,…]


指定源地址。地址可以是网络名称、主机名、网络IP地址(带掩码)或IP地址。规则在被提交给内核前,主机名仅被解析一次。不建议使用远程查询(如DNS)对任何名称进行解析。掩码可以是网络掩码,或通过数字指定网络掩码左侧的1的数量。–src是当前参数的别名。


“!”可以使参数含义反转,如“! -s 127.0.0.1”,代表不是“127.0.0.1”的源地址则匹配。


l  [!] -d, –destination address[/mask][,…]


指定目标地址。与-s参数用法类似。–dst是当前参数的别名。


“!”可以使参数含义反转,如“! -d 127.0.0.1”,代表不是“127.0.0.1”的目标地址则匹配。


l  -j, –jump target


指定规则的target,即当包匹配规则时需要执行什么操作。target可以是用户定义的链(不是此规则所在的链),一个特殊的可以立即决定数据包操作的内置target,或扩展的target。如果规则中省略了此选项(并且未使用-g,跳转到指定的链),则规则对匹配到的包将不会有效果,但规则上的计数器将递增。


当-j参数不指定target时,不会对匹配的数据包产生影响,可用于观察满足规则的包数量与大小。


l  [!] -i, –in-interface name


指定包被接收时通过的接口名称(只对通过INPUT、FORWARD和PREROUTING链的包有效)。当接口名称以“+”结尾时,则以指定名称开头接口会被匹配。当未指定该参数时,所有的接口都会被匹配。


-i参数只能与“-I INPUT”同时使用(都是指定接收数据包的规则),不能与“-I OUTPUT”同时使用。


“!”可以使参数含义反转,如“! -i eth0”,代表包被接收时通过的接口不是“eth0”则匹配。


l  [!] -o, –out-interface name


指定包被发送时通过的接口名称(只对通过INPUT、FORWARD和POSTROUTING链的包有效)。当接口名称以“+”结尾时,则以指定名称开头接口会被匹配。当未指定该参数时,所有的接口都会被匹配。


-i参数只能与“-I OUTPUT”同时使用(都是指定发送数据包的规则),不能与“-I INPUT”同时使用。


“!”可以使参数含义反转,如“! -o eth0”,代表包被发送时通过的接口不是“eth0”则匹配。



3.3.6  iptables其他选项



l  -v, –verbose


输出详细信息。该选项使“-L, –list”命令显示接口名称、规则选项(如果存在)和TOS掩码。数据包和字节计数器也被列出,后缀分别为“K”“M”或“G”,分别为1000、1,000,000和1,000,000,000的倍数(-x选项可以改变该输出格式)。对于附加、插入、删除和替换操作,该选项会使对应规则的详细信息被打印。


l  -n, –numeric


使用数字格式的输出。IP地址与端口号会以数字形式打印,可以避免DNS解析。在默认情况下(未指定当前选项时),iptables会尝试以主机或、网络名称或服务名的形式进行展示。


例如执行“iptables -I INPUT -s localhost”命令添加规则。


执行“iptables -L -v”命令查看规则,可以看到IP地址显示为主机名形式。

Chain INPUT (policy ACCEPT 285 packets, 57158 bytes)

pkts bytes target     prot opt in     out     source               destination

0     0            all  —  any    any     localhost            anywhere


执行“iptables -L -v -n”命令查看规则,可以看到IP地址为数字形式。

Chain INPUT (policy ACCEPT 8195 packets, 11M bytes)

pkts bytes target     prot opt in     out     source               destination

0     0            all  —  *      *       127.0.0.1            0.0.0.0/0


l  -x, –exact


展开数字。显示数据包与字节计数器的精确的值,而不是显示四舍五入的K(1000)、M(1000K)或G(1000M)。该选项只能在使用-L命令时使用。


以下为示例:


执行“iptables -L -v -x”命令,可以看到数字展示为精确的值。

Chain INPUT (policy ACCEPT 79027 packets, 56436626 bytes)

pkts      bytes target     prot opt in     out     source               destination

0        0            all  —  any    any     localhost            anywhere

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

pkts      bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 55000 packets, 13694656 bytes)

pkts      bytes target     prot opt in     out     source               destination


执行“iptables -L -v”命令,可以看到数字展示为以K、M、G为单位的形式。

Chain INPUT (policy ACCEPT 79027 packets, 56M bytes)

pkts bytes target     prot opt in     out     source               destination

0     0            all  —  any    any     localhost            anywhere

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 55001 packets, 14M bytes)

pkts bytes target     prot opt in     out     source               destination


l  –line-numbers


当使用-L命令时,可以指定当前选项,可以根据规则在链中的位置,在每个规则的开头显示行号。



3.3.7  iptables扩展匹配



iptables可以使用扩展的包匹配模块。


包匹配模块有两种加载方式:


一是隐式加载,指定了-p或–protocol选项;


二是指定了-m或–match选项,后续指定匹配模块名称。


当使用了包匹配模块后,可以使用很多额外的命令选项,由指定的模块决定。


iptables的基础包中包含了addrtype、ah、cluster、comment、connbytes、connlimit、connmark、conntrack、dccp、dscp、ecn、esp、hashlimit、helper、icmp、iprange、length、limit、mac、mark、multiport、owner、physdev、pkttype、policy、quota、rateest、realm、recent、sctp、set、socket、state、statistic、string、tcp、tcpmss、time、tos、ttl、u32、udp、unclean等模块。


以上模式的命令大多可以通过“!”使命令含义反转。



3.3.7.1     tcp扩展


当指定了“-p tcp”或“–protocol tcp”时,可以使用tcp扩展,支持以下选项:


l  [!] –source-port,–sport port[:port]


指定源端口或源端口范围。可为服务名称或端口号,也可以指定端口范围,格式为“first:last”。当未指定first端口时,默认使用0;当当未指定last端口时,默认使用65535。


示例:“sudo iptables -I INPUT -p tcp –dport 12344:12346”。


l  [!] –destination-port,–dport port[:port]


指定目标端口或源端口范围。


l  [!] –tcp-flags mask comp


可以匹配TCP数据包的标志位,略。


[!] –syn


l  可以匹配TCP数据包的标志位,略。



3.3.8  iptables默认规则



某些版本的Linux系统在安装后存在默认的iptables规则。


如CentOS 6.9/RedHat 6.5等版本安装后存在默认iptables规则,仅允许访问本机的22端口。



3.3.9  iptables使用示例



执行“iptables -L -v”,查看iptables规则,如下所示。pkts与bytes,分别展示匹配规则的包数量,及字节数

Chain INPUT (policy ACCEPT 9451 packets, 3109K bytes)

pkts bytes target     prot opt in     out     source               destination

9438 3109K            tcp  —  any    any     anywhere             anywhere

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)

pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 9614 packets, 4601K bytes)

pkts bytes target     prot opt in     out     source               destination



执行“iptables -I INPUT -p tcp –dport 12345 -i eth0 -j REJECT”,设置对于接收的TCP协议数据包,若目标端口为12345,且网络接口为eth0时则拒绝。


会导致本机可以访问本机的12345端口,经过eth0网络接口的其他机器不可访问本机的12345端口。



执行“iptables -I INPUT -p tcp –dport 12345 -i lo -j REJECT”,设置对于接收的TCP协议数据包,若目标端口为12345,且网络接口为回环接口lo时则拒绝。


会导致本机不可访问本机的12345端口,经过eth0网络接口的其他机器可以访问本机的12345端口。



执行“iptables -I OUTPUT -p tcp –sport 12345 -o eth0 -j REJECT”,设置对于发送的TCP协议数据包,若源端口为12345,且网络接口为eth0时则拒绝。


会导致本机可以访问本机的12345端口,经过eth0网络接口的其他机器不可访问本机的12345端口。



执行“iptables -I OUTPUT -p tcp –sport 12345 -o lo -j REJECT”,设置对于发送的TCP协议数据包,若源端口为12345,且网络接口为回环接口lo时则拒绝。


会导致本机不可以访问本机的12345端口,经过eth0网络接口的其他机器可访问本机的12345端口。



执行“iptables -I INPUT -p tcp -s 192.168.0.0/16 –dport 12345 -j DROP”,使用掩码的IP地址,设置对于接收的TCP协议数据包,若源地址为192.168网段的IP,且目标端口为12345时则拒绝。



执行“iptables -I INPUT -p tcp -s 192.168.0.1 –dport 12345  ! -i eth0 -j ACCEPT”,设置对于接收的TCP协议数据包,若源地址为192.168.0.1,且目标端口为12345,且网络接口不是eth0时则允许。



执行“iptables -I OUTPUT ! -p tcp -d 192.168.0.1 -i eth0 -j ACCEPT”,设置对于发送的数据包,如果协议不是TCP,且目标地址为192.168.0.1,且网络接口为eth0时则允许。



执行“iptables -I OUTPUT -p tcp ! -s 192.168.0.1 –dport 12345 -i eth0 -j ACCEPT”,设置对于发送的TCP协议数据包,若源地址不是192.168.0.1,且目标端口为12345,且网络接口为eth0时则允许。



3.3.10     ip6tables



对于IPv6的数据包,当需要使用iptables相关功能时,需要使用ip6tables命令。ip6tables是IPv6的包过滤管理工具。



4.  模拟异常




4.1  模拟连接拒绝




4.1.1  模拟方法




4.1.1.1     访问未监听的端口


访问存在的IP的未监听的端口 ,可以出现连接拒绝异常。



4.1.1.2     使用iptables模拟连接拒绝



4.1.1.2.1  客户端连接请求被拒绝


假设服务器IP为192.168.0.1,监听端口为12345。在客户端执行iptables命令设置以下规则,使客户端连接请求被拒绝,可以出现连接拒绝异常。

iptables -I OUTPUT -p tcp -d 192.168.0.1 –dport 12345 -j REJECT



4.1.1.2.2  服务器处理连接请求被拒绝


假设客户端IP为192.168.0.1,服务器监听端口为12345。在服务器执行iptables命令设置以下规则,使客户端连接请求被拒绝,可以出现连接拒绝异常。

iptables -I INPUT -p tcp -s 192.168.0.1 –dport 12345 -j REJECT



4.1.2  模拟结果



模拟连接被拒绝,使用以下命令进行连接,结果如下:


l  telnet


执行“telnet 192.168.0.1 12345”,结果如下:

Trying 192.168.0.1…

telnet: connect to address 192.168.0.1: Connection refused


l  nc


执行“nc -z -v 192.168.0.1 12345”,结果如下:

nc: connect to 192.168.0.1 port 12345 (tcp) failed: Connection refused


l  curl


执行“curl 192.168.0.1:12345”,结果如下:

curl: (7) couldn’t connect to host



4.2  模拟连接超时




4.2.1  模拟方法




4.2.1.1     访问不存在IP的端口


访问不存在IP的端口 ,可以出现连接超时异常。



4.2.1.2     使用iptables模拟连接超时



4.2.1.2.1  客户端连接请求被丢弃


假设服务器IP为192.168.0.1,监听端口为12345。在客户端执行iptables命令设置以下规则,使客户端连接请求被丢弃,可以出现连接超时异常。

iptables -I OUTPUT -p tcp -d 192.168.0.1 –dport 12345 -j DROP



4.2.1.2.2  服务器处理连接请求被丢弃


假设客户端IP为192.168.0.1,服务器监听端口为12345。在服务器执行iptables命令设置以下规则,使客户端连接请求被丢弃,可以出现连接超时异常。

iptables -I INPUT -p tcp -s 192.168.0.1 –dport 12345 -j DROP



4.2.2  模拟结果



模拟连接被拒绝,使用以下命令进行连接,结果如下:


l  telnet


执行“telnet 192.168.0.1 12345”,一直显示“Trying 192.168.0.1…”。


l  nc


执行“nc -z -w 2 -v 192.168.0.1 12345”,设置连接超时时间为2秒,结果如下:

nc: connect to 192.168.0.1 port 12345 (tcp) timed out: Operation now in progress


l  curl


执行“curl –connect-timeout 2 192.168.0.1:12345”,设置连接超时时间为2秒,结果如下:

curl: (28) connect() timed out!



4.3  模拟读返回超时




4.3.1  模拟方法




4.3.1.1     自定义服务器


自定义Socket服务器,可通过以下方式之一可使客户端连接后出现读返回超时异常:


l  只调用bind方法进行监听,不调用accept方法创建Socket对象;


l  accept方法创建Socket对象,不向客户端返回数据,且不调用创建的Socket对象的close方法;


l  accept方法创建Socket对象,等待超过客户端的超时时间后再向其返回数据。


假设自定义服务器的IP为192.168.0.1,端口为12345。



4.3.2  模拟结果



l  curl


执行“curl -m 2 192.168.0.1:12345”,设置连接超时时间为2秒,结果如下:

curl: (28) Operation timed out after 2000 milliseconds with 0 bytes received



5.  应用程序网络异常现象




5.1  Java程序网络异常




5.1.1  连接拒绝



使用Java的Socket类连接服务器,若连接被拒绝,异常信息为“java.net.ConnectException: Connection refused: connect”。



5.1.2  连接超时



使用Java的Socket类连接服务器,若当连接超时,异常信息为“java.net.SocketTimeoutException: connect timed out”。



5.1.3  读返回超时



使用Java的Socket类连接服务器,若读返回超时,异常信息为“java.net.SocketTimeoutException: Read timed out”。



5.2  HttpClient网络异常



以下使用HttpClient为4.3.6。



5.2.1  连接拒绝



使用HttpClient连接服务器,若连接被拒绝,异常信息为“org.apache.http.conn.HttpHostConnectException: Connect to 192.168.0.1:12345 [/192.168.0.1] failed: Connection refused: connect”。



5.2.2  连接超时



使用HttpClient连接服务器,若连接超时,异常信息为“org.apache.http.conn.ConnectTimeoutException: Connect to 192.168.0.1:12345 [/192.168.0.1] failed: connect timed out”。



5.2.3  读返回超时



使用HttpClient连接服务器,若读返回超时,异常信息为“java.net.SocketTimeoutException: Read timed out”。



5.3  Jedis访问Redis服务器失败




5.3.1  异常模拟方法



通过iptables设置规则,模拟异常场景,可以使应用访问Redis服务器失败。


Jedis连接Redis服务器失败时,可能导致应用初始化失败,因此可能需要在应用正常启动后,



5.3.2  异常模拟结果



当Jedis访问Redis服务器失败时,异常信息为“redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool”,Caused by异常信息为“redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out”。



6.  TCP协议说明




6.1  三次握手说明



TCP协议说明见

https://tools.ietf.org/html/rfc793



建立连接的三次握手过程的示意图为“Basic 3-Way Handshake for Connection Synchronization Figure 7.”,如下所示:

TCP A                                                TCP B

1.  CLOSED                                               LISTEN

2.  SYN-SENT    –> <SEQ=100><CTL=SYN>               –> SYN-RECEIVED

3.  ESTABLISHED <– <SEQ=300><ACK=101><CTL=SYN,ACK>  <– SYN-RECEIVED

4.  ESTABLISHED –> <SEQ=101><ACK=301><CTL=ACK>       –> ESTABLISHED

5.  ESTABLISHED –> <SEQ=101><ACK=301><CTL=ACK><DATA> –> ESTABLISHED



6.2  RST的说明



关于RST的说明为“A control bit (reset), occupying no sequence space, indicating that the receiver should delete the connection without further interaction.”。


RST为控制位(复位),不占用序列空间,表示接收方应删除连接且无需进一步交互。



7.  TCP数据包分析



以下数据包均在客户端捕获,客户端操作系统为Linux 2.6.32-642.6.2.el6.x86_64,捕获数据包工具为tcpdump。



7.1  正常情况下的TCP连接



正常情况下的TCP连接数据包如下所示,与TCP协议说明建立连接的三次握手过程一致。





7.2  TCP连接拒绝




7.2.1  访问未监听的端口



当客户端访问存在的IP未监听的端口时,连接被拒绝。


数据包如下所示,可以看到客户端向服务器发送SYN后,服务器返回了RST,ACK,使客户端中断连接,与TCP协议说明的RST标志作用相符。





7.2.2  客户端连接请求被拒绝



在客户端使用iptables设置规则,使客户端连接请求被拒绝,在客户端使用tcpdump捕获数据包,未捕获到对应数据包。



7.2.3  服务器处理连接请求被拒绝



在服务器设置iptables规则,使其处理连接请求被拒绝,客户端连接会被拒绝。


数据包如下所示,可以看到客户端向服务器发送SYN后,客户端未接收到服务器的返回。





7.3  TCP连接超时




7.3.1  访问不存在IP的端口



当客户端访问不存在的IP的端口时,连接超时(访问不存在的IP:123.123.123.123)。


数据包如下所示,可以看到客户端向服务器发送SYN后,未接收到服务器的返回,经过一段时间后进行重发。





7.3.2  客户端连接请求被丢弃



在客户端使用iptables设置规则,使客户端连接请求被丢弃,在客户端使用tcpdump捕获数据包,未捕获到对应数据包。



7.3.3  服务器处理连接请求被丢弃



在服务器设置iptables规则,使其处理连接请求被丢弃,客户端连接会超时。


数据包如下所示,可以看到客户端向服务器发送SYN后,未接收到服务器的返回,经过一段时间后进行重发。





版权声明:本文为a82514921原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。