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