Я пытаюсь изменить настройку прозрачности Squid с использования универсального NAT, который ограничен только IPv4, и переключаю его на TPROXY для поддержки IPv6. У меня возникают проблемы с получением прозрачных клиентов для работы в новой настройке, однако все запросы выполняются с помощью squid, выдающего следующую ошибку для всех запросов:
"Запрашиваемый адрес недоступен"
Казалось бы, есть проблема маршрутизации где-то, но я не уверен, что не так.
Я использую iptables
и ip6tables
на моем маршрутизаторе DD-WRT и Squid Proxy вместе с 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
Я использовал эти источники в качестве руководства, но не могу получить рабочую настройку.
- http://wiki.squid-cache.org/ConfigExamples/Intercept/IptablesPolicyRoute
- http://wiki.squid-cache.org/Features/Tproxy4#Feature:_TPROXY_version_4.1.2B-_Support
Любой совет, в чем может быть проблема или отладить дальше?