Я повторно отредактировал исходный вопрос, потому что я изменил настройку с момента исходного ответа, который был для настройки на основе NAT. NAT больше не используется и был заменен на TPROXY для совместимости с IPv6.
Я запускаю squid в небольшой сети. Я настроил пару портов прослушивания Squid для разных сценариев.
Выдержка из squid.conf
Для настройки TPROXY я использую следующие правила iptables / ip6tables на моем маршрутизаторе DD-WRT с iproute2
для маркировки и перенаправления трафика на прокси. Проблема в том, что в этой настройке тегируется весь трафик, включая трафик IPv4 и IPv6, который идет на прокси-сервер Squid через настройку порта 3128.
Мне нужен способ исключить этот трафик, потому что он увеличивает накладные расходы и нарушает подключение (особенно IPv6) на клиентах LAN, к которым прокси-сервер применяется напрямую.
Я знаю, что могу добавить конкретных клиентов в PREROUTING
стол с ACCEPT
Правило, но сделать это как для IPv4, так и для IPv6 будет сложно быстро. Мне нужно найти общий способ исключить всех клиентов LAN, которые проходят через прокси-сервер Squid на порт 3128 на уровне маршрутизатора, но я не знаю, как это сделать лучше всего.
Текущая политика маршрутизации DD-WRT Squid:
# Squid transparent proxy
PROXY_IPV4=192.168.x.x
PROXY_IPV6=2001:470:xxxx:xx::x
CLIENTIFACE=br0
FWMARK=3
iptables -t mangle -A PREROUTING -i $CLIENTIFACE -s $PROXY_IPV4 -p tcp --dport 80 -j ACCEPT
ip6tables -t mangle -A PREROUTING -i $CLIENTIFACE -s $PROXY_IPV6 -p tcp --dport 80 -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
Добавьте правило iptables в ACCEPT
трафик на порт 80 с сервера squid. После этого правила вы можете DNAT
правила.
Как только правило соответствует правилу, цепочка больше не соблюдается, поэтому ACCEPT
закоротит DNAT
для траффика от squid.
РЕДАКТИРОВАТЬ: DNAT
правило уже исключает $PROXY_IP
поэтому добавлять дополнительное правило не нужно. Лично я предпочитаю добавить явное правило к ACCEPT
трафик от прокси, чтобы никакие дальнейшие правила не влияли на этот трафик.
Для тех клиентов, которые подчиняются правилам прокси для явного использования прокси на порту 3128, этот трафик не будет проходить через маршрутизатор, поскольку клиенты могут получить доступ к прокси напрямую; по крайней мере, я надеюсь, что прокси и клиенты находятся в одной подсети? Если по какой-то причине прокси-сервер и клиенты находятся в разных подсетях, но в одной и той же физической сети LAN, тогда маршрутизатор должен отправлять перенаправления ICMP клиенту, когда трафик, предназначенный для прокси-сервера, от клиента достигает маршрутизатора.