Здравствуйте. Примерно с месяц назад я спрашивал как заставить внутренние машины прозрачно (насильно :)) ходить через внешний прокси сервер (т.е. внешний по отношению к шлюзу, через который ходят внутренние машины). В конце концов остановился на такой схеме: запустил transproxy, которая слушала 100 порт, и [как я раньше думал] заворачивала все пришедшие на него пакеты в обёртку пригодную для прокси, в которой адрес назначения = адресу прокси. Роль этой обёртки - доставить пакет до прокси. Когда пакет доходит до прокси, она выбрасывает обёртку и посылает оригинальный пакет. Например: посылаем пакет из внутренней сети (dest=ip_google.ru:80). Iptables на шлюзе редиректит с 80 на 100 порт. Transproxy ловит пакет на 100 порту, заворачивает его в обёртку (dest=ip_ext_proxy:80(dest=ip_google.ru:80)). Пакет без проблем доходит до прокси, которая снимает обёртку и посылает (dest=ip_google.ru:80). [/как я раньше думал]. А вчера пришлось перенастроить фаерволл, и с удивлением обнаружил что если использовать такие правила дла внутренних машин:
iptables -t nat -A PREROUTING -s 192.168.0.5\ -p tcp -m multiport --dports 80 -j DNAT --to-destination $PROX_IP
iptables -t nat -A POSTROUTING -s 192.168.0.5 -j SNAT --to-source $EXT_IP
,где $PROX_IP, и $EXT_IP, это ip адреса внешней прокси и ip сетевухи в мир на моём шлюзе соответственно, то всё замечательно ходит через внешнюю проксю, даже если в броузере, не выставлять галочку "использовать прокси сервер 192.168.0.1:80", и не используя transproxy. Ну и соответственно возникает вопрос: Как это может работать? Я думал что DNAT - это когда мы посылаем пакет например dest=ip_google.ru, а DNAT меняет dest=на_что_нибудь_другое. Если так, то с вышеуказанными првилами iptables, должно происходить вот что: dest=ip_google_ru меняется на $PROX_IP пакет доходит до прокси, а она приняв его, снимает обёртку(которой нет), и не знает что с ним делать. Информация о том что пакет должен дойти до google.ru осталась на машине которая выполняет DNAT.
Пожалуйста проясните ситуацию, а то каша в голове.