Cisco ASA NAT - host interno vê seu ip público

2

Eu tenho um servidor hospedado por um provedor que usa o Cisco ASA para fazer nat. O problema que tenho é que o servidor interno que está nat-ed com um ip público vai ver o seu ip público como fonte ip. Isso basicamente quebra um aplicativo que tentará se ligar ao ip externo por algum motivo.

O provedor não divulgará sua configuração no ASA e eu estou perguntando se alguém pode explicar que tipo de nat é isso e o que eu posso pedir ao provedor para fazer - neste momento eles dizem que está tudo funcionando para eles. .

obrigado!

    
por silviud 30.01.2015 / 02:23

3 respostas

3

Seu host usa um nome DNS? Em caso afirmativo, solicite Reescrita de DNS para ser ativada na regra NAT Cisco ASA para seu host.

    
por 30.01.2015 / 05:33
0

O aplicativo permite a substituição manual de onde ele se liga? Eu suponho que isso já foi descartado.

O IP externo está listado em / etc / hosts?

A partir daqui, vou sair um pouco com essa resposta e focar no aplicativo, não no nat. Em particular, vou explorar o que você pode fazer fora do aplicativo para enganá-lo. Isso seria apenas para os desesperados. Isso assumirá um sistema operacional Linux.

Primeiro, o aplicativo deve, de alguma forma, obter o endereço IP de fora de si mesmo. Isso será basicamente um acesso ao arquivo (/ sys / ...), uma chamada da biblioteca C ou um executável externo (/ sbin / ifconfig). Podemos tentar descobrir como obtém essa informação via strace.

strace -f /path/to/app

A saída será muito detalhada e técnica, mas poderá ajudá-lo a determinar o mecanismo usado pelo aplicativo para determinar o IP.

Aqui está um exemplo de "hostname -i", que resolve o IP principal da minha máquina desktop:

strace hostname -i
execve("/bin/hostname", ["hostname", "-i"], [/* 69 vars */]) = 0
...
socket(PF_NETLINK, SOCK_RAW, 0)         = 3
bind(3, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 0
getsockname(3, {sa_family=AF_NETLINK, pid=17272, groups=00000000}, [12]) = 0
...
connect(3, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
...
open("/etc/nsswitch.conf", O_RDONLY)    = 3
...
open("/etc/host.conf", O_RDONLY)        = 3
...
open("/etc/resolv.conf", O_RDONLY)      = 3
...
open("/etc/hosts", O_RDONLY|O_CLOEXEC)  = 3
read(3, "127.0.0.1\tlocalhost\n192.168.1.4\t"..., 4096) = 338
close(3)                                = 0
...
write(1, "192.168.1.4\n", 12192.168.1.4

Podemos ver que ele tenta várias técnicas e, na verdade, encontra uma correspondência no arquivo / etc / hosts.

Agora, maneiras de enganar:

1) Se o aplicativo ler de / sys, é um pouco difícil enganar a falta de um ambiente chroot feito à mão.

2) Se o aplicativo fizer uma chamada da biblioteca C, uma biblioteca compartilhada personalizada poderá ser carregada com o aplicativo para substituir e alterar o comportamento da chamada da biblioteca correspondente. Não relacionado, usei este truque para desativar temporariamente a chamada "fsync" de um aplicativo que exige isso em operação normal.

3) Se o aplicativo chamar um executável (/ sbin / ifconfig?), é possível substituir esse executável por uma versão que altere seletivamente seu comportamento apenas para este aplicativo. Considere definir uma variável de ambiente apenas para o aplicativo e fazer check-in do executável personalizado.

Isso pode ser um assunto fora do comum e não é específico de verdade, mas eu só quero compartilhar uma ideia de alto nível de como você pode enganar um aplicativo quando todas as outras opções estiverem esgotadas e você só precisa "fazer funcionar".

    
por 30.01.2015 / 04:16
0

ok, eu tenhochya. Eu tenho essa mesma reclamação sobre roteadores NAT em geral. É tão frustrante quando você não consegue se conectar ao ponto de vista externo por dentro. Este é frequentemente o caso de muitos roteadores.

Você pode contornar esse problema usando NAT em seu iptables do Linux para redirecionar uma tentativa de conectar-se ao IP externo com uma conexão com o IP interno. O aplicativo nem saberá que seu destino de conexão foi alterado. Para todos os efeitos, vai pensar que se conectou do lado de fora.

Seria algo como:

/sbin/iptables -t nat -A OUTPUT \
  -p tcp \
  -d $EXTERNAL_IP \
  --dport $EXTERNAL_PORT \
  -j DNAT --to-destination $INTERNAL_IP:$INTERNAL_PORT

Você pode ser tão seletivo quanto desejar, mesmo fazendo esse NAT apenas para usuários específicos com o tipo de correspondência "-m owner! --uid-owner 0".

    
por 30.01.2015 / 04:31