使用 squid + stunnel 加密上网

作者 huhamhire,暂无评论,2015年10月11日 16:54 折腾历程

由于众所周知的原因,在国内访问诸如 Google,Facebook 之类的网站,最好需要通过加密的代理来传输数据。一般代理方式可以通过 HTTP,socks 的方式来实现,当然也包括比较常见的 VPN 的方式。我因为在今年早些时候,把搭建新版博客的服务器做到了 Conaha 的新加坡机房,电信线路下可以有非常不过的低延迟,所以再次有机会来折腾搭一个自己用的梯子。

VPN 最大的问题在于启动了以后就相当于打开了全局代理,所有的数据都会通过 VPN 的出口来发送,显然对于科学上网来说不够合理,而如果使用其他的代理服务器,则可以通过 SwitchOmega 这类工具来自动切换代理规则,合理选择优质途径来访问相关站点。所以这一次的折腾我准备通过 squid 的 http 代理 + stunnel 加密来实现。本次折腾主要使用 CentOS 7 环境。

搭建 squid 服务

squid 是非常经典的 http 代理服务器,而且理论上可以通过 http 代理的方式来代理各种 TCP 传输业务,用来做梯子的话,有个优势是可以开启缓存来起到部分加速的所用。

首先安装 squid 服务:


yum install -y squid

如果需要配置访问密码,可以安装 httpd 的工具包来管理密码。


yum install -y httpd-tools

然后使用如下命令创建账号:


htpasswd -cb /etc/squid/passwd <USERNAME> <PASSWORD>

随后,通过如下命令可以添加更多账号:


htpasswd -b /etc/squid/passwd <USERNAME> <PASSWORD>

接下来,修改 squid 配置:


vim /etc/squid/squid.conf

添加以下配置使密码访问规则生效;


1 # Auth
2 auth_param basic program /usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd
3 auth_param basic children 10
4 auth_param basic credentialsttl 24 hours
5 acl normal proxy_auth REQUIRED
6 http_access allow normal

此外,还可通过如下配置实现高匿代理实现真实 IP 隐藏:


1 # not display IP address
2 forwarded_for off
3 
4 # header
5 request_header_access Referer deny all
6 request_header_access X-Forwarded-For deny all
7 request_header_access Via deny all
8 request_header_access Cache-Control deny all

启动 squid 服务,并设定开机自动启动:


systemctl start squid
systemctl enable squid

搭建 stunnel 服务

因为常规的 http 代理是通过明文方式进行的,直接使用 http 代理还是会遇到中间数据传输被审查的情况,可以再加上一层 stunnel 来对传输数据进行加密处理。

在服务端,也就是 squid 所在服务器上安装 stunnel:


yum install -y stunnel

创建 stunnel 服务端配置文件,这里使用 5000 端口作为 stunnel 的服务端口:


1 cat > /etc/stunnel/stunnel.conf <<EOF
2 client = no
3 [squid]
4 accept = 5000
5 connect = 127.0.0.1:3128
6 cert = /etc/stunnel/stunnel.pem
7 EOF

创建加密证书文件:


openssl genrsa -out key.pem 2048
openssl req -new -x509 -key key.pem -out cert.pem -days 1095
cat key.pem cert.pem >> /etc/stunnel/stunnel.pem

打开防火墙端口:


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

创建 stunnel 服务的 systemd 配置文件:


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

进行如下配置:


 1 [Unit]
 2 Description=SSL tunnel for network daemons
 3 After=syslog.target
 4 
 5 [Service]
 6 ExecStart=/bin/stunnel /etc/stunnel/stunnel.conf
 7 ExecStop=kill -9 $(pgrep stunnel)
 8 ExecStatus=pgrep stunnel
 9 Type=forking
10 
11 [Install]
12 WantedBy=multi-user.target

启动 stunnel 服务:


systemctl enable stunnel
systemctl start stunnel

stunnel 客户端配置

stunnel 顾名思义,其本质就是一条加密隧道,需要同时具有隧道的入口(客户端),与隧道的出口(服务端)才可正常工作。在部署好服务端之后,下面来配置下客户端。 stunnel 可以搭建在任何平台上,不一定是内网服务器,在本地 PC 上也可以直接搭建,我因为手头有一块运行 Debian 8 的 beaglebone black,正好可以来演示下 debian 环境下的配置,centos 的客户端除了配置文件与服务端不同外,其余配置都是一致的。

同样,首先安装 stunnel:


apt-get install stunnel4

上传与服务器端一致的证书文件到 stunnel 配置目录,并创建客户端配置文件,注意将 <Server IP> 替换成服务器的实际 IP:


1 cat > /etc/stunnel/stunnel.conf <<EOF
2 cert = /etc/stunnel/stunnel.pem
3 client = yes
4 [squid]
5 accept = 5000
6 connect = <Server IP>:5000
7 EOF

创建 Debian 版本 stunnel 服务的 systemd 配置文件:


vim /etc/systemd/system/stunnel.service

进行如下配置:


 1 [Unit]
 2 Description=SSL tunnel for network daemons
 3 After=syslog.target
 4 
 5 [Service]
 6 ExecStart=/usr/bin/stunnel /etc/stunnel/stunnel.conf
 7 ExecStop=kill -9 $(pgrep stunnel)
 8 ExecStatus=pgrep stunnel
 9 Type=forking
10 
11 [Install]
12 WantedBy=multi-user.target

最后启动客户端 stunnel 服务:


systemctl enable stunnel
systemctl start stunnel

最后,通过在客户机上连接 stunnel 的入口即可完成代理连接。

proxy
关键词:squid , SSL , stunnel , 代理
登录后进行评论