Alexander Sheiko Blog

Установка Squid в режиме tproxy на FreeBSD 9

Категория: Компьютерное
Отправлено: 25.12.2012 04:15

https://adsh.org.ua/blog/upload/squid.jpg

Понадобилось мне запустить Squid под FreeBSD в полностью прозрачном режиме. Таком, когда запрос прокси сервера в мир выполняются от адреса клиента. Другими словами - производится спуфинг адреса, с которого прокси выполняет запросы к сайтам. При правильной настройке (вырубить Via и X-Forwarded-For) наличие прокси можно определить лишь случайно, если он отвалится или выдаст страницу ошибки.

Под линуксом такое решение известно давно. Попытка, с ходу, найти рабочее решение для текущей версии FreeBSD, зашла в тупик. Удалось найти лишь статью, посвящённую довольно старым версиям FreeBSD.

Как известно, во FreeBSD мы не можем спуфить адреса, запуская программу не из под пользователя root. С другой стороны - Squid ругается при запуске из под пользователя root:

if (geteuid() == 0) {
debug(0, 0) ("Squid is not safe to run as root! If you must\n");
debug(0, 0) ("start Squid as root, then you must configure\n");
debug(0, 0) ("it to run as a non-priveledged user with the\n");
debug(0, 0) ("'cache_effective_user' option in the config file.\n");
fatal("Don't run Squid as root, set 'cache_effective_user'!");
}


Что вполне разумно, ибо такая ситуация является дырой в безопасности и потенциальная бомбой - проглючивший прокси способен снести всю систему. Некоторые авторы предлагают решить эту проблему "через задний проход" - убрать проверку uid root, чтобы можно было заставить работать Squid в режиме tproxy =/.

Нужно было решить две задачи:

  • заставить Squid использовать в запросах адрес клиента
  • сделать так, чтобы squid работал не от пользователя root


Первая задача решается просто - в портах есть форк Squid - Lusca Head:

/usr/ports/www/lusca-head


Lusca is a continuation of Squid-2 development which focuses on stability
whilst improving performance, functionality and compliance.

Lusca supports all of the features found in Squid-2. This release
currently doesn't support ICAP as it was never intergrated into the Squid-2
release.

Lusca is a drop-in compatible replacement for the Squid-2 and Cacheboy packages.
The "squid" configuration parameters, directories and rc script setup is
mirrored from the Squid packages to facilitate this.

WWW: http://www.lusca.net/
WWW: http://code.google.com/p/lusca-cache/


Пожалуй - это единственный на данный момент порт, поддерживающий работу в режиме tproxy "из коробки". При сборке не забудьте отметить соответствующую опцию.

Вторая задача не имела решения "в лоб". В конце концов, на одном из бразильских ресурсов был найден патч, подходящий к нашим условиям (блог на португальском языке, посвящён *BSD, для чтения можно использовать Google Translate). Патч даёт возможность спуфить адреса, имея права непривилегированного пользователя, что позволяет запустить из под него же прокси. Первоисточником такого решения является вот этот пост. После некоторых экспериментов и доработки напильником было получено рабочее решение:

1. Скачиваем патч, помещаем его в /usr/src, патчим сорцы и пересобираем ядро.

Добавлено 05.10.2013: в версии FreeBSD 9.2 немного поменялась структура каталогов сорцов ядра - для неё следует использовать обновлённый патч.

Устанавливаем новое ядро и перегружаемся.

2. Устанавливаем Lusca Head. В squid.conf указываем:

http_port 127.0.0.1:3128 transparent tproxy


Заворачиваем нужный трафик на прокси при помощи ipfw:

ipfw add fwd 127.0.0.1,3128 tcp from 192.168.0.0/24 to not me 80 in via em0


Заворачиваем на прокси ответные пакеты:
ipfw add fwd 127.0.0.1 tcp from any 80 to 192.168.0.0/24 in via fxp0


В данном случае - em0 смотрит в сеть с клиентами, fxp0 - в интернет.

Описанное решение будет работать и в режиме моста, возможные нюансы описаны здесь. Как по мне - лучше просто использовать редирект в конфиге Rejik на веб сайт, находящийся прямо на машине с прокси:

url 302:http://www-on-proxy-host/ban.html


И не заморачиваться с роутом трафика на / с прокси для веб сайта со страницами редиректов.

Добавлено 18.05.2015: lusca-head из портов удалён. Современная версия Squid 3.5.3 поддерживает режим tproxy прямо из коробки. Нужно только при установке выбрать используемый пакетный фильтр:

[ ] TP_IPF          Transparent proxying with IPFilter
[x] TP_IPFW Transparent proxying with IPFW
[ ] TP_PF Transparent proxying with PF


В squid.conf пишем:

http_port 127.0.0.1:3128
http_port 127.0.0.1:3129 tproxy


Проксируемый трафик заворачиваем на порт 3129.

Не забывайте пропатчить ядро ОС как указано выше.
Постоянная ссылка Комментарии (2)
adsh @ adsh.org.ua
16.11.2017 14:35
На версии 11.1 нужно пробовать, возможно нужно будет руками поправить нужные файлы из-за несоответствия нумерации строк.

Патч патчит ядро и ipfw (см. исходник), для pf нужно своё решение, если он, конечно, блокирует спуфинг.
16.11.2017 07:18
Подскажите, а как этот патч поведет себе в последней версии фряхи (11.1) ? и можно ли использовать PF вместо IPFW?
Powered by sBLOG XHTML 1.0 Strict PHP CSS
Локальное время: 21.06.2024 10:06 GMT+2
© 2005-2024 Alexander Sheiko