У меня есть веб-сервер с несколькими приложениями нескольких пользователей. Поскольку я не уверен, что делают приложения и какой исходящий трафик http / https они создают, я хочу получить больше контроля над этим. Поэтому я решил использовать внутренний Squid, который слушает только 127.0.0.1:3128. Сначала я просто хочу посмотреть журнал доступа, вторым шагом будет черный / белый список для релевантных для безопасности URL-адресов и доменов. Эти списки должны фильтровать исходящий трафик apache и всех дочерних процессов (например: одно из приложений запускает curl как системный вызов).
Я уже добавил http_proxy в / etc / sysconfig / proxy, в / etc / environment и в .bashrc пользователя системы apache. Когда я использую оболочку, все работает нормально, apache вообще не использует прокси. Я уже перезапустил apche после изменений, но безуспешно.
Кстати, у меня на веб-сервере запущен OpenSuse 11.
Решение: (спасибо ALex_hha, извините, я думаю, я слишком быстро читал ваш ответ) Я ввел следующие iptables - rules:
iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner --uid-owner apache -j DNAT --to-destination 127.0.0.1:3128
и установите Squid в прозрачный режим:
http_port 127.0.0.1:3128 transparent
и теперь он работает очень хорошо.
Вы можете перенаправить весь исходящий http-трафик на squid. Сквид должен работать в прозрачном режиме
# iptables -t nat -I OUTPUT -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:3128
Но вы не можете определить, от какого пользователя был трафик. Но вы можете попробовать запустить squid на нескольких портах, каждый для определенного пользователя.
http_port 127.0.0.1:3128 transparent
http_port 127.0.0.1:3129 transparent
http_port 127.0.0.1:3130 transparent
А затем перенаправить исходящий трафик на определенный порт
# iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner --uid-owner apache -j DNAT --to-destination 127.0.0.1:3128
# iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner --uid-owner joe -j DNAT --to-destination 127.0.0.1:3129
# iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner --uid-owner jack -j DNAT --to-destination 127.0.0.1:3130
И используйте lp в формат журнала кальмара
logformat uniq_user %lp %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st %Ss:%Sh
У меня в лог-файле много ошибок 403. Я добавил IP-адрес сервера к звонку, но это не сработало. Я думаю, что в любом случае запрос окажется в бесконечном цикле
нужно обходить все запросы от самого сквида
# iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner --uid-owner squid -j ACCEPT
Я предположил, что ваш экземпляр кальмара работает под управлением squid: squid, который по умолчанию
Рабочий конфиг сквида
acl manager proto cache_object
acl localhost src 127.0.0.1/32 ::1
acl to_localhost dst 127.0.0.0/8 0.0.0.0/32 ::1
acl localnet src 10.0.0.0/8 # RFC1918 possible internal network
acl localnet src 172.16.0.0/12 # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl localnet src fc00::/7 # RFC 4193 local private network range
acl localnet src fe80::/10 # RFC 4291 link-local (directly plugged) machines
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl CONNECT method CONNECT
http_access allow manager localhost
http_access deny manager
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow all
http_access allow localnet
http_access allow localhost
http_access deny all
http_port localhost:3128 transparent
http_port localhost:3129 transparent
http_port localhost:3130 transparent
hierarchy_stoplist cgi-bin ?
coredump_dir /var/spool/squid
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern -i (/cgi-bin/|\?) 0 0% 0
refresh_pattern . 0 20% 4320
logformat uniq_user %lp %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st %Ss:%Sh
access_log /var/log/squid/squid-users.log uniq_user
Версия Squid и сведения о системе
# squid -v | head -1
Squid Cache: Version 3.1.10
# uname -r
2.6.32-358.14.1.el6.x86_64
# cat /etc/redhat-release
CentOS release 6.4 (Final)
Убедитесь, что первое правило в цепочке OUTPUT - "-p tcp --dport 80 -m owner --uid-owner squid -j ACCEPT"