Total Pageviews

Tuesday, 7 April 2020

http代理服务器程序:goproxy-by-snail007

做过运维的都知道一个常识,生产环境不能够连接外网,主要还是为了安全。但是总有连接外网的需求,比如时间同步、镜像站同步、邮件发送、钉钉/微信告警什么的,这些需求往往涉及到多台服务器,我们不能为这些服务器都开通访问外网的策略,所以最好的做法是将一台服务开通外网访问,其他有外网需求的通过它来上网。
这就是典型的代理服务器了,客户端请求发送给代理器,由代理服务器进行转发,然后将响应的内容发送给客户端。可以用于代理服务器的软件有不少,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
------------------------------------
 
goproxy heroku 一键部署套装,把heroku变为免费的http(s)\socks5代理,搜索学习资料。 
 

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、登陆好后,点击

Deploy

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

--------------------------------------------------------------