HTTPS 代理架设笔记

众所周知的原因,想要上外网,需要一些特别的设置。

专用的工具增加了学习成本,而且老是被干掉,所以这个周末探索了一下使用通用技术来达到目的。目前看来,这个方案的最大问题,可能就是没法设置账号密码了;个人用的话,域名就是天然加密手段吧(管住自己大嘴巴)。

或者,可以使用自签 SSL 证书,这样如果没有根证书的话,是不是就没法建立链接?

 

原理

浏览器的所有请求,都会通过 https 加密通道转发到服务器,然后由服务器帮你完成请求并返回结果。

https 加密通道包括了:本地的 https 代理客户端、https通道服务器端(请求在服务器本地转发给 proxy)、服务器端的 proxy

 

工具

代理可以用 tinyproxy,或者 squid。这两个工具都是多协议转发的,这次主要是尝试了 tinyproxy。

https 通道一般使用 stunnel 来建立。

浏览器上,可以用 SwitchyOmega。

 

过程记录

1. 程序安装,CentOS7 和 Debian 都试了。Debian 系列实际安装的是 stunnel4;CentOS7 要添加额外的源。

wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo rpm -Uvh epel-release-latest-7*.rpm

 tinyproxy 直接通过 yum 安装即可。

 

2. 配置开机自启动

CentOS7 上没有带 Stunnel 的 Service(感觉 CentOS7 对 stunnel 不友好):

# /usr/lib/systemd/system/stunnel.service

[Unit] Description
=SSL tunnel for network daemons After=network.target After=syslog.target [Install] WantedBy=multi-user.target Alias=stunnel.target [Service] Type=forking ExecStart=/usr/bin/stunnel /etc/stunnel/stunnel.conf ExecStop=/usr/bin/killall -9 stunnel # Give up if ping don't get an answer TimeoutSec=600 Restart=always

 

 

3. 配置软件

Tinyproxy 配置文件: /etc/tinyproxy/tinyproxy.conf

主要需要关注的是端口,还有 Allow 项,我们只需要本地访问,目前啥也不用改。端口暂定 8888。

Stunnel 配置文件:/etc/stunnel/stunnel.conf

CentOS 上可以用这个配置(注意下面 /var/stunnel 目录需要手工建,而且要 chown nobody:nobody stunnel):

sslVersion = TLSv1.2

cert = /etc/stunnel/7656971_ss.xxx.com.pem
key = /etc/stunnel/7656971_ss.xxx.com.key

chroot = /var/stunnel
setuid = nobody
setgid = nobody

output = stunnel.log
pid = /stunnel.pid

socket = l:TCP_NODELAY=1
socket = r:TCP_NODELAY=1

client = no

[service_name]
accept = 443
connect = 127.0.0.1:8888 
TIMEOUTclose = 0

对了,上面用的 pem 和 key,是在阿里云上免费申请来的。另外,这里的 pem 是下载来的 pem 和 根证书合并来的( cat root.cer >> *xx.com.pem)

这里有个坑,CentOS 里面的 Stunnel 不支持注释!尝试了好几次没法启动,才发现这个问题。。。把所有的注释删了就好了。

Debian 安装 Stunnel4 后,/etc/stunnel/ 文件夹下有个 readme,里面提供了一个参考配置。推荐从这个参考配置开始。

 

4. 防火墙

CentOS 上防火墙打开端口。我们配置 Stunnel 使能 443 端口上的转发,所以向外网打开443。(代理请求是本地转发的,不用向公网打开 8888):

firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload

 

5. 测试

测试能不能穿过防火墙,以及创建连接,可以用 telnet,比如:

telnet www.baidu.com 443
Trying 180.97.34.94...
Connected to www.a.shifen.com.
Escape character is '^]'.

 

本机使用 curl 来检测代理是否成功:

curl -x localhost:8888 www.google.com

 

 

openssl 自签名

 使用下面的指令,可以自签名一个 ssl 证书:

openssl req -new -x509 -days 365 -nodes -out stunnel.pem -keyout stunnel.pem

生成的过程中会问这些问题(除了域名,其他全部回车了。。。):

Country name PL, UK, US, CA

State or Province name Illinois, Ontario

Locality Chicago, Toronto

Organization Name Bill's Meats, Acme Anvils

Organizational Unit Name Ecommerce Division

Common Name (FQDN) www.example.com

注意:Common Name (FQDN) 应该是运行 stunnel 机器的主机名。如果能通过不同的主机名访问这台机器,有些 SSL 客户会警告这个主机的证书有问题,所以最好是使它和用户访问的主机名匹配。

目前,使用这样生成的证书没法链接,还需要再研究下。

等五一有空了研究下这个:

https://blog.csdn.net/qq_28938933/article/details/88832306?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_ecpm_v1~rank_v31_ecpm-2-88832306.pc_agg_new_rank&utm_term=openssl+%E6%9D%83%E9%99%90+%E8%AF%81%E4%B9%A6&spm=1000.2123.3001.4430

 

另外,考虑使用 80 端口做个“开关”,访问固定的端口后,可以把代理使能一段时间,以弥补没有认证的缺陷。

posted @ 2022-04-23 18:20  Biiigfish  阅读(934)  评论(0编辑  收藏  举报