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 的东西是如何工作的???