在没有 iptables 的情况下,如何强制 Apache 在 Localhost 上使用 http_proxy 来传输出站流量?

在没有 iptables 的情况下,如何强制 Apache 在 Localhost 上使用 http_proxy 来传输出站流量?

我有一个 Web 服务器,上面有多个应用程序和多个用户。由于我不确定这些应用程序在做什么,以及它们会产生哪些出站 http/https 流量,所以我想对其进行更多的控制。所以我的想法是使用一个内部 Squid,它只监听 127.0.0.1:3128。首先我只想查看访问日志,第二步是为安全相关的 URL 和域建立黑名单/白名单。这些列表应该过滤 apache 和所有子进程的出站流量(例如:其中一个应用程序正在运行 curl 作为系统调用)。

我已经将 http_proxy 添加到 /etc/sysconfig/proxy、/etc/environment 和 apache 系统用户的 .bashrc 中。当我使用 shell 时,一切都运行正常,apache 根本不使用代理。更改后我已经重新启动了 apche,但没有成功。

顺便说一下,我的网络服务器上运行着 OpenSuse 11。

解决方案:(感谢 ALex_hha,抱歉,我猜我读你的答案太快了)我输入了以下 iptables - 规则:

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

目前运行良好。

答案1

您可以将全部传出的 http 流量重定向到 squid。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

并在squid 日志格式

logformat uniq_user %lp %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %>Hs %<st %Ss:%Sh

我在日志文件中收到很多 403 错误。我将服务器的 IP 地址添加到 cal 中,但没有用。我认为请求无论如何都会陷入无限循环

你需要绕过 squid 本身的所有请求

# iptables -t nat -I OUTPUT -p tcp --dport 80 -m owner --uid-owner squid -j ACCEPT

我假设你的 squid 实例在 squid: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”

相关内容