使用 TinyProxy 代理
tinyproxy 的部署和使用不完全指北
介绍
- Tinyproxy 是一个面向 POSIX 系统开发的轻量级的开源 HTTP/HTTPS 代理守护进程,其设计目标是快而小,从底层开始进行设计,保证了在高速的同时体积依然很小。它适用于需要完整 HTTP 代理特性,但系统资源又不足以运行大型代理的场景,比如嵌入式部署。
- Tinyproxy 对小规模网络非常有用,这样的场合下大型代理会使系统资源紧张,或有安全风险。 Tinyproxy 的一个关键特性是其缓冲连接的理念。从效果上看, Tinyproxy 对服务器的响应进行了高速缓冲,然后按照客户端能够处理的最高速度进行响应。该特性极大的降低了网络延滞带来的问题。
支持匿名模式:
- 可让您配置哪些 HTTP标头可被允许通过,哪些 HTTP标头应被阻止。 这使您既可以限制从HTTP服务器向Web浏览器发送的数据(例如Cookie),也可以限制从Web浏览器到HTTP服务器发送的数据(例如版本信息)。
支持 HTTPS:
- 可以通过 CONNECT 请求来转发 HTTPS 连接。Tinyproxy 允许进行 HTTPS 连接的转发,而且无需通过 CONNECT 方法以任何形式修改流量内容(请参阅ConnectPort 指令)。
- 使用 AddHeader 指令,您可以向传出的流量里添加或插入 HTTP 标头信息。
远程监视:
- 通过使用远程监视工具,您可以远程获知代理统计信息、日志和访问信息,从而确切了解代理的繁忙程度。
负载监视:
- 可配置成当负载达到某个程度时,拒绝新的代理请求。
访问控制:
- 可设置特定的 IP 地址或者 IP 段才可访问。
安全:
- 不需要 root 权限。
- 只需进行一些配置(比如,将 Tinyproxy 创建的文件设为由非 root 用户拥有,并让它在大于 1024 的端口上运行),就能让 Tinyproxy 在没有任何特殊权限的情况下运行,从而将系统受到破坏的风险降至最低。
- 您可以配置 Tinyproxy 来实现 访问控制,从而仅允许来自特定子网或特定接口的请求,从而确保那些随机出现的、未经授权的人不能使用您的代理。
轻量化:
- 只需要极小的系统资源。
- Tinyproxy 的体积很小,也仅需少量系统资源。在使用 glibc 时,内存占用一般大约 2 MB,而 CPU 占用会随着连接数量线性增长(具体取决于连接速度)。因此,Tinyproxy 可用在比较老旧的计算机上,或者用在基于 Linux 的路由器等网络设备上,而不会对设备性能造成明显的影响。
- 支持基于 URL 的过滤。
支持透明代理
- 使客户端无需进行任何配置即可使用代理。您也可以将其用作您网站的反向代理前端。
- 支持多级代理。
开源:
- Tinyproxy 采用 GNU GPL 协议(版本2及以上)分发。
易于构建:
- Tinyproxy 的构建和运行仅需一个最小化的 POSIX 环境。同时,它可以用其他附加库来添加额外功能。
稳定:
- 它的设计致力于防止缓冲区溢出。代码结构的简单也确保了此类bug易于定位。
高自由度:
- 如果您要构建自定义Web代理,可以轻松地修改 Tinyproxy 以满足您的自定义需求。 源码结构非常简单,遵循 KISS 原则。 因此,可以把它作为基础,来实现您可能需要Web代理执行的任何操作。
安装
直接安装
通过下面的命令在不同平台上直接安装 tinyproxy 服务
RHEL / CentOS / Fedora
yum install tinyproxy
从 EPEL 仓库中安装 Tinyproxy。
Debian / Ubuntu
apt install tinyproxy
Archlinux / manjaro
pacman -S tinyproxy
openSUSE
zypper in tinyproxy
FreeBSD,OpenBSD 或 NetBSD
可以使用 pkg_add 程序来安装
pkg install tinyproxy
Mac OS
对于 Mac OS X 用户,可以查看 MacPorts 来检查其中的 Tinyproxy 端口是否已是最新版本。
如果您觉得您操作系统中的 Tinyproxy 二进制软件包不是最新的,请联系该操作系统的软件包维护者。 如果这行不通,您也可以从源代码编译得到最新的稳定版本。
homebrew install proxy
手动安装
最新版下载链接:
https://github.com/tinyproxy/tinyproxy/releases/latest
编译安装
我们以源代码的形式分发 Tinyproxy,必须在对其编译后,才能在您的系统上使用。 请查看源代码树中的 INSTALL 文件,获取构建说明。 Tinyproxy 的最新稳定发行版本是 tinyproxy-1.8.4.tar.bz2, 它发布于2016年1月1日。Tinyproxy 1.8.4 的 NEWS 文件包含了发行说明。您可以使用其PGP签名验证tarball。 您也可以浏览 Tinyproxy 旧的发行版本。
通过
我们使用 Git 作为 Tinyproxy 源代码仓库的版本控制系统。 要获取 Tinyproxy 仓库的副本,请使用以下命令:
git clone --depth=1 git@github.com:tinyproxy/tinyproxy.git
下载最新版本代码 (当然,可能是实验性代码,建议还是从上面的链接手动下载最新版 release 代码)
如果你使用的是其它平台,更多的安装方式可直接参考官方文档:https://tinyproxy.github.io/
- 通过源码安装
如果你使用的平台,官方还不支持通过软件包安装。你也可以通过源码进行编译安装。
git clone --depth=1 https://github.com/tinyproxy/tinyproxy.git
cd tinyproxy
./autogen.sh
./configure
make
make install
配置
TinyProxy 默认配置文件路径为 /etc/tinyproxy/tinyproxy.conf。如果你要自定义配置文件位置,可以在启动 TinyProxy 时 通过 -c 参数来指定。
该页面描述配置文件的语法和内容。
Tinyproxy 配置文件包含很多键值对,每行一对。以 #
开头的行或者空白行是注释,会被忽略。关键字不区分大小写,但值内容会区分大小写。如果值内容里包含空格,可以将他们括在双引号"中。可用的关键字及其描述如下:
快速查看当前配置文件
cat /etc/tinyproxy/tinyproxy.conf | grep -v '#' | grep -v '^$'
打开配置文件
vim /etc/tinyproxy/tinyproxy.conf
下面我们来看下几个主要的配置参数:
变量 | 默认值 | 解释 |
---|---|---|
User | tinyproxy | 指定运行 TinyProxy 的用户。可以填用户名或UID。 |
Group | tinyproxy | 指定运行 TinyProxy 的用户组。可以填用户名或UID。 |
Port | 8888 | 指定 TinyProxy 的监听端口。Tinyproxy服务将侦听的端口。如果端口小于 1024,则需要以 root 用户的身份启动 Tinyproxy 进程。 |
Listen | 空 | 指定 TinyProxy 绑定的网卡接口,默认是绑定到所有可用的网卡接口的。如需绑定到指定网卡接口,只需去掉对应的注释并指定网卡对应 IP 地址即可。在默认情况下,Tinyproxy 会侦听在所有可用接口上的连接(即,侦听地址 0.0.0.0)。通过配置此参数,Tinyproxy 可以被告知仅侦听一个特定地址。 |
Allow | 127.0.0.1 | 指定可访问 TinyProxy 设备的 IP 或网段,默认仅允许本机访问。如果你想允许所有人使用该代理,注释 Allow 选项即可。如果你想增加多个可访问的网段,可以用多个 Allow 选项同时定义不同网段即可。 |
Bind | 这允许您指定 Tinyproxy 将绑定到哪个目标地址,以将其连接到Web服务器或上游代理。 | |
BindSame | 空 | 在多网卡的情况下,设置出口 IP 是否与入口 IP 相同。默认情况下是关闭的。例如:服务器上存在 IP 1.2.3.4,当你请求该 IP 对应的 Tinyproxy 代理时,也通过 1.2.3.4 做为出口访问目标网站。如果此布尔值选项被设置为 Yes,Tinyproxy 会将目标地址设定为触发了传出请求的传入连接的IP地址。 |
Timeout | 600 | Tinyproxy关闭连接之前,允许该连接处于非活动状态的最大秒数。 |
StartServers | 10 | 指定 TinyProxy 初始启动的子进程数量。一般应将其设置为位于 MinSpareServers和 MaxSpareServers 之间的值。 |
MinSpareServers, MaxSpareServers | 5, 20 | Tinyproxy 始终保留一定数量的空闲子进程,以保证它可以快速处理新传入的客户端请求。 MinSpareServer 和 MaxSpareServers 控制备用进程数的最大值和最小值。即,当备用服务器的数量降至 MinSpareServers以下时,Tinyproxy 将在后台开始创建新的备用进程,而当备用进程的数量超过 MaxSpareServers 时,Tinyproxy 将杀死多余的进程 |
MaxClients | 100 | 设置最大客户端链接数 |
MaxRequestsPerChild | 此选项限制一个子进程在终止之前将会处理的最大连接数。 默认值为0,即无限制。此选项是在出现内存泄漏问题时可采取的紧急措施。 在这种情况下,请将 MaxRequestsPerChild 设置为例如1000 或 10000,可能会有用。 | |
Upstream,No Upstream | 该选项允许您设置一组基于所访问站点主机或域的规则,来选择是否使用某些上游代理服务器。这些规则按照在配置文件中录入的顺序存储,并且在使用时 最后一条 所匹配的规则会生效。有以下三种指定上游主机的方式: upstream host:port 开启一个常规形式的上游代理 upstream host:port "site_spec" 为匹配 site_spec 的站点启用上游代理 no upstream "site_spec" 为匹配 site_spec 的站点禁用上游代理匹配可以用主机名、域名、IP范围等形式来指定: .name 匹配任何在域 name 中的主机 . 匹配任何无域名的主机(在空域名中) IP/bits 匹配IP地址/掩码位数 IP/mask 匹配IP地址/掩码 | |
Allow, Deny | Allow和Deny选项用于自定义允许哪些客户端访问Tinyproxy。 Allow和Deny行可以在配置文件里重复出现,以构建Tinyproxy的访问控制列表。在配置文件中的顺序很重要。 如果没有 Allow 或 Deny 行,则允许任意的客户端。反之,默认的操作是拒绝访问。 允许或拒绝的参数可以配置为客户端主机的单个IP地址,例如 127.0.0.1,IP地址范围,例如 192.168.0.1/24,或将与客户端主机名尾端匹配的字符串, 可以是完整的主机名,例如 host.example.com,或域名,例如.example.com,或者顶级域名,例如.com。 | |
XTinyproxy | 将此选项设置为Yes将通知Tinyproxy将包含客户端IP地址的标头X-Tinyproxy添加到请求中。 |
进阶选项
Filter | /etc/ tinyproxy/ filter | 指定设置过滤内容文件的位置 |
FilterURLs | Off/On | 设置使用 URL 或是域名方式进行过滤,默认是基于 URL 方式过滤的。域名过滤只检查域名段,URL 过滤则检查整个 URL。 |
FilterExtended | Off/On | 设置使用 POSIX 基本或者扩展的正则表达式来匹配过滤规则,默认为使用基本的 |
FilterCaseSensitive | Off/On | 设置是否使用区分大小写的正则表达式,默认为不区分大小写。 |
FilterDefaultDeny | Yes/No | 设置默认过滤策略。如果将该指令注释掉或设为 No,过滤规则为禁止访问规则。该值默认为 Yes,过滤规则为只允许访问过滤文件中的地址。过滤规则配置示例:1. 在 /etc/tinyproxy/filter 文件中添加代理允许或拒绝的域名地址。hi-linux.com过滤文件中的域名地址也是支持正则表达式的。 |
DefaultErrorFile | "/usr/share/ tinyproxy/ default.html" | 该选项控制如果发生未配置的错误时,返回的HTML模板文件。 |
ErrorFile | 该选项控制 Tinyproxy 如果遇到特定的HTTP错误时,会返回哪个HTML文件。它包含两个参数,错误号、HTML错误文件的路径。 | |
StatHost | 该选项配置被当作统计主机的主机名或者IP地址:每当收到对该主机的请求时,Tinyproxy 会返回内部统计信息页面,而不会将请求转发给该主机。此页面的模板可以使用 StatFile 配置项进行配置。StatHost 的默认值为 tinyproxy.stats。 | |
StatFile | "/usr/share/ tinyproxy/ stats.html" | 该选项配置 Tinyproxy 在收到对统计主机的请求时发送的HTML文件。如果未设置此选项,Tinyproxy 将返回一个硬编码的基本统计信息页面。有关详细信息,请参见 tinyproxy(8) 手册页中的 STATHOST 部分。需要注意的是,使用StatFile 以及 ErrorFile 和 DefaultErrorFile 选项配置的错误文件都是模板文件,其中可以包含一些模板变量,并由 Tinyproxy 在发送时进行扩展。例如,"{cause}" 表示简短的错误描述,"{detail}"表示详细的错误消息。tinyproxy(8) 手册页包含所有模板变量的描述。 |
LogLevel | Info | 设置日志级别。高于或等于该设置项级别的日志消息会被记录。例如,如果LogLevel设为 Warning,则从Warning到Critical级别的所有日志消息会被输出,但Notice或更低等级的日志消息会被过滤掉。允许的取值如下:Critical(最简洁)ErrorWarningNoticeConnect(不包含Info的连接日志)Info(最详细) |
LogFile | /var/log/ tinyproxy/ tinyproxy.log | 指定日志文件位置。该选项控制 Tinyproxy 将调试输出写入文件的位置。 此外,Tinyproxy 可以将日志输出到syslog - 请参阅 Syslog 选项。 |
Syslog | Off/On | 指定 TinyProxy 是否开启 Syslog 来记录日志注:Logfile 和 Syslog 只能同时启用一个。如果两个都不启用的话 TinyProxy 会将日志直接输出到终端的标准输出。当设为 On 时,此选项告知 Tinyproxy 将其调试消息写入syslog,而不是写入由 LogFile 所配置的日志文件。这两个选项是互斥的。 |
PidFile | /var/run/ tinyproxy/ tinyproxy.pid | 指定 Pid 文件位置, 在 PidFile 文件不存在时会运行失败。该选项控制 Tinyproxy 主进程将其进程 ID 号存入的文件路径,用于处理信号。 |
DisableViaHeader | 关闭 | 指定是否在 Header 中显示 Tinyproxy 相关信息,默认是关闭的。如果开启将不会在 Header 中显示 Tinyproxy 相关信息,相当于 Tinyproxy 是隐身模式 |
AddHeader | 配置一个或多个 HTTP 请求标头,用于添加到由 Tinyproxy 发出的 HTTP 请求中。 需要注意的是,此选项不适用于 HTTPS 流量,因为 Tinyproxy 无法控制要交换的标头。AddHeader "X-My-Header" "Powered by Tinyproxy" | |
ViaProxyName | "tinyproxy" | RFC 2616 要求代理将 Via 标头添加到 HTTP 请求中,但使用真实主机名可能会引起安全问题。 如果设置了 ViaProxyName 选项,其字符串值将用作 Via 标头中的主机名。 否则,将使用服务器的主机名。 |
DisableViaHeader | No/Yes | 该选项设置为 yes 时,Tinyproxy 不会将 Via 标头添加到请求中。 这实际上就使 Tinyproxy 进入了隐身模式。请注意,RFC 2616 要求代理设置 Via 头,因此启用此选项会破坏合规性。 除非您知道自己在做什么,否则不要禁用 Via 标头... |
Filter | Tinyproxy 支持基于 URL 或域的网站过滤。 此选项指定包含过滤规则的文件的位置,每行一条规则。 | |
FilterURLs | 如果此布尔选项设置为 Yes 或 On,则根据 URL 执行过滤,而不根据域执行过滤。默认设置为根据域进行过滤。 | |
FilterExtended | 如果此布尔选项设置为 Yes,则扩展的 POSIX 正则表达式将用来匹配过滤器规则。默认使用基本 POSIX 正则表达式。 | |
FilterCaseSensitive | 如果此布尔选项设置为 Yes,则过滤器规则匹配时会区分大小写。 默认匹配时不区分大小写。 | |
FilterDefaultDeny | 默认的过滤策略会允许所有与过滤规则不匹配的内容。 将 FilterDefaultDeny 设置为 Yes 会更改该策略,从而拒绝在过滤规则所匹配的域或URL之外的任何内容。 | |
Anonymous | 如果设置了 Anonymous 选项,则启用匿名代理。由 Anonymous 配置的标头被允许通过,其他标头会被拒绝。 如果未配置 Anonymous 选项,则允许所有标头通过。您必须给标头内容加上引号。大多数站点都需要启用 cookie 才能正常工作,因此,如果您访问这种站点,需要允许 cookie 通过。用法举例:Anonymous "Host"Anonymous "Authorization"Anonymous "Cookie" | |
ConnectPort | 443,563 | 此选项用于指定 CONNECT 方法所允许的端口。 如果找不到 ConnectPort 行,则允许所有端口。若要完全禁用 CONNECT,请仅设置一条值为 0 的 ConnectPort 选项行。 |
ReversePath | 配置一条或多条 ReversePath 选项,以启用反向代理支持。 使用反向代理,可以使许多站点看起来像是单个站点的一部分。配置以下指令,并在自己的计算机上的端口 8888上运行 Tinyproxy,则可以通过 http://localhost:8888/example/来访问站点 example.com。ReversePath "/example/" "http://www.example.com/" | |
ReverseOnly | 当把 Tinyproxy 用作反向代理时,强烈建议将此布尔选项设置为 Yes ,从而关闭普通代理功能。 | |
ReverseMagic | 将此选项设置为Yes,可让 Tinyproxy 使用 cookie 来跟踪反向代理的映射。 如果您需要反向具有绝对链接的代理站点,必须启用此选项。 | |
ReverseBaseURL | 用于访问此反向代理的URL地址。 该 URL 会被用于重写 HTTP 重定向地址,以使它们不会绕过代理。 如果您有一连串的反向代理,则需要在此处放置最外层的 URL(也就是终端用户在其浏览器中键入的地址)。如果未设置此选项,则不会修改重定向。 |
运行和测试
- 运行 TinyProxy 非常简单,使用官方提供的脚本即可。
# 启动 TinyProxy
service tinyproxy start
# 停止 TinyProxy
service tinyproxy stop
# 重启 TinyProxy
service tinyproxy restart
如果服务器有启用防火墙,记得开放相应的 TinyProxy 端口
iptables -I INPUT -p tcp –dport 8888 -j ACCEPT
- 测试代理是否正常工作
使用curl
命令测试代理服务器是否生效
curl url --proxy <代理服务器域名或 IP>:<监听端口>
如果是https代理加 -k 参数
curl url --proxy <代理服务器域名或 IP>:<监听端口> -k
例如
curl url --proxy 8.8.8.8:8888
或使用 telnet 命令
telent <代理服务器域名或 IP> 8888
- 查看 TinyProxy 请求日志
tail -f /var/log/tinyproxy/tinyproxy.log
FAQ
time out(超时)可能是因为服务器的防火墙没有打开这个端口
Ubuntu 防火墙操作看[这篇]()
连接上了但是被 reject(拒绝)了可能是因为 tinyproxy 没有允许你正在使用的这台电脑或是服务器的 ip
firewall-cmd --add-port=8888/tcp --permanent
firewall-cmd --reload
uwp
iptables
支持
您可以随时通过 github issues 来报告新 bug,或提出功能建议。
Tinyproxy 的开发者们也会浏览在 irc.freenode.net 上的 #tinyproxy
标签。
实践
[如何连接代理服务器]()
qqbot 代理文件服务下载
代理访问掩藏真实 ip
参考
https://tinyproxy.github.io/
https://github.com/tinyproxy/tinyproxy
https://www.cnblogs.com/daoyi/p/bu-shutinyproxy-tou-ming-dai-li-fu-wu.html
https://blog.csdn.net/testcs_dn/article/details/89335426
https://java-er.com/blog/tinyproxy-install/
https://www.cnblogs.com/masako/p/11459496.html
https://cloud.tencent.com/developer/article/1475747
https://www.jianshu.com/p/cfef3e491b52
https://www.jianshu.com/p/0f8ac701748d
https://www.cnblogs.com/masako/p/11459496.html
https://zhuanlan.zhihu.com/p/72903589