Назад | Перейти на главную страницу

Получение Squid и TPROXY с IPv6 при работе на CentOS 7

Мне не удается заставить TPROXY работать со Squid и IPv6 на сервере CentOS 7. Ранее я использовал общую настройку перехвата с NAT, но она была ограничена только IPv4. Сейчас я расширяю настройку, чтобы включить IPv6 с TPROXY.

Я использовал официальную вики-статью Squid на эту тему, чтобы настроить все:

http://wiki.squid-cache.org/Features/Tproxy4

Пока что конфигурация TPROXY, похоже, работает для IPv4 без проблем. Однако с IPv6 соединения истекают по таймауту и ​​не работают должным образом. Я разобью настройку для лучшего понимания.

Обратите внимание, что все правила брандмауэра и маршрутизации одинаковы для IPv4, с той лишь разницей, что inet6 и ip6tables для настройки правил на основе IPv6 в примерах ниже.

Подключение IPv6 в настоящее время осуществляется через туннель 6in4 через Hurricane Electric, это настраивается на маршрутизаторе DD-WRT, а затем назначенный префикс делегируется клиентам через radvd. В блоке Squid настроено несколько статических IPv6-адресов.

Ящик Squid находится в основной локальной сети, которую он обслуживает. Клиенты, трафик которых перехватывается через порт 80 (в основном беспроводные клиенты), отправляются в Squid-бокс через мой маршрутизатор DD-WRT со следующими правилами брандмауэра и маршрутизации, адаптированными из статьи вики по маршрутизации политики и вики DD-WRT

Похоже, это работает нормально с точки зрения передачи трафика в окно Squid. Еще одно правило, которое мне пришлось добавить на маршрутизатор DD-WRT в дополнение к вышеизложенному, было правилом исключения для настроенных исходящих адресов IPv4 и IPv6 в поле Squid, иначе я получаю сумасшедшую проблему с петлей, и трафик прерывается для всех клиентов, включая основная LAN, которая использует Squid на 3128.

ip6tables -t mangle -I PREROUTING -p tcp --dport 80 -s "$OUTGOING_PROXY_IPV6" -j ACCEPT

Затем в поле Squid я использую следующие правила маршрутизации и цепочку DIVERT для соответствующей обработки трафика. Мне нужно было добавить дополнительные правила, чтобы предотвратить любые ошибки в цепочке, уже существующей во время тестирования. Мой брандмауэр CSF, Я добавил в csfpre.sh

ip -f inet6 route flush table 100
ip -f inet6 rule del fwmark 1 lookup 100

ip -f inet6 rule add fwmark 1 lookup 100
ip -f inet6 route add local default dev eno1 table 100

ip6tables -t mangle -F
ip6tables -t mangle -X
ip6tables -t mangle -N DIVERT

ip6tables -t mangle -A DIVERT -j MARK --set-mark 1
ip6tables -t mangle -A DIVERT -j ACCEPT
ip6tables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT
ip6tables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 3129

squid.conf настроен на два порта:

http_proxy 3128
http_proxy 3129 tproxy

Кроме того, я также использую Privoxy, и мне пришлось добавить no-tproxy в мою строку cache_peer, иначе весь трафик не мог быть перенаправлен для обоих протоколов.

cache_peer localhost parent 8118 7 no-tproxy no-query no-digest

Я не использую tcp_outgoing_address директивы из-за Privoxy, вместо этого я контролирую исходящие адреса через CentOS и порядок привязки.

Значения sysctl:

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

Я не уверен, что rp_filter модификации необходимы, поскольку установка работает на IPv4 с ними или без них и дает тот же результат для IPv6.

SELINUX

SELINUX включен в окне Squid, но политики были настроены так, чтобы разрешить настройку TPROXY, поэтому он не блокируется (работа IPv4 все равно показывает это). Я проверил с grep squid /var/log/audit/audit.log | audit2allow -a и получить <no matches>

#============= squid_t ==============

#!!!! This avc is allowed in the current policy
allow squid_t self:capability net_admin;

#!!!! This avc is allowed in the current policy
allow squid_t self:capability2 block_suspend;

#!!!! This avc is allowed in the current policy
allow squid_t unreserved_port_t:tcp_socket name_connect;

Я также установил следующие логические значения:

setsebool squid_connect_any 1
setsebool squid_use_tproxy 1

Нарушение связи по IPv6

В конечном итоге подключение IPv6 полностью нарушено для клиентов TPROXY (клиенты LAN на порте 3128 которые используют файл WPAD / PAC, имеют полностью рабочий IPv6). Хотя кажется, что трафик каким-то образом направляется в ящик Squid, запросы по IPv6 через TPROXY не появляются в access.log. Все запросы IPv6 и буквальные IPv6 и DNS, таймаут. Я могу получить доступ к внутренним клиентам IPv6, но опять же, этот трафик не регистрируется.

Я провел небольшое тестирование с помощью test-ipv6.com и обнаружил, что он обнаружил мой исходящий IPv6-адрес Squid, но тесты IPv6 показали либо плохой / медленный, либо тайм-аут. Я временно включил заголовок via и обнаружил, что HTTP-заголовок Squid был видимым, поэтому трафик, по крайней мере, попадает в окно Squid, но не маршрутизируется должным образом, когда он там.

Я пытался заставить это работать в течение некоторого времени и не могу найти, в чем проблема, я даже спросил в списке рассылки Squid, но не смог диагностировать фактическую проблему или решить ее. Основываясь на моем тестировании, я почти уверен, что это одна из следующих областей и проблема с коробкой Squid:

Будем очень признательны за любые идеи и дополнительные шаги, которые я могу предпринять для работы TPROXY и IPv6!

Дополнительная информация

правила ip6tables:

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DIVERT     tcp      ::/0                 ::/0                 socket
TPROXY     tcp      ::/0                 ::/0                 tcp dpt:80 TPROXY redirect :::3129 mark 0x1/0x1

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Chain DIVERT (1 references)
target     prot opt source               destination
MARK       all      ::/0                 ::/0                 MARK set 0x1
ACCEPT     all      ::/0                 ::/0

Таблица маршрутизации IPv6 (префикс скрыт)

unreachable ::/96 dev lo  metric 1024  error -101
unreachable ::ffff:0.0.0.0/96 dev lo  metric 1024  error -101
2001:470:xxxx:xxx::5 dev eno1  metric 0
    cache  mtu 1480
2001:470:xxxx:xxx:b451:9577:fb7d:6f2d dev eno1  metric 0
    cache
2001:470:xxxx:xxx::/64 dev eno1  proto kernel  metric 256
unreachable 2002:a00::/24 dev lo  metric 1024  error -101
unreachable 2002:7f00::/24 dev lo  metric 1024  error -101
unreachable 2002:a9fe::/32 dev lo  metric 1024  error -101
unreachable 2002:ac10::/28 dev lo  metric 1024  error -101
unreachable 2002:c0a8::/32 dev lo  metric 1024  error -101
unreachable 2002:e000::/19 dev lo  metric 1024  error -101
unreachable 3ffe:ffff::/32 dev lo  metric 1024  error -101
fe80::/64 dev eno1  proto kernel  metric 256
default via 2001:470:xxxx:xxxx::1 dev eno1  metric 1

Я понимаю, что это устарело, и у меня нет полного ответа на этот вопрос, но я делаю что-то очень похожее на вас, и у меня почти такие же симптомы.

Во-первых: test-ipv6.com, похоже, несколько недавно обновился, чтобы иметь возможность обрабатывать новый тип ошибок (он был сломан ранее в этом году). Сделайте тест еще раз.

В моем случае он отправил мне URL-адрес, который описывает проблему, с которой я столкнулся: Часто задаваемые вопросы по определению MTU пути. Они предоставляют URL-адрес, который вы можете использовать с cURL для выполнения теста PMTUD, а затем вы можете проверить свой трафик с помощью tpcdump или wirehark.

Когда трафик TPROXY передается через Squid, определение MTU пути IPv6 не полностью работает на вашем хосте. (Я все еще работаю над тем, почему он не работает мой host, поэтому окончательного решения у меня нет).

Краткое описание:

  • ICMP чрезвычайно важен в IPv6. Многие люди хотят заблокировать ICMP и в конечном итоге причиняют больше вреда, чем пользы.
  • Если пакет «слишком велик» для вашего соединения, он отбрасывается, и предполагается, что на исходный сервер будет отправлено сообщение ICMP типа 2 («Пакет слишком большой») с просьбой уменьшить размер пакета и повторно отправить.
  • Если сообщение ICMP не доходит до сервера, сервер продолжает повторно отправлять большой пакет, который немедленно отбрасывается, поскольку он слишком большой.
  • Это было описано как "черная дыра" потому что пакеты никогда не достигают места назначения.

Таким образом, вы можете убедиться, что правила вашего брандмауэра настроены на прием сообщений ICMPv6 (см. RFC4890 для списка «необходимых» типов ICMP).

В моем случае я разрешаю сообщения ICMP, но проблема не устранена. Я не совсем готов бросить полотенце и просто уменьшить MTU моей сети (что является ядерным вариантом).