Cisco ASA 上的 TCP 握手失败

网络工程 思科 防火墙 通讯协议
2021-07-20 01:20:43

我正在使用流量生成器来设置应该通过 Cisco ASA 防火墙的 TCP 连接。

我的拓扑如下所示:

                     +------------------+                      
                     |  CISCO ASA       |                      
+------------+       |                  |                      
|  Client    +-------+Outside           |                      
|  10.1.202.1|       |10.1.202.254      |                      
|            |       |                  |        +------------+
+------------+       |            Inside|        |Server      |
                     |      10.1.102.254+--------+10.1.102.19 |
                     |                  |        |            |
                     +------------------+        +------------+

应该建立从外部网络 (10.1.202.1/24) 中的一台主机到内部网络 (10.1.102.19/24) 中的服务器的连接。

我在 Wireshark 中看到SYN通过了防火墙 (10.1.(1/2)02.254),SYN-ACK 没有通过并被丢弃(参见捕获:内部接口外部接口)。

show asp drop我所知,由于以下原因,帧被丢弃:

TCP failed 3 way handshake (tcp-3whs-failed)

我没有使用ARP,而是使用防火墙接口的MAC地址,这是默认网关。

我创建了SYN,SYN-ACKACK喜欢以下内容:

SYN:(客户端(外部)到服务器(内部))

**Ethernet**
Destination MAC: <Mac Address of the Firewall-Interface>
Source MAC: <Mac Address of the Sending Device-Interface>

**IP**
Source IP: 10.1.202.1
Destination IP: 10.1.102.19
Default Gateway: 10.1.202.254

**TCP**
Source Port: 9000
Destination Port: 8000
Sequence number: 0
Acknowledgement number: 0
Synchronize: 1
Acknowledgement: 0

SYN-ACK:(服务器(内部)到客户端(外部))(这个不通过防火墙)

**Ethernet**
Destination MAC: <Mac Address of the Firewall-Interface>
Source MAC: <Mac Address of the Sending Device-Interface>

**IP**
Source IP: 10.1.102.19
Destination IP: 10.1.202.1
Default Gateway: 10.1.102.254

**TCP**
Source Port: 8000
Destination Port: 9000
Sequence number: 0
Acknowledgement number: 1
Synchronize: 1
Acknowledgement: 1

ACK:(客户端(外部)到服务器(内部))

**Ethernet**
Destination MAC: <Mac Address of the Firewall-Interface>
Source MAC: <Mac Address of the Sending Device-Interface>

**IP**
Source IP: 10.1.202.1
Destination IP: 10.1.102.19
Default Gateway: 10.1.202.254

**TCP**
Source Port: 9000
Destination Port: 8000
Sequence number: 1
Acknowledgement number: 1
Synchronize: 0
Acknowledgement: 1

此外,我的拓扑如下:

流量生成器客户端(外部网络)连接到添加了 VLAN 的交换机。交换机连接到外部防火墙接口。在内部网络中,流量生成器连接到添加了 VLAN 标记的交换机,交换机连接到防火墙的内部接口。

谁能告诉我为什么 ASA 放弃了SYN-ACK

提前致谢!

编辑:

  • 正如 Ron Trunk 所建议的,我使用以下方法禁用了序列号的随机化:

    随机序列号禁用

  • 添加了对内部接口外部接口的捕获

  • 更新了捕获文件

4个回答

默认情况下,ASA 随机化握手中的序列号(以防止会话劫持)。所以你的序列号实际上并不匹配。您可以关闭该功能。

random-sequence-number disable

在您的内部捕获中,有两个数据包从服务器 (10.1.102.19) 到客户端 (10.1.202.1),但它们来自不同的 MAC 地址。

#23 Ethernet II, Src: 00:10:94:00:00:01 (00:10:94:00:00:01), Dst: 00:19:55:07:12:ca (00:19:55:07:12:ca)
    Internet Protocol Version 4, Src: 10.1.102.19 (10.1.102.19), Dst: 10.1.202.1 (10.1.202.1)
    Transmission Control Protocol, Src Port: 8000 (8000), Dst Port: 9000 (9000), Seq: 0, Ack: 19112639, Len: 0

#25 Ethernet II, Src: 00:10:94:00:00:02 (00:10:94:00:00:02), Dst: 00:19:55:07:12:ca (00:19:55:07:12:ca)
    Internet Protocol Version 4, Src: 10.1.102.19 (10.1.102.19), Dst: 10.1.202.1 (10.1.202.1)
    Transmission Control Protocol, Src Port: 8000 (8000), Dst Port: 9000 (9000), Seq: 0, Ack: 1, Len: 0

这看起来很奇怪,但可能不是你的问题。据我所知,你的问题如下:

似乎服务器本身会自然地响应您精心制作的 SYN 数据包,其中包含数据包#23(内部上限,见上文)中的 RST-ACK——可能是因为端口 8000 已关闭。这将提示防火墙将 RST 转发到外部(外部上限中的数据包#23),并从其状态表中清除此连接。

但是您精心制作的 SYN-ACK 数据包在 #25(内部上限)中触发,提示来自防火墙(#26)的 RST,因为连接表中没有与此流相关的条目。

你能在你的 ASA 上运行以下命令吗:

// 为所有asp drop启用所有捕获

ASA# capture asp-drop type asp-drop all

// 显示捕获缓冲区,它应该识别握手失败的原因

ASA# sh capture asp-drop

应显示类似于以下内容但针对您的特定掉落类型:

   2 packets captured
   1: 15:15:00.682154 197.2.1.29.2616 > 87.200.42.101.443: S 1239395083:1239395083(0) win 65535 <mss 1260,nop,nop,sackOK> Drop-reason: (acl-drop) Flow is denied by configured rule
   4: 15:15:00.750830 10.70.0.162.3812 > 168.252.3.41.15: S 3523756300:3523756300(0) win 65535 <mss 1360,nop,nop,sackOK> Drop-reason: (rpf-violated) Reverse-path verify failed

请记住,ASA 的一项基本规则是,要启动从安全性较低的接口(外部)到安全性较高的接口(内部)的流量,必须有一个显式的 ACL 条目以允许此流量通过。如果没有看到您的 ASA 配置,就很难判断是什么导致了问题。

您正在描述 ASA 的正常/默认操作。只允许已建立的 TCP 连接从 OUTSIDE 到 INSIDE。您可以通过配置TCP State Bypass来禁用它

Step 1 Choose Configuration > Firewall > Service Policy.

Step 2 Click Add > Add Service Policy Rule.

Alternatively, if you already have a rule for the hosts, edit the rule.

Step 3 Select whether to apply the rule to a specific interface or globally to all interfaces, and click Next.

Step 4 For Traffic Classification, select Source and Destination IP Addresses (uses ACL) and click Next.

Step 5 For the ACL rule, enter the IP addresses of the hosts on each end of the route in Source and Destination, and specify the protocol as TCP. Click Next when finished.

For example, if you want to bypass TCP state checking between 10.1.1.1 and 10.2.2.2, enter:

Source = 10.1.1.1
Destination = 10.2.2.2
Destination Protocol = tcp
Step 6 On the Rule Actions page, click the Connection Settings tab and select TCP State Bypass.

Step 7 Click Finish to save the rule, and Apply to update the device.