Назад | Перейти на главную страницу

как заставить Apache использовать http_proxy на Localhost для исходящего трафика без iptables?

У меня есть веб-сервер с несколькими приложениями нескольких пользователей. Поскольку я не уверен, что делают приложения и какой исходящий трафик 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"