Squid 3.3 Прозрачный IPv4 и IPv6 Proxy с TPROXY

3739
James White

Я пытаюсь изменить настройку прозрачности Squid с использования универсального NAT, который ограничен только IPv4, и переключаю его на TPROXY для поддержки IPv6. У меня возникают проблемы с получением прозрачных клиентов для работы в новой настройке, однако все запросы выполняются с помощью squid, выдающего следующую ошибку для всех запросов:

"Запрашиваемый адрес недоступен"

Казалось бы, есть проблема маршрутизации где-то, но я не уверен, что не так.

Я использую iptablesи ip6tablesна своем маршрутизаторе DD-WRT и прокси-сервере Squid вместе с iproute2компонентами маршрутизации с обеих сторон.

По умолчанию кажется, что ip6table_mangleмодуль не загружен по умолчанию в DD-WRT, но был скомпилирован в сборку, запущенную на моем маршрутизаторе:

find /lib/modules -name "*.ko" | grep -i mangle /lib/modules/3.10.89/ip6table_mangle.ko 

Загрузил модуль и добавил в скрипт запуска для будущих загрузок:

insmod ip6table_mangle 

Информация о маршрутизации DD-WRT:

# Squid transparent proxy PROXY_IPV4="192.168.x.x" PROXY_IPV6="xxxx:xxxx:xxxx:xxxx::x" CLIENTIFACE=br0 FWMARK=3  iptables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -s $PROXY_IPV4 -j ACCEPT ip6tables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -s $PROXY_IPV6 -j ACCEPT  iptables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -j MARK --set-mark $FWMARK iptables -t mangle -A PREROUTING -m mark --mark $FWMARK -j ACCEPT ip6tables -t mangle -A PREROUTING -i $CLIENTIFACE -p tcp --dport 80 -j MARK --set-mark $FWMARK ip6tables -t mangle -A PREROUTING -m mark --mark $FWMARK -j ACCEPT  iptables -t filter -A FORWARD -i $CLIENTIFACE -o $CLIENTIFACE -p tcp --dport 80 -j ACCEPT ip6tables -t filter -A FORWARD -i $CLIENTIFACE -o $CLIENTIFACE -p tcp --dport 80 -j ACCEPT  ip rule add fwmark $FWMARK table 2 ip -6 rule add fwmark $FWMARK table 2 ip route add default via $PROXY_IPV4 table 2 ip -6 route add default via $PROXY_IPV6 table 2  # End Squid intercept proxy config 

Маршрутизация Squid Proxy (на самом сервере):

iptables -F -t mangle iptables -X -t mangle ip6tables -F -t mangle ip6tables -X -t mangle iptables -t mangle -N DIVERT ip6tables -t mangle -N DIVERT  iptables -t mangle -A DIVERT -j MARK --set-mark 1 iptables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT iptables -t mangle -A DIVERT -j ACCEPT iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129  ip6tables -t mangle -A DIVERT -j MARK --set-mark 1 ip6tables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT ip6tables -t mangle -A DIVERT -j ACCEPT ip6tables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129  ip -f inet rule add fwmark 1 lookup 100 ip -f inet route add local default dev eno1 table 100  ip -f inet6 rule add fwmark 1 lookup 100 ip -f inet6 route add local default dev eno1 table 100 

Squid Conf:

http_port 3129 tproxy 

Конфигурация sysctl:

net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.lo.rp_filter = 0 net.ipv4.conf.eno1.rp_filter = 0 

eno1это основной интерфейс Ethernet, который я также пытался использовать loбез какого-либо успеха.

Трафик передается в Squid, поэтому кажется, что маршрутизатор выполняет свою работу. Это когда трафик заканчивается в Squid box, где он, кажется, идет не так. Все запросы регистрируются, но возвращаются 500 ошибок.

Насколько я знаю, моя установка поддерживает TPROXY:

  • CentOS 7
  • Кальмар 3.3.8 (EPEL)
  • iptables / ip6tables 1.4.21
  • Ядро Linux 3.10
  • libcap 2.22

Я использовал эти источники в качестве руководства, но не могу получить рабочую настройку.

Любой совет, в чем может быть проблема или отладить дальше?

1

1 ответ на вопрос

1
James White

Turns out everything was correctly setup. What the actual problem was is my cache_peer directive for Privoxy. The error thrown is actually Squid saying it can't hand off the traffic to Privoxy. This is because the tproxy setup is confusing it.

In order to avoid it you have to add no-tproxy to the cache_peer line

cache_peer hostname parent 8118 7 no-tproxy ... 

Похожие вопросы