这是代理的确定用例。普通代理,而不是反向代理(又称负载均衡器)。
最著名,免费和开源的是squid。幸运的是,它是少数几个可以轻松安装apt-get install squid3
为一个单一文件并配置为一个文件的优秀开源软件之一/etc/squid3/squid.conf
。
我们将介绍一些好的实践和经验教训。
官方配置文件略有修改(删除了5000条无用的注释行)。
# WELCOME TO SQUID 3.4.8
# ----------------------------
#
# This is the documentation for the Squid configuration file.
# This documentation can also be found online at:
# http://www.squid-cache.org/Doc/config/
#
# You may wish to look at the Squid home page and wiki for the
# FAQ and other documentation:
# http://www.squid-cache.org/
# http://wiki.squid-cache.org/SquidFaq
# http://wiki.squid-cache.org/ConfigExamples
#
###########################################################
# ACL
###########################################################
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 1025-65535 # unregistered ports
acl CONNECT method CONNECT
#####################################################
# Recommended minimum Access Permission configuration
#####################################################
# Deny requests to certain unsafe ports
http_access deny !Safe_ports
# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports
# Only allow cachemgr access from localhost
http_access allow localhost manager
http_access deny manager
#####################################################
# ACL
#####################################################
# access is limited to our subnets
acl mycompany_net src 10.0.0.0/8
# access is limited to whitelisted domains
# ".example.com" includes all subdomains of example.com
acl repo_domain dstdomain .keyserver.ubuntu.com
acl repo_domain dstdomain .debian.org
acl repo_domain dstdomain .python.org
# clients come from a known subnet AND go to a known domain
http_access allow repo_domain mycompany_net
# And finally deny all other access to this proxy
http_access deny all
#####################################################
# Other
#####################################################
# default proxy port is 3128
http_port 0.0.0.0:3128
# don't forward internal private IP addresses
forwarded_for off
# disable ALL caching
# bandwidth is cheap. debugging cache related bugs is expensive.
cache deny all
# logs
# Note: not sure if squid configures logrotate or not
access_log daemon:/var/log/squid3/access.log squid
access_log syslog:squid.INFO squid
# leave coredumps in the first cache dir
coredump_dir /var/spool/squid3
# force immediaty expiry of items in the cache.
# caching is disabled. This setting is set as an additional precaution.
refresh_pattern . 0 0% 0
客户端配置-环境变量
在所有系统上配置这两个环境变量。
http_proxy=squid.internal.mycompany.com:3128
https_proxy=squid.internal.mycompany.com:3128
大多数http客户端库(libcurl,httpclient等)都是使用环境变量自行配置的。大多数应用程序都使用一种常见的库,因此支持开箱即用的代理(开发人员不必知道它们确实在这样做)。
注意语法是严格的:
http_proxy
在大多数Linux上,变量名必须小写。
- 变量值不得开头
http(s)://
(代理协议不是http(s))。
客户端配置-特定
一些应用程序在设置变量之前会忽略环境变量和/或将其作为服务运行(例如debian apt
)。
这些应用程序将需要特殊的配置(例如/etc/apt.conf
)。
HTTPS代理-连接
设计完全支持HTTPS代理。它使用一种特殊的“ CONNECT”方法,该方法在浏览器和代理之间建立某种隧道。
邓诺(Dunno)对此事有很多看法,但多年来我从未对此有任何疑问。它只是工作。
HTTPS特例-透明代理
关于透明代理的说明。(即,代理是隐藏的,它会拦截客户端的请求。中间人)。
透明代理正在破坏HTTPS。客户端不知道有代理,也没有理由使用特殊的Connect方法。
客户端尝试直接HTTPS连接...被拦截。检测到拦截并在整个地方引发错误。(HTTPS旨在检测中间人攻击)。
域和CDN白名单
squid完全支持域和子域白名单。但是,它一定会不时以意外的方式失败。
现代网站可以具有各种域重定向和CDN。当人们不花大力气将所有内容整齐地放在一个域中时,这将破坏ACL。
有时会有一个安装程序或软件包想要在运行前调用该家庭作业或检索外部依赖项。它每次都会失败,您对此无能为力。
快取
提供的配置文件将禁用所有形式的缓存。安全胜过遗憾。
就我个人而言,此刻我正在云中运行事物,所有实例均具有至少100 Mbps的连接性,并且提供商为自动发现的流行内容(例如Debian)运行自己的存储库。这使得带宽成为我所不关心的商品。
我宁愿完全禁用缓存,也不愿遇到一个单个的缓存错误,该错误会使我的大脑在故障排除中融为一体。互联网上的每个人都无法正确获取其缓存标题。
但是,并非所有环境都有相同的要求。您可能需要付出更多努力并配置缓存。
从来不需要在代理上进行身份验证
有一个选项要求客户端(通常使用其LDAP帐户)进行密码身份验证。它将破坏Universe中的所有浏览器和所有命令行工具。
如果要在代理上进行身份验证,请不要。
如果管理人员需要身份验证,请说明这是不可能的。
如果您是一名开发人员,而您刚刚加入了一家阻止直接互联网并强制进行代理身份验证的公司,则可以逃之WAY。
结论
我们经历了常见的配置,常见的错误以及关于代理必须知道的事情。
学习到教训了:
- 有一个很好的开源软件用于代理(鱿鱼)
- 配置简单容易(一个短文件)
- 所有(可选)安全措施都需要权衡
- 最高级的选项会破坏内容并再次困扰您
- 透明代理正在破坏HTTPS
- 代理身份验证是邪恶的
与编程和系统设计一样,管理需求和期望至关重要。
在设置代理服务器时,我建议您坚持基本操作。一般来说,没有任何特殊过滤的纯代理将很好地工作,并且不会带来任何麻烦。只是要记住(自动)配置客户端。