В прозрачном режиме для перенаправления трафика на squid используются следующие правила iptable.
iptables -I PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-ports 3128
Насколько мне известно, REDIRECT изменяет IP-адрес назначения на IP-адрес локального интерфейса.
Итак, когда трафик достигает squid, как squid узнает, куда его пересылать, если IP-адрес назначения теперь изменился?
Вы правы, что с REDIRECT
, Squid не может видеть исходный предполагаемый IP-адрес назначения; вместо этого он разрешит хост, предоставленный клиентом в Host:
Заголовок HTTP, который является обязательным в HTTP 1.1.
Это очень похоже на шлюз.
Когда клиентский хост не знает, где находится целевой хост, он отправляет пакет на шлюз по умолчанию. И шлюз определяет, куда этот пакет должен быть отправлен.
Прозрачный прокси делает то же самое. Все пакеты на xxx.xxx.xxx.xxx:80 перенаправляются на порт 3128 вместо порта, указанного в заголовке пакета. Squid анализирует пакет и его заголовки - src
, dst
и соответствующие порты, а затем отправьте пакет, как это делает шлюз, или немедленно отправьте ответ, если он был кэширован ранее.
Основная идея заключается в том, что порт назначения хранится в каждом пакете, в то время как пакет может быть направлен на разные хосты / порты в пути.