Squid+iptables: как разрешить https проходить через Squid?

В основном сегодня начал со Squid и iptables (гугл вам в помощь). Этот материал станет моей смертью.

У меня установлен Squid3 на сервере Ubuntu 9.04 в качестве прозрачного прокси. Это прекрасно работает, когда я использую прокси-бокс в качестве шлюза по умолчанию и т. д. Правила iptable для этой настройки были частью руководства. :П

К сожалению, я не могу получить доступ к https-сайтам (таким как Gmail или что-то еще на порту 443 в основном). Это связано с тем, что Squid не любит то, что он не может кэшировать, в данном случае трафик https.

Я хотел бы добавить правило iptable, чтобы я мог в основном получать доступ к сайтам https и использовать Skype. По сути, разрешать этим типам трафика проходить без прохождения через прокси-сервер Squid? (в обход так сказать)

Кто-нибудь, возможно, знает, как это сделать, или имеет ссылку на какие-либо источники, которые помогут мне в этом разобраться?

Спасибо.


person David 'the bald ginger'    schedule 08.04.2010    source источник


Ответы (3)


После того, как я задумался о том, чтобы пережевывать собственные запястья и мечтать об IP-адресах всю ночь напролет + грубая сила, гугля / пробуя ВСЕ, что я мог получить своими цифровыми пальцами, мне удалось собрать что-то, что действительно работает. Я не знаю технических причин, поэтому, если вы можете предоставить комплексные объяснения, пожалуйста, сделайте это! :D

PS: все в объяснении делается через командную строку

PS: это не окончательное решение, но это рабочий ответ на мой собственный вопрос.

Вот:

Шаг 1. Необходимо включить переадресацию IP-адресов на устройстве:

vim /etc/sysctl.conf

// находим и раскомментируем следующее

net.ipv4.ip_forward=1
net.ipv4.conf.all.rp_filter=1

Шаг 2. Добавьте правило замыкания на себя (это больше подходит для случая, когда все порты перекрыты, очевидно, оно нужно многим приложениям?

iptables -I INPUT -i lo -j ACCEPT

Шаг 3. Добавьте правила для обхода порта 443: (eth1 — интернет-интерфейс, x.x.x.x/eth0 — локальный интерфейс)

iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -t filter -A FORWARD -i eth0 -p tcp --dport 443 -j ACCEPT

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source x.x.x.x

Шаг 4. Затем, наконец, правила, делающие Squid прозрачным: (x.x.x.x — это IP-адрес LAN-интерфейса)

iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination x.x.x.x:3128

iptables -t nat -A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
person David 'the bald ginger'    schedule 09.04.2010
comment
net.ipv4.conf_all.rp_filter зовут net.ipv4.conf.all.rp_filter, верно? - person Karl Richter; 09.06.2015

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source x.x.x.x

Это не правильно. Это означает, что каждый пакет TCP/UDP/etc, который вы отправляете из своей внутренней локальной сети в Интернет, будет использовать в качестве ИСТОЧНИКА IP-адрес частной локальной сети (вероятно, 192.178.x.x) вместо общедоступного IP-адреса.

Может быть, это поможет вам:

PREROUTING == DestinationNAT -> From Internet to Intern LAN

POSTROUTING == SourceNAT -> From Intern LAN to Internet


iptables -t nat -A PREROUTING -i intern -p tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -A INPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -i intern -p tcp --dport 3128 
iptables -A OUTPUT -j ACCEPT -m state --state NEW,ESTABLISHED,RELATED -o extern -p tcp --dport 80
iptables -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED -i extern -p tcp --sport 80
iptables -A OUTPUT -j ACCEPT -m --state ESTABLISHED,RELATED -o intern -p tcp --sport 80

Для обхода 443 будет достаточно:

iptables -I FORWARD -p tcp --dport 443 -j ACCEPT

И если ваш system/squid/firewall также является маршрутизатором из вашей сети в интернет, не забудьте:

iptables -t nat -A POSTROUTING -o extern -j SNAT --to-source Public_external_IP
person dgabad    schedule 27.09.2011
comment
Спасибо за ответ. Я больше не работаю над этим, но я отправил ваш ответ в ИТ-отдел. который взял под свой контроль работу, которую я делал. - person David 'the bald ginger'; 14.11.2011

За эти объяснения...

шаг № 1 настраивает машину в качестве маршрутизатора. Это требуется для любой машины Linux, которая будет принимать или пересылать IP-трафик, предназначенный для машин, отличных от нее самой. Без этого самые нижние уровни сетевого стека будут отклонять трафик, и NAT даже не получит шанса сделать свое дело.

шаг № 2 не имеет отношения к проблеме, о которой спрашивают. Это может понадобиться или не понадобиться для операций маршрутизатора, не связанных с проксированием.

шаг № 3 позволяет машине ретранслировать порт 443 в обычном режиме в качестве маршрутизатора. Правило POSTROUTING можно улучшить, используя MASQUERADE вместо SNAT.

шаг #4 обе строки делают одно и то же по-разному. Первая строка может привести к проблемам в будущем, если вы не знаете, в чем разница между DNAT и REDIRECT. Для простоты используйте только REDIRECT.

Чтение http://wiki.squid-cache.org/ConfigExamples/Intercept/LinuxRedirect мог бы избавить вас от многих проблем.

В вашей настройке также отсутствует критическое правило таблицы mangle, которое объясняется на этой вики-странице.

person Amos Jeffries    schedule 27.09.2016
comment
Вопрос был задан 6 лет назад. :) Спасибо за ваш ответ, но, возможно, это был комментарий к отмеченному ответу, а не сам ответ? - person David 'the bald ginger'; 28.09.2016
comment
Это было. У меня не было прав на комментирование при его предоставлении, поэтому мне пришлось написать полный ответ. - person Amos Jeffries; 13.10.2016