这就是典型的代理服务器了,客户端请求发送给代理器,由代理服务器进行转发,然后将响应的内容发送给客户端。可以用于代理服务器的软件有不少,squid 和 goproxy 都可以,它们都是开源软件,也是今天要提到的,它们使用起来都非常简单。
本次服务器操作系统为 CentOS7。
squid
squid 是一个 http 代理服务器,它还可以做静态资源的缓存,这里就简单介绍它的代理功能。它可以代理 http 协议,但是 tcp/udp 的就不知道行不行了。不过没关系,而且这里只是对它略作介绍,毕竟它不是今天的重点。闲话不多说,首先安装:
yum install -y squid
启动并设置开机自启:# CentOS6
/etc/init.d/squid start
chkconfig squid on
# CentOS7
systemctl start squid
systemctl enable squid
关闭防火墙和 selinux:# CentOS6
/etc/init.d/iptables stop
setenforce 0
# CentOS7
systemctl stop firewalld
setenforce 0
默认监听端口为 3128,确保未被其他进程所监听。OK,服务端就配置好了,现在客户端就可以通过它来上网了。客户端要怎么配置呢?非常简单,Linux 上只需要配置 http_proxy
这个环境变量即可。你先登录一台需要上网的 Linux 服务器(确保它可以连接 squid 所在服务器),执行如下命令(将
SERVER_IP
替换成 squid 所在服务器 ip):export http_proxy=SERVER_IP:3128
export https_proxy=SERVER_IP:3128
配置两个环境变量,一个是 http 协议,一个是 https 协议,表示在当前 shell 环境下面启动的所有服务、命令等发送的 http/https 请求都转发给代理服务器,由代理服务器帮忙请求。然后就可以测试了:curl www.qq.com
会返回 302,表示连接成功。squid 配置文件为
/etc/squid/squid.conf
,从中可以看到这样的内容: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
http_access allow localnet
从中可以看出,三个基本的内网网段都可以通过代理上网。如果有其他需求,可以自行修改,改完后记得重启 squid 服务。OK,关于 squid 的内容就这么多了,它毕竟不是专门做代理上网的软件,只是它安装方便、使用简单、知名度广、资格够老所以就顺便提提,重点还是 goproxy。goproxy
goproxy 是国内作者开发的开源的、专业的代理软件。作者的简介是:golang 实现的高性能 http、https、websocket、tcp、防污染 DNS、socks5 代理服务器,支持内网穿透、链式代理、通讯加密、智能 HTTP/SOCKS5 代理、域名黑白名单、跨平台、KCP 协议支持、集成外部 API。单从代理这块,它可以实现了 squid 做不到的功能有:
- 全平台:windows/macos/linux 都一网打尽;
- 限速:这个功能虽然不起眼,但是非常有用,尤其针对大量请求比如镜像站同步时非常有用,你不能因为你搞同步就把带宽打满了吧,那你公司还开不开了?
- tcp 代理:光是 http 代理并不能满足需求,比如邮件/smtp、ftp 等都不是 http;
- udp 代理:这就更不用说了,dns、ntp 走的都是 udp,没它不行。tcp+udp 基本上就满足了所有应用的代理需求了;
- 多级代理:这个看起来好像也用不着,但是你想要生产环境实现科学上网就得靠它。
- https:这个并不是代理 https 协议啊,而是这个代理到另一个代理服务器之间的通信内容都是通过 ssl 加密的。一般用不上,使用它和多级代理可以实现生产环境科学上网。
安装
它的安装非常简单,因为是 go 语言写的,它只依赖 glibc 而不限 Linux 发行版。所以只要 glibc 版本够了,任何 Linux 发行版使用的二进制文件都一样,当然 windows 和 macos 由于操作系统不一样,版本肯定也是不一样的。这里只针对 Linux,如果有想法也可以在其他操作系统上运行,用法都一样。作者提供了一键安装的脚本,但是需要你服务器可以科学上网才行,如果可以你可以直接使用:
curl -L https://raw.githubusercontent.com/snail007/goproxy/master/install_auto.sh | bash
复制代码
不行的话,你就只能手动下载安装了。首先来到项目主页,点击 release,选择最上面也就是最新版本,点击 linux-amd64
进行下载。注意是 amd 而不是 arm,它们的 CPU 架构不同,一般服务器都是 x86 也是 amd 架构,其他 Linux 架构不用管。如果 32 位系统选择 32 位即可。如果是 MacOS 选择 darwin,windows 就选 windows,这些就不多提了。下载完成后随便放在哪个目录,并在当前目录下执行下面的命令即可:
tar zxvf proxy-linux-amd64.tar.gz
cp proxy /usr/bin/
chmod +x /usr/bin/proxy
if [ ! -e /etc/proxy ]; then
mkdir /etc/proxy
cp blocked /etc/proxy
cp direct /etc/proxy
fi
if [ ! -e /etc/proxy/proxy.crt ]; then
cd /etc/proxy/
proxy keygen -C proxy >/dev/null 2>&1
fi
rm -rf /tmp/proxy
echo "install done"
不排除这个脚本不再适用于以后的版本,一切还是以官方文档为准,反正都有中文,看着也不费事。安装完成后 proxy 命令就可以使用了(确保系统上之前没有这个命令),代理服务就通过这个命令启动,输入 proxy help
就能看出这个命令的帮助信息了。启动
官方文档说的还比较详细,我们就拿 http 代理举例,相信看完之后,tcp/udp 等代理你也会了。首先启动 http 代理服务:
/usr/bin/proxy http -t tcp -p :2121
这就启动服务,并且监听在 tcp 2121 端口了,服务端也就完成了。客户端的使用方式和 squid 一样,只不过要将 3128 端口换成这里的 2121。限速
到这里代理服务器的就已经完成,下面提到的都是一些扩展的内容了。限速非常简单,使用-l
选项指定即可,比如 100K 2M 等,0 意味着无限制。作者举例使用了 1.5M,大家不要这么加 .
,使用 1M 或者 2M 代替,不然会报错。/usr/bin/proxy http -t tcp -p :2121 -l 2M
表示将速度限制在 2MB/s,可以使用 dstat 命令进行验证。认证
goproxy 启动之后,默认什么人都可以使用它进行代理,如果你觉得不安全,可以使用 basic 认证。虽然 basic 认证不安全,抓包之后 base64 解码下就能拿到用户名密码,但是聊胜无于。使用方式为通过-a
指定用户名和密码,文档在这里。当然这种方式只能针对 http 代理,因为只有 http 协议才支持 basic 认证。
service 文件
上面的启动方式服务会运行在前台,虽然可以使用&
可以将之放入后台,但是我们完全可以使用 systemd 对其进行管理。CentOS7 使用 systemd 代替了 init,因此我们可以使用 systemd 来管理 proxy 的启动和停止。首先创建 service 文件:
# vim /etc/systemd/system/proxy.service
[Unit]
After=network.target
[Service]
ExecStart=/usr/bin/proxy http -t tcp -p :2121 -l 2M
[Install]
WantedBy=multi-user.target
然后启动:systemctl daemon-reload
systemctl start proxy
systemctl enable proxy
systemd 会自动将服务置于后台运行,proxy 输出的日志可以这个查看:journalctl -u proxy
journalctl 命令还有很多用法,这里就不多提了。goproxy 的用法就这么多了,至于科学上网这里就不多提了,反正很简单,只需要注意两个代理服务器之间要使用 ssl 加密。
Linux 客户端使用
服务器搭建完成之后,那就要在客户端使用起来了。前面讲到了使用 http_proxy/https_proxy 进行代理上网的方式,这也是最常用的方式,不过它也有些注意事项。我们使用 ssh 登录到服务器之后,就相当于开启了一个 shell,我们在当前 shell 下设置的环境变量
export http_proxy=SERVER_IP:3128
只对当前 shell 有效,在其他 shell 下是没有效果的。因此当你要启动一个要进行 http 代理的服务之前,可以先使用 echo $http_proxy
查看环境变量是否设置,只有设置了服务才能加载到。不建议将其写入到
/etc/profile
/etc/bashrc
等这样的文件让其永远生效,因为难保服务器上还会跑其他应用,而这个应用不需要走代理。真遇到这样的情况,排查起来也蛮费劲的。最好的解决办法是使用一个脚本来封装服务的启动命令,将环境变量配置到脚本中,这样就不会产生干扰。
与 http_proxy 对应的是
no_proxy
,我们虽然可以使用不同的 shell 来区别哪些应用使用代理,哪些不使用。但是难免会有这么一个需求:一个应用会发出多个 http 请求,其中有一个不能使用代理,其他请求要使用代理。面对这样的情况,只能使用 no_proxy 这个环境变量了,它用来排除不使用代理请求的 ip。它的是一个一堆用逗号分隔的 ip 列表,不能使用网段,不能使用域名。比如我们访问 10.0.0.1 和 10.2.2.2 不使用代理,就可以这么做:
export no_proxy="10.0.0.1,10.2.2.2"
有些应用启动时不会加载 http_proxy
这样的环境变量(比如 jenkins、Maven),即使你配置了也没用。面对这样的情况不要慌,服务本身是会提供配置代理的方式的。比如 jenkins 会在插件管理中提供,Maven 会通过配置文件提供。还有一点需要注意的是,使用 systemd 启动的服务同样不会加载系统环境变量,它本身和 shell 就没啥关系。这时你就可以在 service 文件中进行配置。
[Service]
Environment="https_proxy=SERVER_IP:2121"
在 Service 下面这么配置就行。windows 客户端
windows 上的软件基本上都可以配置代理,设置里面找找 http 代理就可以,输入 ip 和端口、用户名和密码(如何设置了的话)。如果你想设置全局代理,也就是系统级别的话,在 win10 上是在网络 -> 网络和 Internet -> 代理 -> 手动设置代理。和 Linux 一样,有些软件可能不吃这一套,你还得去软件中设置。个人用户在 windows 上使用还是科学上网居多。
frm:https://juejin.im/post/5c29ca215188252d1d34df55
gorpxoy-heroku
Heroku 是一个支持多种编程语言的云平台即服务,gorpxoy-heroku 则是可部署在 Heroku 平台的 gorpxoy 服务。gorpxoy-heroku 使用的 WebSocket 代替原本的 sockets 作为底层传输。
下面的部署方法,前提是你已经拥有一个heroku账号。
1.注册 Heroku 帐号
Heroku 提供免费账号,部分介绍如下:
512 MB RAM per dyno
Free apps sleep automatically after 30 mins of inactivity to conserve your dyno hours
Free apps wake automatically when a web request is received
https://devcenter.heroku.com/articles/limits
https://devcenter.heroku.com/articles/free-dyno-hours#usage
注册地址:https://signup.heroku.com/ (注册和部署过程可能需要梯子)
部署方法一(简单)
本方法为快速部署。
一、在heroku上的部署
1、登陆https://dashboard.heroku.com/login
2、登陆好后,点击
3、执行以下三个步骤,见下图:
(1)输入App name.例如test1-goproxy
(2)Choose a region:选择一个.例如United States
(3)点击:Deploy app
4、执行完成以后,这是就完成了部署。
二、在客户端上执行
独立goproxy客户端:
proxy.exe http -t tcp -p :6600 -T wss -P test1-goproxy.herokuapp.com:443 --parent-ws-password pass -q 8.8.8.8:53 --timeout 30000
在浏览器上设置代理:127.0.0.1:6600 http
安卓客户端:
安卓 goproxy-ss-plugin 插件配置可以写:
主机:test1-goproxy.herokuapp.com
端口:443
加密方法:aes-256-cfb
密码:123
插件参数:
-S http -j 123 -h aes-256-cfb -T wss -P test1-goproxy.herokuapp.com:443 --parent-ws-password pass --timeout 30000
注意:本次部署中需要调整的就是test1-goproxy
改为你自己的名称。
部署方法二
该方法相对方法一步骤多一些,但是可以自己设置加密密码,修改启动参数。
本方法是fork项目后,可以修改相关的参数,再在heroku上部署。
一、在github上fork该项目并修改相关参数
(1)fork项目:https://github.com/snail007/goproxy-heroku
(2)修改配置参数,具体就是修改bootstrap里的内容,点击该文件
修改第7行内容,详细参考:https://snail007.github.io/goproxy/posts/http_cdn_ws/
二、在heroku上部署
1、登陆https://dashboard.heroku.com/apps
2、选择New -> Create new app
3、执行以下三个步骤,见下图:
(1)输入App name.例如test2-goproxy
(2)Choose a region:选择一个.例如United States
(3)点击:Create app
选择Deploy->GitHub Connect to github
4、连接到自己的github,搜索goproxy-heroku项目,点击连接Connect
5、手动部署Manual deploy -> Deploy Branch, 部署成功。
三、在客户端上执行(默认不修改代码)
独立goproxy客户端:
proxy.exe http -t tcp -p :6600 -T wss -P test2-goproxy.herokuapp.com:443 --parent-ws-password pass -q 8.8.8.8:53 --timeout 30000
在浏览器上设置代理:127.0.0.1:6600 http
安卓客户端:
安卓 goproxy-ss-plugin 插件配置可以写:
主机:test2-goproxy.herokuapp.com
端口:443
加密方法:aes-256-cfb
密码:123
插件参数:
-S http -j 123 -h aes-256-cfb -T wss -P test2-goproxy.herokuapp.com:443 --parent-ws-password pass --timeout 30000
注意:本次部署中需要修改test2-goproxy为你自己的名称。
from https://github.com/snail007/goproxy-heroku
--------------------------------------------------------------