没办法,应用越来越深入,就会越来越多要求。
squid+stunnel+用户密码认证的场景至少以下三个,我会遇到。
1,标准玩法
在服务器上建一个SQUID,加密码认证,然后,其它人通过它上网。(不要看这是正常玩法,在一个管理后台限制登陆,而维护VPN成本大时,这个小应用很有用处的)
2,标准加密玩法
在国外搞个服务器(翻嘛,用第1种时,会有问题,因为GFW会在你想去国外就拦之),然后,将本地发到国外的请求时加密。(本来客户端安装STUNNEL,这个适合很私密的东东,但在企业内部署,就很不好推广)
http://www.cnblogs.com/zenghui940/p/4304724.html
3,企业加密玩法
企业的东东,还是希望简单好用,最好对客户端的STUNNEL加密透明,不需要了解。这时,就是国外一个服务器(SQUID+STUNNEL解密转发),公司内局域网一个服务器(纯STUNNEL加密,代替第2种的每个客户端),然后再是客户浏览器简单配置(指定内网的一个IP地址及端口)。
http://blog.csdn.net/skylinethj/article/details/43816663
几个步骤的组合如下:
匿名IP:
squid.conf
via off forwarded_for delete
生成认证的用户名,密码及同SQUID结合
htpasswd -c /etc/squid/user.pass xxx
squid.conf
auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/user.pass auth_param basic children auth_param basic realm Welcome to test auth_param basic credentialsttl hours acl lookwest proxy_auth REQUIRED dns_nameservers 8.8.8.8 http_access allow all
需要安装的附加包:
Yum -y install httpd-devel yum -y install openssl-devel
生成STUNNEL密钥:
openssl req -new -x509 -days -nodes -out stunnel.pem -keyout stunnel.pem openssl gendh >> stunnel.pem
国外服务器上的STUNNEL配置:
cert = /usr/local/etc/stunnel/stunnel.pem CAfile = /usr/local/etc/stunnel/stunnel.pem socket = l:TCP_NODELAY= socket = r:TCP_NODELAY= ;;;chroot = /var/run/stunnel pid = /tmp/stunnel.pid verify = ;;; CApath = certs ;;; CRLpath = crls ;;; CRLfile = crls.pem ;setuid = stunnel ;setgid = stunnel ;;; client=yes compression = zlib ;;; taskbar = no delay = no ;;; failover = rr ;;; failover = prio sslVersion = TLSv1 fips=no debug = syslog = no output = stunnel.log [sproxy] accept = connect =
国内服务器上的STUNNEL配置(共用同一个STUNNEL.PEM):
cert = /usr/local/etc/stunnel/stunnel.pem socket = l:TCP_NODELAY= socket = r:TCP_NODELAY= verify = CAfile = /usr/local/etc/stunnel/stunnel.pem client=yes compression = zlib ciphers = AES256-SHA delay = no failover = prio sslVersion = TLSv1 fips = no [sproxy] accept = connect = 服务器A的IP:
Centos6.5 Squid3.1.10代理服务器(用户认证,加密,高匿)及使用指南
1,安装
Yum -y install squid http-devel
2,用apache的htpasswd 创建用户
htpasswd -c /etc/squid/user.pass test
3,使用openssl加密
Cd /root/
openssl req -new > wdzjsquid.csr
openssl rsa -in privkey.pem -out wdzjsquid.key
openssl x509 -in wdzjsquid.csr -out wdzjsquid.crt -req -signkey wdzjsquid.key -days 3650
4,修改配置文件 Vi /etc/squid/squid.conf
#最前面加入蓝色字体
auth_param basic program /usr/lib64/squid/ncsa_auth /etc/squid/user.pass
auth_param basic children 5
auth_param basic realm Welcome to test
auth_param basic credentialsttl 2 hours
acl lookwest proxy_auth REQUIRED
dns_nameservers 8.8.8.8
http_access allow lookwest
#下面两行就是高匿配置
via off
forwarded_for delete
#http_access deny all #注释这个加入下面一句话
http_access allow all
#http_port 198.11.172.35:3128 #注释这个加入下面一句话
https_port 443 cert=/root/wdzjsquid.crt key=/root/wdzjsquid.key
5,启动
Service squid start
6,linux 客户端安装stunnel
Linux版下载地址:https://www.stunnel.org/downloads/stunnel-5.10.tar.gz
apt-get install libssl-dev ubuntu
Yum -y install libssl-dev centos
Tar zxvf stunnel-5.10.tar.gz
./configure --prefix=/usr/local/stunnel
Make && make install
cd /usr/local/stunnel/etc/stunnel
Vi stunnel.conf
[https]
accept = 127.0.0.1:8088
connect = 198.11.172.35:443
启动
/usr/locsal/stunnel/bin/stunnel /usr/local/stunnel/etc/stunnel/stunnel.conf
修改浏览器代理
http 127.0.0.1 8088
https 127.0.0.1 8088
等等
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
说明:
Squid代理服务器,但它不能直接FQ,因为在连接到Squid的过程中,就已经被墙了。所以得把传输的数据先进行加密再传输,这样等于是绕过了防火墙。这里使用的软件就是Stunnel,它用于加密数据。
服务器需求:
1、一台可以正常访问互联网的服务器,代号A(国外的)
2、一台可以正常访问服务器A的国内服务器,代号B
使用操作系统:
随意(我的是ubuntu)
访问过程:
1、用户设置代理指向B服务器的Stunnel服务监听的端口,访问网站
2、B服务器的Stunnel会将信息做加密处理,然后发送到A服务器的Stunnel服务上
3、A服务器的Stunnel会将加密的信息做解密处理,然后发送给A服务器的Squid服务上
4、A服务器的Squid会向目标网站请求数据,然后将信息返回。
一、在服务器A上安装Squid
1、安装Squid(个人建议自己下载一个编译安装,我是使用自动安装的)
- sudo apt-get install squid
配置Squid
自动安装后的配置文件在/etc/squid3路径下
打开配置文件
- cd /ect/squid3
- vi squid.conf
修改配置文件,在配置文件里面找到(注意前面是没有#的那一行)
- http_access deny all
- 修改为
- http_access allow all
网上有很多乱七八糟的配置说法,我们直接无视。修改上面一个地方就够了。
启动Squid
- sudo service squid3 --full-restart
到此已经成功安装Squid,如果出现错误百度一下吧。记得不用安装支持ssl的squid3之类的,因为我们下面用到自己的加密软件。
二、在A服务器上安装Stunnel
1、先到http://www.stunnel.org/downloads.html上找到最新的版本
- 在“Latest Version”中找到一个最新的就行了,以.tar.gz结尾的安装包
- 如:stunnel-5.10.tar.gz
2、下载软件包
- 在A服务器上使用命令行
- $wget http://www.stunnel.org/downloads/stunnel-5.10.tar.gz
- 或者直接下载到本地,再用工具上传到A服务器上
3、解压
- $tar -zvxf stunnel-5.10.tar.gz
4、进入软件包
- $cd stunnel-5.10
5、编译安装
- $./configure
- $make
- $make install
正常情况下不会出什么问题,如果make失败,大多会是没有安装openssl-devel,安装上即可:
$yum install openssl-devel
再次make应该能成功,如果再不行,请google,一般都会是一些软件未安装倒至的。之后,可以使用stunnel -version来查看是否安装成功。
6、配置Stunnel
Stunnel比Squid要麻烦一些,因为Squid如果你什么都设置,同样能运行,而Stunnel就不行。它需要一个配置文件,还需要一个签名证书。
我们还得自己来生成一个生成一个密钥文件stunnel.pem
a、先进到目录
- $cd /usr/local/etc/stunnel/
b、生成密钥
- $openssl req -new -x509 -days 365 -nodes -config openssl.cnf -out stunnel.pem -keyout stunnel.pem
如果报错找不到openssl.cnf,可以把-config openssl.cnf去掉,即:
- $openssl req -new -x509 -days 365 -nodes -out stunnel.pem -keyout stunnel.pem
这样会在/usr/local/etc/sutnnel/里生成密钥文件stunnel.pem
c、接着给它生成Diffie-Hellman部分:
- $openssl gendh 512>> stunnel.pem
网络上说这是4.X版本必须要做的,但我使用的5.01也这么做了。
d、设置配置文件:
在/usr/local/etc/stunnel/目录下有一个stunnel.conf.simple文件,可以cp一份为stunnel.conf或是新建一个stunnel.conf,这里使用新建
- $vim stunnel.conf
将以下内容复制进去
- cert = /usr/local/etc/stunnel/stunnel.pem
- CAfile = /usr/local/etc/stunnel/stunnel.pem
- socket = l:TCP_NODELAY=1
- socket = r:TCP_NODELAY=1
- ;;;chroot = /var/run/stunnel
- pid = /tmp/stunnel.pid
- verify = 3
- ;;; CApath = certs
- ;;; CRLpath = crls
- ;;; CRLfile = crls.pem
- ;setuid = stunnel
- ;setgid = stunnel
- ;;; client=yes
- compression = zlib
- ;;; taskbar = no
- delay = no
- ;;; failover = rr
- ;;; failover = prio
- sslVersion = TLSv1
- fips=no
- debug = 7
- syslog = no
- output = stunnel.log
- [sproxy]
- accept = 34567
- connect = 127.0.0.1:3128
这里有几个设置要说明一下:
第一行和二行是密钥文件的位置,如果按前面的做法,这里肯定是正确的。
connect = 127.0.0.1:3128 是本服务器,也就是A服务器Squid监听的端口号,也就是3128啦。
网上有说法是要配置下面两个,但是我没配置也成功,所以就不用那么麻烦了,直接忽略掉。
setuid = stunnel
setgid = stunnel
e、保存退出后,就可以试着启动stunnel了
- $stunnel
如果正常是没有输出任何内容的,如果有问题,它会给出问题所在,仔细排查,基本上不会有什么问题。
f、检查是否正常运行:
- $ps -ef | grep stunnel
如果看到运行的stunnel,说明已经成功运行了。
这样A服务器的Squid和Stunnel都配置完成了,接下来配置国内B服务器的Stunnel。B服务器不需要Squid,所以只需要配置Stunnel
三、在服务器B上安装配置Stunnel
安装同A,密钥不要再生成了,从服务器A上拷过来
1、登录服务器A,进到/usr/local/etc/stunnel/目录,向服务器B的/usr/local/etc/stunnel/目录里拷贝stunnel.pem密钥:
- $cd /usr/local/etc/stunnel/
- $scp stunnel.pem root@服务器B的IP:/usr/local/etc/stunnel/
- //当然也可以使用工具先从A服务器下载下来,再上传到B服务器
2、接着登录服务器B,设置配置文件,同服务器A,可以cp一个,也可以新建,这里同样新建:
- $cd /usr/local/etc/stunnel/
- $vim stunnel.conf
将下面的内容复制到里面:
- cert = /usr/local/etc/stunnel/stunnel.pem
- socket = l:TCP_NODELAY=1
- socket = r:TCP_NODELAY=1
- verify = 2
- CAfile = /usr/local/etc/stunnel/stunnel.pem
- client=yes
- compression = zlib
- ciphers = AES256-SHA
- delay = no
- failover = prio
- sslVersion = TLSv1
- fips = no
- [sproxy]
- accept = 0.0.0.0:7071
- connect = 服务器A的IP:34567
这里要说明的是:
accept = 0.0.0.0:7071 中的7071是用户需要设置的代理端口,可以随意设置,只要大于500就好。0.0.0.0是为了让外网能使用,如果只是内部使用,改成127.0.0.1即可。
connect = 服务器A的IP:34567,很显然这里要填什么,34567是服务器A的Stunnel监听的端口号,保持和它一至就对了。
保存退出后,就可以启动Stunnel了
- $stunnel
如果没有意外,整个代理就正常运行了。打开你的浏览器,将代理设置为你服务器B的IP+7071端口号,然后访问一些不能访问的站点试试看。
补充手工安装Squid
到www.squid-cache.org上找最新版本的Squid,目前是3.4.5,下载地址是:http://www.squid-cache.org/Versions/v3/3.4/squid-3.4.5.tar.gz
//下载软件包
$wget http://www.squid-cache.org/Versions/v3/3.4/squid-3.4.5.tar.gz
//解压
$tar -zvxf squid-3.4.5.tar.gz
//进入软件包
$cd squid-3.4.5
//编译安装
$./configure --with-openssl=/usr/lib64/openssl
$make
$make install
因为Squid需要openssl,所以configure需要带上openssl,openssl的路径需要根据你的系统来确定,我这里是在/usr/lib64/openssl,所以带上了它。
如果没有错误提示,说明基本上安装成功
启动Squid
$/usr/local/squid/sbin/squid -s
如果什么配置都不做修改,那默认的商品号为3128,这时候,可以打开你的浏览器,设置代理,填上A服务器的IP和3128端口号,访问baidu,看看remote是不是A服务器的地址和端口号,如果是,说明Squid已经能正常使用了。只是这时还不能FQ。
安装过程中可能会遇到的一些问题:
configure: error: no acceptable C compiler found in $PATH
本问题是没有安装GCC,安装即可:
$yum install gcc
configure: error: C++ compiler cannot create executables
本问题是安装了GCC,但没有安装C++,安装即可:
$yum install gcc-c++
/usr/bin/ld cannot find -lssl
本问题是没有指定openssl目录位置,在configure的时候把系统中openssl所在的目录带上
$./configure --with-openssl=/usr/lib64/openssl
make时报错:ext_file_userip_acl.cc:254: error: 'errno' was not declared in this scope
请修改文件:helpers/external_acl/file_userip/ext_file_userip_acl.cc
在#include "util.h"下面加一行
#include <cerrno>
外网访问提示:Access Denied
说明配置只允许本地访问,修改配置文件/usr/local/squid/etc/squid.conf
http_access allow all