企业运维训练营之云上网络原理与实践课程
第二讲配套实验:访问4层&7层 CLB场景对比
视频地址:
https://developer.aliyun.com/learning/course/991/detail/14976
一、实验简介:
在大量真实业务场景(如微服务)中,在CLB后端提供服务的ECS之间存在服务上的依赖关系(ECS既做客户端又做服务端),本实验以CLB后端的一个ECS来访问CLB的4层监听与7层监听的端口,以理解其转发规则的不同。
实验网址:https://developer.aliyun.com/adc/scenario/exp/e39b51556c34432faae378075ac99abb
二、实验步骤:
1. 创建资源。
a. 在体验实验室页面左侧,单击创建资源,创建所需资源。
b. 在页面左侧导航栏中,单击云产品资源列表,查看本次实验资源相关信息。
说明:
资源创建过程需要1~3分钟。完成实验资源的创建后,您可以在云产品资源列表查看已创建的资源信息,例如:IP地址、用户名和密码等。
2. 了解实验架构。
本实验架构为1台CLB,后端挂载了2台ECS,以CLB后端的一个ECS来访问CLB的4层监听与7层监听的端口。
3. 实验准备。
注:后台已创建好了对应的云产品资源,这里仅了解和核实环境和相关配置。
如下仅供学员了解和参考,不需要去手动创建(如了解,可跳过):
- 创建ECS 参考文档:
https://help.aliyun.com/document_detail/25422.html
- 私网CLB实例创建 参考文档:https://help.aliyun.com/document_detail/86454.html
4. 手动安装nginx并设置自定义首页。
注:不同学员会有属于自己的ECS实例(后台自动创建),请以实际配置中实例的信息(id、IP等)为准。系统默认资源创建过程需要1~3分钟。完成实验资源的创建后,您可以在“云产品资源”列表查看已创建的资源信息,例如:IP地址、用户名和密码等。
- 本实验演示的ECS示例为杭州地域下的ECS,以其ECS IP为:192.168.11.180和192.168.11.181做样例演示。
- 在系统内手动安装nginx(yum install nginx);
yum install nginx
- 在/usr/share/nginx/html目录下使用本机的hostname替换原有的index.html文件,内容为ECS本机的hostname;
cd /usr/share/nginx/html/
hostname > index.html
- 最后启动nginx服务;
service nginx start
5. 将ECS1、ECS2加入到CLB的默认服务器组
注:不同学员会有属于自己的CLB实例(后台自动创建),请以实际配置中实例的信息(id、IP等)为准。
- 本实验演示的杭州地域clb实例ID为lb-bp1srfo9275l6vlxq9mg2,IP地址为192.168.11.175。
- 将ECS1、ECS2加入到CLB的默认服务器组内。
6. 创建CLB实例的监听,80端口的TCP和8080端口的HTTP,并配置默认服务器组。
7. 在CLB监听的后端服务器ECS1上安装telnet,以便访问4层CLB的80端口,同时在ECS1内部抓包。
- 抓包时注意需要抓取any网卡:
由于回包时目标IP为本机IP,在当前的系统路由表中,本机IP的路由会走loop网卡,如果只抓eth0,会出现回包无法抓到的情况。
- 访问时为什么会出现时通时不通的现象?
8. 在CLB监听的后端服务器上测试ECS1访问4层CLB的80端口,并在ECS1内部抓包。
抓包时注意需要抓取any网卡。
[root@ECS1 ~]# tcpdump -nni any port 80 and not net 100.64.0.0/10
13:45:15.962843 IP 192.168.11.181.48092 > 192.168.11.175.80: Flags [S], seq 3268167503, win 29200, options [mss 1460,sackOK,TS val 818983 ecr 0,nop,wscale 7], length 0
13:45:15.964410 IP 192.168.11.181.48092 > 192.168.11.181.80: Flags [S], seq 3268167503, win 29200, options [mss 1460,sackOK,TS val 818983 ecr 0,nop,wscale 7], length 0
13:45:15.964429 IP 192.168.11.181.80 > 192.168.11.181.48092: Flags [S.], seq 1270453242, ack 3268167504, win 43690, options [mss 65495,sackOK,TS val 818984 ecr 818983,nop,wscale 7], length 0
13:45:15.964439 IP 192.168.11.181.48092 > 192.168.11.181.80: Flags [R], seq 3268167504, win 0, length 0
9. 在CLB监听的后端服务器上测试ECS1访问4层CLB的8080端口,并在ECS内部抓包。
- 访问时建议需要使用curl,因为:
7层监听是http层面的动作,如果只用telnet来测试,三次握手建立好了之后,客户端和proxy集群(tengine集群)进行了连接,没有发起任何数据的时候,在CLB部分集群上不会向后端ECS建立连接发送数据的,所以必须用curl实际的发送一些7层的数据。
- 抓包时我们关注的信息有哪些?
- 除了192开头的IP,我们还可以看到来自100网段的IP数据包,这些数据包正是7层监听交互的表现。
14:24:03.135859 IP 192.168.11.181.34290 > 192.168.11.175.8080: Flags [S], seq 1995438430, win 29200, options [mss 1460,sackOK,TS val 3146156 ecr 0,nop,wscale 7], length 0
14:24:03.137054 IP 192.168.11.175.8080 > 192.168.11.181.34290: Flags [S.], seq 2376897256, ack 1995438431, win 29200, options [mss 1440,nop,nop,sackOK,nop,wscale 9], length 0
14:24:03.137071 IP 192.168.11.181.34290 > 192.168.11.175.8080: Flags [.], ack 1, win 229, length 0
14:24:03.137179 IP 192.168.11.181.34290 > 192.168.11.175.8080: Flags [P.], seq 1:84, ack 1, win 229, length 83: HTTP: GET / HTTP/1.1
14:24:03.138336 IP 192.168.11.175.8080 > 192.168.11.181.34290: Flags [.], ack 84, win 58, length 0
14:24:03.139023 IP 100.122.64.142.2292 > 192.168.11.181.80: Flags [S], seq 1176088477, win 28480, options [mss 1424,sackOK,TS val 4003383056 ecr 0,nop,wscale 9], length 0
14:24:03.139038 IP 192.168.11.181.80 > 100.122.64.142.2292: Flags [S.], seq 2293269875, ack 1176088478, win 28960, options [mss 1460,sackOK,TS val 3146159 ecr 4003383056,nop,wscale 7], length 0
14:24:03.140054 IP 100.122.64.142.2292 > 192.168.11.181.80: Flags [.], ack 1, win 56, options [nop,nop,TS val 4003383058 ecr 3146159], length 0
14:24:03.140073 IP 100.122.64.142.2292 > 192.168.11.181.80: Flags [P.], seq 1:162, ack 1, win 56, options [nop,nop,TS val 4003383058 ecr 3146159], length 161: HTTP: GET / HTTP/1.1
14:24:03.140078 IP 192.168.11.181.80 > 100.122.64.142.2292: Flags [.], ack 162, win 235, options [nop,nop,TS val 3146160 ecr 4003383058], length 0
14:24:03.140254 IP 192.168.11.181.80 > 100.122.64.142.2292: Flags [FP.], seq 1:264, ack 162, win 235, options [nop,nop,TS val 3146160 ecr 4003383058], length 263: HTTP: HTTP/1.1 200 OK
14:24:03.141713 IP 100.122.64.142.2292 > 192.168.11.181.80: Flags [F.], seq 162, ack 265, win 58, options [nop,nop,TS val 4003383059 ecr 3146160], length 0
14:24:03.141732 IP 192.168.11.181.80 > 100.122.64.142.2292: Flags [.], ack 163, win 235, options [nop,nop,TS val 3146161 ecr 4003383059], length 0
14:24:03.141742 IP 192.168.11.175.8080 > 192.168.11.181.34290: Flags [P.], seq 1:247, ack 84, win 58, length 246: HTTP: HTTP/1.1 200 OK
14:24:03.141754 IP 192.168.11.181.34290 > 192.168.11.175.8080: Flags [.], ack 247, win 237, length 0
14:24:03.141889 IP 192.168.11.181.34290 > 192.168.11.175.8080: Flags [F.], seq 84, ack 247, win 237, length 0
14:24:03.143047 IP 192.168.11.175.8080 > 192.168.11.181.34290: Flags [F.], seq 247, ack 85, win 58, length 0
14:24:03.143056 IP 192.168.11.181.34290 > 192.168.11.175.8080: Flags [.], ack 248, win 237, length 0
三、实验分析
1、实验结果
从以上的实验结果来看,ECS1访问CLB的80端口,会出现时通时不通的表现,而访问CLB的8080端口,则是100%连通。
2、实验分析
a. 由于四层CLB下, CLB会将客户端的原始链接转发到后端服务器上,因此在这种情况下,ECS1访问CLB内网地址的80端口时相当于访问自己的80端口,从抓包可看到源目IP都是自己,在回SYN_ACK时直接由lo网卡转发到本机,内核未看到SYN_ACK包对应五元组的SYN包,导致内核直接发送了RST。
b. 七层CLB下,由于CLB在中间隔离了TCP链接,因此ECS1看到的源IP均为CLB的内网IP,因此地址不会冲突。