![在没有 iptables 的情况下,如何强制 Apache 在 Localhost 上使用 http_proxy 来传输出站流量?](https://linux22.com/image/616319/%E5%9C%A8%E6%B2%A1%E6%9C%89%20iptables%20%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%EF%BC%8C%E5%A6%82%E4%BD%95%E5%BC%BA%E5%88%B6%20Apache%20%E5%9C%A8%20Localhost%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20http_proxy%20%E6%9D%A5%E4%BC%A0%E8%BE%93%E5%87%BA%E7%AB%99%E6%B5%81%E9%87%8F%EF%BC%9F.png)
我有一个 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
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”