В новой центоси обновили некоторые пакеты, в том числе squid, и теперь он может перестать работать со старым конфигом iptables. Здесь необходимо пояснение: у меня шлюз и прокси-сервер находятся на разных машинах, а NAT должен осуществляться строго на машине со сквидом. Конечно, можно попробовать гнать трафик через два сквида, но я так не пробовал делать и считаю, что это вариант для тех, кто знает толк в извращениях.
На шлюзе пока что Centos 6.5, но это не имеет значения, а на прокси — уже 7.0, и это таки важно. Прокси ходит в инет не через шлюз, а вообще по другому маршруту, так что следующие конфиги могут заработать не у всех.
На шлюзе надо маркировать http трафик:
iptables -t mangle -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j MARK --set-xmark 1
добавить таблицу для прокси:
echo "2 proxy" >> /etc/iproute2/rt_tables
посредством iproute2 добавить правило и маршрут для маркированного трафика:
ip rule add fwmark 1 table proxy
ip route add default via 192.168.1.1 dev eth0 table proxy
Чтобы не прописывать правило и маршрут после каждого перезапуска, можно добавить их в специально обученные файлы:
echo "fwmark 1 table proxy" > /etc/sysconfig/network-scripts/rule-eth0
echo "default via 192.168.1.1 dev eth0 table proxy" > /etc/sysconfig/network-scripts/route-eth0
На прокси-сервере тоже надо кое-что сделать, например редирект с 80 порта на 3128 и отправку трафика далее:
iptables -t nat -A PREROUTING -s 192.168.1.1 -p tcp -m tcp --dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
порт 3128 больше не нужен:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 3128 -j DROP
а 3129 порт пригодится для https в ручном режиме — по очевидным причинам это непрозрачно и настраивается со стороны пользователя. В конфиге squid’а должно быть такое:
http_port 3128 intercept
http_port 3129
У пользователя https via proxy можно настроить посредством FoxyProxy в браузере.
Условные обозначения:
eth0
— сетевой интерфейс шлюза, смотрящий в локальную сеть;
--set-xmark 1
— можно использовать любое число для маркировки разнообразного трафика;
2 proxy
— можно использовать любое число, главное чтобы оно было уникальным в /etc/iproute2/rt_tables
, слово “proxy” тоже можно заменить по аналогичному принципу;
192.168.1.1
— ip-адрес прокси-сервера, через него гоним исходящий http-трафик.
eth1
— сетевой интерфейс прокси-сервера, смотрящий в интернет;
Ссылки по теме:
http://tldp.org/HOWTO/Adv-Routing-HOWTO/lartc.netfilter.html
http://www.reddit.com/r/linux/comments/1dv2×2/on_mitigating_the_great_squid_31x_33x_upheaval/
http://www.faqs.org/docs/Linux-mini/TransparentProxy.html
http://grokbase.com/t/centos/centos/099bmc07mq/persisting-iproute2-routes-and-rules
P. S.: если у вас firewalld
, то проще всего начать с его удаления и установки iptables-services
.