Seu host usa um nome DNS? Em caso afirmativo, solicite Reescrita de DNS para ser ativada na regra NAT Cisco ASA para seu host.
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!
Seu host usa um nome DNS? Em caso afirmativo, solicite Reescrita de DNS para ser ativada na regra NAT Cisco ASA para seu host.
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".
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".