Прозрачный прокси и исключения из правил редиректа

Автор: Admin | 29.07.2014
1 комментарий | 33 397 views

В заметке рассказано как добавить исключения из правил редиректа 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 для локальной сети (подробно описывать не буду, в инете полно примеров).

Комментарии к посту “Прозрачный прокси и исключения из правил редиректа

  1. Станислав

    По моему Это самая лучшая статья по данной теме. Я примерно месяца 2 искал решение, но нашел только тут.
    iptables -t nat -A PREROUTING -s 192.168.0.1 -p tcp -m tcp —dport 80 -j RETURN
    Строчка работает как часы, огромная благодарность!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *