В заметке рассказано как добавить исключения из правил редиректа Iptables на прозрачным Squid'е.
Exceptions of the Iptables redirect's rules on the transparent Squid.
Данное правило делает редирект с 80 порта на 3128 порт сквида:
iptables -t nat -A PREROUTING -i $LOCAL_IF -p tcp -m multiport --dport 80 -j REDIRECT --to-port 3128
Чтобы сделать исключение в правилах можно воспользоваться символом !
, но такой способ может исключить только один домен, один IP адрес или одну подсеть из правил редиректа:
iptables -t nat -A PREROUTING -i $LOCAL_IF ! -d domain.ru -p tcp -m multiport --dport 80 -j REDIRECT --to-port 3128
При попытке использовать несколько выдает предупреждение:
iptables -t nat -A PREROUTING ! -d domain.ru,domain.com -i $LOCAL_IF -p tcp -m multiport --dport 80 -j REDIRECT --to-port 3128 iptables: ! not allowed with multiple source or destination IP addresses
Очевидно, что нельзя использовать исключение !
и несколько адресов как в виде источника, так и назначения.
Если все же необходимо использовать несколько адресов, то можно добавить такие правила:
iptables -t nat -A PREROUTING -d domain.ru,domain.com -p tcp -m tcp --dport 80 -j RETURN iptables -t nat -A PREROUTING -s 192.168.0.1,192.168.0.5 -p tcp -m tcp --dport 80 -j RETURN
Первое позволяет ходить всем клиентам на домены domain.ru и domain.com в обход прокси, второе - IP адресам 192.168.0.1 и 192.168.0.5 ходить в интернет напрямую, без заруливания на проксю. Естественно, чтобы эта конструкция заработала должен быть включен NAT на указанные адреса.
В конечном итоге правила для прозрачного прокси будут выглядеть следующим образом (последовательность важна):
iptables -t nat -A PREROUTING -s 192.168.0.1 -p tcp -m tcp --dport 80 -j RETURN iptables -t nat -A PREROUTING -d domain.ru,domain.com -p tcp -m tcp --dport 80 -j RETURN iptables -t nat -A PREROUTING -i $LOCAL_IF -p tcp -m multiport --dport 80 -j REDIRECT --to-port 3128 iptables -t nat -A POSTROUTING -s $LOCAL_NET -o $INET_IF -j SNAT --to-source $INET_IP
Последнее правило включает NAT для локальной сети (подробно описывать не буду, в инете полно примеров).
По моему Это самая лучшая статья по данной теме. Я примерно месяца 2 искал решение, но нашел только тут.
iptables -t nat -A PREROUTING -s 192.168.0.1 -p tcp -m tcp —dport 80 -j RETURN
Строчка работает как часы, огромная благодарность!