Назад | Перейти на главную страницу

Cisco ASA NAT - внутренний хост видит свой публичный IP-адрес

У меня есть сервер, размещенный у провайдера, который использует Cisco ASA для нат. У меня проблема в том, что внутренний сервер с общедоступным IP-адресом будет видеть свой общедоступный IP-адрес как исходный. Это в основном нарушает работу приложения, которое по какой-то причине пытается подключиться к внешнему ip.

Провайдер не будет раскрывать свою конфигурацию на ASA, и я спрашиваю, может ли кто-нибудь объяснить, что это за нат и что я могу попросить у провайдера сделать - на данный момент они говорят, что все работает на них ...

Спасибо!

Ваш хост использует DNS-имя? Если да, попросите Перезапись DNS для включения в правиле Cisco ASA NAT для вашего хоста.

хорошо, я получил. У меня такая же претензия к NAT-роутерам в целом. Это так неприятно, когда ты не можешь подключиться к внешней точке зрения изнутри. Это довольно часто случается со многими маршрутизаторами.

Эту проблему можно обойти, используя NAT в iptables Linux для перенаправления попытки подключения к внешнему IP-адресу с подключением к внутреннему IP-адресу. Приложение даже не узнает, что его место подключения было изменено. В любом случае он будет думать, что подключен снаружи.

Это было бы примерно так:

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

Вы можете быть настолько избирательными, насколько захотите, даже делая этот NAT только для определенных пользователей с типом соответствия "-m owner! --Uid-owner 0".

Допускает ли приложение ручное изменение места привязки? Полагаю, это уже исключено.

Указан ли внешний IP-адрес в / etc / hosts?

Отсюда я собираюсь немного поработать с этим ответом и сосредоточиться на приложении, а не на nat. В частности, я собираюсь изучить, что вы можете сделать вне приложения, чтобы обмануть его. Это будет только для отчаявшихся. Предполагается, что это операционная система Linux.

Во-первых, приложение должно каким-то образом получить IP-адрес извне. В конечном итоге это будет доступ к файлу (/ sys / ...), вызов библиотеки C или внешний исполняемый файл (/ sbin / ifconfig). Мы можем попытаться выяснить, как он получает эту информацию через strace.

strace -f /path/to/app

Вывод будет очень подробным и техническим, но может помочь вам определить механизм, используемый приложением для определения IP.

Вот пример "hostname -i", который разрешает основной IP-адрес моего настольного компьютера:

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

Мы видим, что он пробует несколько методов, а затем фактически находит совпадение в файле / etc / hosts.

Теперь способы обмануть его:

1) Если приложение читает из / sys, то немного сложно обмануть, если не считать вручную созданной среды chroot.

2) Если приложение выполняет вызов библиотеки C, пользовательская общая библиотека может быть загружена вместе с приложением, чтобы переопределить и изменить поведение соответствующего вызова библиотеки. Несвязно, я использовал этот трюк, чтобы временно отключить вызов "fsync" для приложения, которое требует его при нормальной работе.

3) Если приложение вызывает исполняемый файл (/ sbin / ifconfig?), Можно заменить этот исполняемый файл версией, которая выборочно изменяет его поведение только для этого приложения. Рассмотрите возможность установки переменной среды только для приложения и регистрации настраиваемого исполняемого файла.

Это может быть не по теме и не совсем конкретно, но я просто хочу поделиться высокоуровневым представлением о том, как можно обмануть приложение, когда все другие возможности исчерпаны, и вам просто нужно «заставить его работать».