TL / DR
Configurei uma regra nat estática para poder usar meu endereço IP público da Internet para ssh diretamente em uma máquina dedicada na rede interna. Como resultado, não posso mais usar ssh na máquina dedicada, quando conectado através da VPN AnyConnect. Por quê? Como faço para corrigir isso?
Longa história:
Eu tenho um ASA 5512-X que eu me uso para terminar sessões de VPN de AnyConnect. Isso tem funcionado muito bem. As pessoas usam o AnyConnect para conectar-se ao ASA, obtêm endereços IP do pool de IPs designado e podem acessar tudo o que eu coloco nas listas de acesso.
Agora, tenho essa ideia de encaminhar diretamente a porta 22 para uma máquina dedicada em minha rede (eu só tenho interfaces internas e externas), para que eu possa fazer o SSH no meu endereço IP público e terminar na máquina dedicada, sem a necessidade de uma conexão VPN.
A configuração parecia bastante simples:
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
e realmente funciona. Agora eu posso
ssh ssh.mydomain.com
e realmente obter uma sessão ssh na minha máquina dedicada. No entanto, esse sucesso tem um custo que ssh 10.0.0.1
não funciona mais quando eu estou conectado à minha rede ASA / através do AnyConnect como costumava fazer antes de configurar o NAT estático.
Eu posso controlar deterministicamente o comportamento do ASA:
Quando não tenho a nat (inside,outside)
linha na minha configuração,
ssh 10.0.0.1
funciona masssh ssh.mydomain.com
não funciona.
Quando tenho a nat (inside,outside)
regra como parte da configuração, é o contrário:
ssh ssh.mydomain.com
funciona masssh 10.0.0.1
não funciona.
Para investigar eu estabeleci uma captura no 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
Quando eu me conecto pela primeira vez através do AnyConnect e tento ssh 10.0.0.1
, a captura não mostra / captura nada, desde que a nat (inside,outside)
regra esteja ativa. Além disso, minhas tentativas de conexão SSH nunca chegam ao servidor.
Claramente o ASA está comendo os pedidos de conexão que originam dos pontos finais conectados de AnyConnect, quando a nat
regra está ativa.
No começo, pensei em exigir alguma adição à lista de acesso, mas não consegui fazê-la funcionar dessa maneira. Em que interface o tráfego VPN entra no ASA de qualquer maneira? fora ou dentro? Suponho que, neste caso, não importe, porque estou usando um curinga ( any
) para a fonte, que, na minha opinião, inclui também o tráfego VPN.
Então pensei que o ASA sempre aplicaria o nat, o que significa que o pacote que carrega o SYN-ACK seria natted para o meu IP externo que interrompe a conexão, pois estou me conectando a partir de um endereço VPN privado, não da Internet. Mas os SYNs nunca chegam ao servidor, portanto, não há SYN-ACKs.
Passei o dia todo entortando minha cabeça em torno do "novo" nat
comando. Quando eu faço um show nat
no meu ASA eu recebo
Auto NAT Policies (Section 2)
1 (inside) to (outside) source static MyEndpoint interface service tcp ssh ssh
translate_hits = 0, untranslate_hits = 0
Até onde cheguei hoje, isso apenas faz uma tradução de endereço de origem para deixar o tráfego. Não faço ideia de como / por que isso implica uma tradução de endereço de destino para o tráfego originado na Internet que chega ao ASA. Alguém pode me explicar por que o ASA está se comportando dessa maneira?
Editar 1: packet-tracer
Lendo as documentações, vim através do comando ASA packet-tracer
. Quando eu faço
packet-tracer input inside tcp 10.100.0.2 31337 10.0.0.1 22
O ASA me diz que um fluxo seria criado e o pacote aceito. Quando eu faço
packet-tracer input outside tcp 10.100.0.2 31337 10.0.0.1 22
eu recebo
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
Então, acho que esse é um comportamento implicitamente desejado, exceto se você for eu.
Edit 2: Procurando por grampos de cabelo
Encontrei alguns artigos que acabaram me apontando para esse promissor, que continha as informações de que talvez eu precisasse de uma regra nat, de acordo com as linhas de
nat (outside,outside) \
source static \
client_vpn_pool client_vpn_pool \
destination static \
remote_office_net remote_office_net
mas não funcionou. Eu tenho um objeto de rede para minha sub-rede do cliente VPN e um objeto de rede para a sub-rede 10.0.0.1. A adaptação do modelo acima não produziu o resultado esperado.
Quando minha nat (inside,outside)
regra está em vigor, o SSH não funciona, mas posso executar o ping 10.0.0.1. Quando adiciono uma nat (outside,ouside)
regra, conforme sugerido pelo artigo, o ping para de funcionar. Eu também tentei versões da regra fora ou fora com objetos de rede para o host específico e apenas o intervalo do ip local pool
usado para clientes VPN. Todos eles fazem o ping parar.
Editar 3: Não importa
Está funcionando agora. Eu literalmente não mudei nada. Eu apenas fui para a cama. Eu acho que houve algum estado interno no ASA que causou esse comportamento e o tempo limite expirou enquanto eu estava dormindo.
Ainda existe o que quando eu uso o packet-tracer input [inside|outside] tcp <my vpn ip> 31337 10.0.0.1 22
packet-tracer sempre diz que o pacote seria descartado.
Quando eu coloco packet-tracer input inside
ele falha em:
Phase: 6
Type: WEBVPN-SVC
Subtype: in
Result: DROP
Config:
Additional Information:
[...]
Drop-reason: (acl-drop) Flow is denied by configured rule
e quando eu coloco packet-tracer input outside
ele falha em:
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
No entanto, a partir de hoje, o ping e o SSH de / para o meu laptop conectado à VPN para o MyEndpoint (também conhecido como 10.0.0.1) funcionam como um encanto. Como essa coisa ASA funciona ???