Нашёл TransparetProxy-howto. В нем описывается как настроить прозрачный прокси с локальным Squid (как я понял это прокся). А дальше есть такие строки:
6. Transparent Proxy to a Remote Box
Now, the question naturally arises, if we can do all this nifty stuff redirecting HTTP connections to local ports, could we do the same thing but to a remote box (e.g., the machine with squid running is not the same machine as iptables is running on). The answer is yes....
Первый споссоб, такой:
iptables -t nat -A PREROUTING -i eth0 -s ! squid-box -p tcp --dport 80 -j DNAT --to squid-box:3128
iptables -t nat -A POSTROUTING -o eth0 -s local-network -d squid-box -j SNAT --to iptables-box
iptables -A FORWARD -s local-network -d squid-box -i eth0 -o eth0 -p tcp --dport 3128 -j ACCEPT
Где squid-box - ip адрес удалённой прокси, local-network - это локальная сеть для которой мы являемся шлюзом, а iptables-box - это ip нашегно шлюза-фаервола.
И я что-то неочень понимаю, как оно работает. Вот например как я понимаю первую запись: у всех пакетов которые приходят на eth0, на 80-й порт tcp соединения, имеют адрес отправителя не = ip(squid-box), необходимо перед решением о роутинге поменять адрес получателя на ip(sqid-box):3128.
И как это так? Например оправляю я запрос на (google.ru) из локалки. Фаервол принимает запрос проверяет: пришёл на eth0, адрес источника - не ip(squid-box), порт 80. Пакт правилу удовлетворяет => надо поменять ip(google.ru) на ip(squid-box). Squid-box (прокся) пакет получит, но откуда она узнает куда его отправлять дальше? Вобщем я чего-то не понимаю, объясните пожалуйста.