Мне не удается заставить 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
http://www.dd-wrt.com/wiki/index.php/Squid_Transparent_Proxy
ip6tables -t mangle -A PREROUTING -i "$CLIENTIFACE" -s "$PROXY_IPV6" -p tcp --dport 80 -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
ip6tables -t filter -A FORWARD -i "$CLIENTIFACE" -o "$CLIENTIFACE" -p tcp --dport 80 -j ACCEPT
ip -f inet6 rule add fwmark $FWMARK table 2
ip -f inet6 route add default via "$PROXY_IPV6" dev "$CLIENTIFACE" table 2
Похоже, это работает нормально с точки зрения передачи трафика в окно 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 включен в окне 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 полностью нарушено для клиентов 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, поэтому окончательного решения у меня нет).
Краткое описание:
Таким образом, вы можете убедиться, что правила вашего брандмауэра настроены на прием сообщений ICMPv6 (см. RFC4890 для списка «необходимых» типов ICMP).
В моем случае я разрешаю сообщения ICMP, но проблема не устранена. Я не совсем готов бросить полотенце и просто уменьшить MTU моей сети (что является ядерным вариантом).