У меня есть сервер, размещенный у провайдера, который использует 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?), Можно заменить этот исполняемый файл версией, которая выборочно изменяет его поведение только для этого приложения. Рассмотрите возможность установки переменной среды только для приложения и регистрации настраиваемого исполняемого файла.
Это может быть не по теме и не совсем конкретно, но я просто хочу поделиться высокоуровневым представлением о том, как можно обмануть приложение, когда все другие возможности исчерпаны, и вам просто нужно «заставить его работать».