Cisco ASA:为什么静态 NAT 会阻止通过 VPN 进行访问?

网络工程 思科 纳特 cisco-anyconnect
2021-07-18 01:59:18

TL/DR

我设置了一个静态 nat 规则,以便我可以使用我的公共互联网 IP 地址直接通过 ssh 连接到内部网络上的专用机器。因此,当通过 AnyConnect VPN 连接时,我无法再通过 ssh 进入专用机器。为什么?我该如何解决?

很长的故事:

我有一个 ASA 5512-X,用于终止 AnyConnect VPN 会话。这一直很有效。人们使用 AnyConnect 连接到 ASA,从专门分配的 IP 池中获取 IP 地址,他们可以访问我放在访问列表中的所有内容。

现在,我有这个想法将端口 22 直接转发到我网络中的专用机器(我只有内部和外部接口),这样我就可以通过 SSH 连接到我的公共 IP 地址并最终在专用机器上,而不需要VPN 连接。

设置似乎很简单:

object network MyEndpoint
    host 10.0.0.1
    nat (inside, outside) static interface service tcp ssh ssh
access-list from_outside_inside extended permit tcp any object MyEndpoint eq ssh
access-group from_outside_inside in interface outside

它确实有效。现在我能

ssh ssh.mydomain.com

并在我的专用机器上实际获得 ssh 会话。然而,ssh 10.0.0.1在我设置静态 NAT 之前,当我像以前一样通过 AnyConnect 连接到我的 ASA/网络时,这种成功的代价将不再起作用。

我可以确定性地控制 ASA 的行为:

当我没有nat (inside,outside)线我的配置,

  • ssh 10.0.0.1 有效但
  • ssh ssh.mydomain.com 不起作用。

当我拥有nat (inside,outside)规则作为配置的一部分,它是倒过来:

  • ssh ssh.mydomain.com 有效但
  • ssh 10.0.0.1 不起作用。

为了进行调查,我在 ASA 上设置了捕获

capture MyEndpoint type raw-data interface inside
capture MyEndpoint type raw-data interface outside
capture MyEndpoint match tcp host 10.0.0.1 any

当我第一次通过 AnyConnect 连接然后尝试连接时ssh 10.0.0.1,只要nat (inside,outside)规则处于活动状态,捕获就不会显示/捕获任何内容此外,我的 SSH 连接尝试从未到达服务器。

显然,当nat规则处于活动状态时,ASA 正在处理源自 AnyConnect 连接端点的连接请求

起初我以为我需要在访问列表中添加一些内容,但我无法让它以这种方式工作。VPN 流量无论如何都会在哪个接口进入 ASA?外面还是里面?我想在这种情况下并不重要,因为我使用通配符 ( any) 作为源,在我看来,它也包括 VPN 流量。

然后我认为 ASA 将始终应用 nat,这意味着携带 SYN-ACK 的数据包将被 nat 到我的外部 IP,这会中断连接,因为我从私有 VPN 地址而不是 Internet 进行连接。但是 SYN 永远不会到达服务器,因此没有 SYN-ACK。

我花了一整天的时间来思考“新”nat命令。当我show nat在我的 ASA 上做一个时,我得到

Auto NAT Policies (Section 2)
1 (inside) to (outside) source static MyEndpoint interface   service tcp ssh ssh 
    translate_hits = 0, untranslate_hits = 0

就我今天所得到的而言,这只对离开流量进行源地址转换。我不知道,这如何/为什么意味着对源自 Internet 到达 ASA 的流量进行目标地址转换。有人可以向我解释为什么 ASA 会这样吗?

编辑1: packet-tracer

通过阅读文档,我遇到了 ASA 命令packet-tracer当我做

packet-tracer input inside tcp 10.100.0.2 31337 10.0.0.1 22

ASA 告诉我将创建一个流并接受数据包。当我做

packet-tracer input outside tcp 10.100.0.2 31337 10.0.0.1 22

我得到

Phase: 6
Type: WEBVPN-SVC
Subtype: in
Result: DROP
Config:
Additional Information:

Result:
input-interface: outside
input-status: up
input-line-status: up
output-interface: inside
output-status: up
output-line-status: up
Action: drop
Drop-reason: (acl-drop) Flow is denied by configured rule

所以我想这是一些隐含想要的行为,除非你是我。

编辑 2:搜索发夹

我找到了一些文章,这些文章最终将我指向了这个有前途的文章,其中包含的信息我可能需要一个类似于以下内容的 nat 规则

nat (outside,outside) \
    source static \
        client_vpn_pool client_vpn_pool \
    destination static \
        remote_office_net remote_office_net

但它没有用。我有一个用于我的 vpn 客户端子网的网络对象和一个用于 10.0.0.1 子网的网络对象。调整上面的模板并没有产生预期的结果。

当我的nat (inside,outside)规则到位时,SSH 不起作用,但我可以 ping 10.0.0.1 就好了。当我nat (outside,ouside)按照文章的建议添加规则时,ping 停止工作。我还尝试了针对特定主机的网络对象和仅ip local pool用于 vpn 客户端的范围的外部外部规则版本他们都只是让 ping 停止。

编辑3:没关系

它现在正在工作。我真的没有改变任何东西。我刚上床睡觉。我猜 ASA 中有一些内部状态导致了这种行为,并且在我睡着时超时。

仍然存在当我使用packet-tracer input [inside|outside] tcp <my vpn ip> 31337 10.0.0.1 22数据包跟踪器时总是说数据包会被丢弃的问题。

当我把packet-tracer input inside放在失败时:

Phase: 6
Type: WEBVPN-SVC
Subtype: in
Result: DROP
Config:
Additional Information:

[...]
Drop-reason: (acl-drop) Flow is denied by configured rule

当我把packet-tracer input outside放在失败时:

Phase: 6
Type: NAT
Subtype: rpf-check
Result: DROP
Config:
object network MyEndpoint
 nat (inside,outside) static interface service tcp ssh ssh 
Additional Information:

[...]
Drop-reason: (acl-drop) Flow is denied by configured rule

然而,截至今天,从我的 VPN 连接的笔记本电脑到 MyEndpoint(又名 10.0.0.1)的 ping 和 SSH 非常有用。这个 ASA 的东西是如何工作的???

2个回答

那么,如果我理解正确的话,当通过 VPN 连接时,您无法通过 SSH 访问 ASA 的内部接口?您是否尝试过在 ASA 上发出以下命令:

内部管理访问

如果您的 VPN 隧道终止于一个接口,但您希望通过访问不同的接口来管理 ASA,则需要将该接口标识为管理访问接口。

请注意,在访问基于 Web 的 SSL VPN 时,NAT 和 PAT 在 CISCO ASA 中受到限制。此外,必须使用双向 ACL 指定流量,即使已经建立了从较高级别主机到较低级别主机的连接(不再有状态),也必须允许从较低安全性主机到较高安全性主机的返回连接)。

希望这是您配置的 NAT 不起作用的原因。

在 ASA 中使用命令“sysopt connection permit-vpn”来允许 VPN 流量,而不管访问列表(通过允许整个 VPN 流量的豁免策略),但是您可以使用 VPN 过滤器和策略来限制流量。

假设该命令在您的防火墙上处于活动状态,并且您的 VPN 策略上未正确配置 dns-server 值属性。

很高兴看到它在没有任何更改的情况下为您工作。