Stunnel on Debian GNU/Linux 6 (squeeze)

传统的POP3, SMTP, Samba等服务,都是不加密的协议(即在网络上明文传输数据),通过stunnel,可以将访问这些服务的连接通过一个加密的管道进行,便于保护个人隐私。

这里我们要搭建的目标:

服务器为Linux(Debian 6.0 squeeze),运行两个服务:

  1. Squid HTTP代理服务器,监听8080端口,只接受本机请求;
  2. Stunnel运行在服务端模式,监听443端口。并将443端口的请求转发本机的8080 squid代理端口。

在本地机器上,Stunnel运行在客户端模式,监听8080端口。并将8080端口上接受到的连接,经过SSL加密后,转发到远程服务器的443 端口。而远程服务端Stunnel将443端口上连接解密后,投递到squid。Squid代理返回的响应,则也会经过SSL加密再回传到本地机器的客户 端模式的Stunnel,客户端Stunnel解密回应后回传给本地程序(浏览器等)。

使用这个Stunnel的方式来代理访问国外的网站的优点:

  • 国外网站直接连接访问,可能会有速度慢而且很不稳定的问题,所以使用代理会大大改善。通过浏览器插件的方式,可以根据访问的网址来确定是否使用代理,更加灵活;
  • 使用VPN的问题:我们大部分时间访问的网站,比如新浪、网易、腾讯、搜狐,都是不需要代理就可以流畅高速的访问的。如果为了稳定快速访问国外网站而使用VPN,则会导致这些国内网站也经由VPN访问,体验变得极为不佳,得不偿失;
  • 采用SSH建立tunnel访问,SSH是一个TCP长连接,也会有不稳定的问题;
  • Stunnel服务则是按需建立TCP连接,远程服务端配置为监听443端口,采取了SSL的加密方式,则本地主机和远程服务端之间的交互和HTTPS完全类似,稳定高效。

服务器的准备

首先,你得有一个可以完全控制的Linux系统提供服务端,可以参考这里购 买一个便宜的VPS。不过购买的时候可得看清楚了,要买VPS,不是Web Hosting服务。后者只有网页上的控制面板,是用来给你放网站的。前者才是一个有shell访问的独立IP的“主机”。我和这个网站并无任何关系,里 面的链接可能是有返利尾巴的,但是对于用户来说并无坏的影响。

购买VPS后,会得到一个IP地址,建议购买一个域名,然后用域名访问你的主机,省得记IP地址了。当然我这里的“建议”是建议你去找个便宜的地方 买,而不要傻不拉几的直接在买VPS的同时把域名也放入购物车一起付款了,那样估计不会便宜的。域名也会有做活动的时候,而且域名也没必要非得要和VPS 在同一个地方买。说白了,就是你有一个随便哪里来的域名,然后把这个域名指向这里买的VPS的IP地址,从而可以方便你访问这个VPS而已。嫌啰嗦的话, 就直接用IP地址访问就行了……

由于这里讲的是 Debian 的配置,所以在使用之前请确保你的虚拟主机跑的是 Debian 系统。如果在注册过程中没有让你选择操作系统,那么请在注册、支付完成后,登陆你的帐户,可以修改你的操作系统为 Debian 6 x86 (即32位系统,如果内存够大你也可以选择x64系统)。注意,修改操作系统就是重装系统,原有系统的所有数据都将丢失。当然StunnelSquid的配置,在所有的Linux应该也是大同小异。Debian系统并不是必须。

开始配置

SSH登陆到你的虚拟主机。Windows下的SSH客户端可以用PuTTY。登陆用户名为root,密码请登陆你的主机服务商的帐户后查找。

首先更新下软件包信息:

# apt-get update

然后安装 stunnel:

# apt-get install stunnel

切换到 stunnel 配置目录:

# cd /etc/stunnel

备份默认配置:

# cp stunnel.conf stunnel.conf.backup

修改配置:

# vi stunnel.conf

首先指定 cert 和 key:

cert = /etc/stunnel/stunnel.pem
key = /etc/stunnel/stunnel.pem

这个key文件(“stunnel.pem”)我们稍后生成。

然后注释掉所有的默认服务,而只保留[https]这一节,不过我这里把https里的connect端口设置为了8443,这里的意思就是,Stunnel会在这台主机上监听443端口,并将连接转到8443端口上。所以你的主机上需要在8443端口有一个服务。而这个服务,稍后我们将安装一个Squid来提供。

;[pop3s]
;accept = 995
;connect = 110 ;[imaps]
;accept = 993
;connect = 143 ;[ssmtp]
;accept = 465
;connect = 25 [https]
accept = 443
connect = 8443
;TIMEOUTclose = 0

其他配置方面,可以先打开详尽的日志记录以方便调试:

; Some debugging stuff useful for troubleshooting
debug = 7
output = /var/log/stunnel4/stunnel.log

测试完毕后,建议将上面的 “debug = 7″ 注释掉(顺便提及,注释就是用';'开头的行),或者修改为5以下的数值。保留在7会产生大量的日志,日志文件很快就会变的很大。

另外,默认配置文件是采用了chroot机制,如下所示,这段不需要修改,使用起来没有问题:

; Some security enhancements for UNIX systems - comment them out on Win32
chroot = /var/lib/stunnel4/
setuid = stunnel4
setgid = stunnel4
; PID is created inside the chroot jail
pid = /stunnel4.pid

这就是Stunnel的配置文件,本身就是很简单的一个配置文件,主要就是设置了一下key文件的路径,然后指定了服务端口。

不过除此之外,还要修改一个地方:

# cd /etc/default
# vi stunnel4

这里要设置为ENABLED=1,默认是不使能stunnel服务的:

# Change to one to enable stunnel automatic startup
ENABLED=1

生成key并启动Stunnel服务

启动stunnel服务之前,需要生成一组密钥:

# cd /etc/stunnel
# openssl req -new -nodes -x509 -out stunnel.pem -keyout stunnel.pem

运行命令后,终端上会有几个问题需要你输入你的设定,基本没有什么意义,自己随便给吧:

Generating a 1024 bit RSA private key
.......................++++++
......................++++++
writing new private key to 'stunnel.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:Shanghai
Locality Name (eg, city) []:Xxxxxx
Organization Name (eg, company) [Internet Widgits Pty Ltd]:XXX
Organizational Unit Name (eg, section) []:XXX
Common Name (eg, YOUR name) []:XXXXXXX
Email Address []:XXXXXXX@example.com

命令运行完毕,公钥和密钥就都在一个文件stunnel.pem里了。这个文件是访问服务器的证书,非常重要,切不可外传。

最后,就是重启/启动stunnel服务:

# /etc/init.d/stunnel4 restart

运行结果:

Restarting SSL tunnels: [stopped: /etc/stunnel/pad.stunnel.conf] [Started: /etc/stunnel/pad.stunnel.conf] [Already running: /etc/stunnel/stunnel.conf] stunnel.

如果启动服务失败,则去这里看看日志吧:
/var/log/stunnel4/stunnel.log

`squid’服务安装和配置

接下来是squid的安装了:

# aptitude install squid

瞬间安装完成,开始配置:

# cd /etc/squid

还是先备份原始配置:

# cp squid.conf squid.conf.backup

然后编辑之:

# vi squid.conf

首先,我们来增加一个ACL,也就是Access Control List。对局域网地址的配置,我们找到下面这段:

# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
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 to_localnet dst 10.0.0.0/8	# RFC1918 possible internal network
acl to_localnet dst 172.16.0.0/12 # RFC1918 possible internal network
acl to_localnet dst 192.168.0.0/16 # RFC1918 possible internal network

然后配置HTTP访问权限:

# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager
# Only allow purge requests from localhost
http_access allow purge localhost
http_access deny purge
# Deny requests to unknown ports
#http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
#http_access deny CONNECT !SSL_ports
#
# We strongly recommend the following be uncommented to protect innocent
# web applications running on the proxy server who think the only
# one who can access services on "localhost" is a local user
#http_access deny to_localhost
http_access deny to_localhost
http_access deny to_localnet #
# INSERT YOUR OWN RULE(S) HERE TO ALLOW ACCESS FROM YOUR CLIENTS # Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
#http_access allow localnet
http_access allow localhost # And finally deny all other access to this proxy
http_access deny all

上面的更改中,主要是:

http_access deny to_localhost
http_access deny to_localnet

这里的意思是拒绝来自局域网地址的访问,也拒绝到达局域网地址的访问。也就是说,如果你在家里的地址是192.168.1.100,想访问 192.168.1.101上的HTTP服务,如果你把这个请求经过stunnel传递到了外面的服务器上,外面的服务器,也就是上面的squid服务, 是无论如何也不可能找到你家中局域网里192.168.1.101这台机器的,这就和你企图通过代理访问127.0.0.1一样,只会造成混乱。

另外的更改就是把默认允许localnet的地方都改成了localhost。就是这些:

http_access allow manager localhost
http_access allow purge localhost
http_access allow localhost

另外请注意到上面的配置中,禁用了端口的限制:

# Deny requests to unknown ports
#http_access deny !Safe_ports
# Deny CONNECT to other than SSL ports
#http_access deny CONNECT !SSL_ports

实际上我们这里的squid只是给服务器自己内部stunnel使用的,无需限制端口,只需限制外部世界的任何访问就可以了。

最后一行保持不变,拒绝其他任何连接:

http_access deny all

另外一个配置:

#  TAG: forwarded_for	on|off
# If set, Squid will include your system's IP address or name
# in the HTTP requests it forwards. By default it looks like
# this:
#
# X-Forwarded-For: 192.1.2.3
#
# If you disable this, it will appear as
#
# X-Forwarded-For: unknown
#
#Default:
# forwarded_for on
forwarded_for off

不要让squid启用 X-Forwarded-For 这个HTTP头(header),可以避免暴露你的源IP地址。不过squid接受stunnel的请求,看到的到底是127.0.0.1还是最源头的地址,我倒是还没试过。

最后是配置一下监听端口,这个监听端口就是给stunnel用的,我们配置为8443:

# Squid normally listens to port 3128
#http_port 3128
http_port 8443

squid的配置文件其实挺复杂的,不过对于这里的应用,修改的东西倒是不多。保存上述配置,重启squid服务:

# /etc/init.d/squid restart
Restarting Squid HTTP proxy: squid.

如此这般,服务端的配置就算是结束了。通过在这个服务器上运行了stunnel和squid服务,我们建立了这样一个流程:

某个客户端,通过stunnel连接到了我们的服务器的443端口,这里的连接是用SSL加密的,客户端和服务端必须用同一个我们在服务器配置过程中生成的stunnel.pem证书文件,因此这个连接是加密的,可以保护用户的隐私不被攻击者窥探。

此时在服务端,Stunnel收到外界连接到443端口的连接请求,会将收到的数据解密为明文数据,然后投递到服务器上的8443端口上。而服务器 上的squid服务正好监听在了8443端口上,squid接收到的HTTP请求就是明文的,于是就这样透明的将HTTP请求传达到它的目的地,并接收到 目的地HTTP服务器的回应,回传给请求来源,这里就是stunnel服务。stunnel收到回应后,再次加密,回传给发起请求的源头,也就是客户端。 客户端的stunnel程序则相应地解密收到的回应给对应的客户端程序(一般是浏览器)。加密的通道对于最两头的客户端和服务端,就是一个透明的管道。

所以仅仅配置了这里的服务端还不行,你必须还得在你的客户端主机上运行一个客户端模式的Stunnel,然后才可以实现加密代理访问。请到本文开头查看Linux或者Windows平台下Stunnel客户端的配置。

Stunnel服务端的更多相关文章

  1. Docker服务端防护

    运行一个容器或应用程序的核心是通过 Docker 服务端.Docker 服务的运行目前需要 root 权限,因此其安全性十分关键. 首先,确保只有可信的用户才可以访问 Docker 服务.Docker ...

  2. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  3. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

  4. Socket聊天程序——服务端

    写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...

  5. zookeeper源码分析之五服务端(集群leader)处理请求流程

    leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...

  6. zookeeper源码分析之四服务端(单机)处理请求流程

    上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...

  7. zookeeper源码分析之一服务端启动过程

    zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...

  8. 创建APPID&&部署服务端教程

    创建APPID&&部署服务端 一.创建APPID 1.打开https://console.developers.google.com ,左击顶部Project,然后左击创建项目 2.输 ...

  9. 简析服务端通过GT导入SHP至PG的方法

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要在浏览器端直接上传SHP后服务端进行数据的自动入PG ...

随机推荐

  1. ae IMap接口成员

    使用IMap接口显示各种数据源的数据.IMap接口的成员ActiveGraphicsLayer:活动图形图层,如果没有将创建一个基本memory graphics layer.AddLayer:向地图 ...

  2. sharepoint列表如何进行随机取几条记录?

    sharepoint列表如何进行随机取记录?由于itemid是不连续.可能存在删除添加等操作导致 我们可以采用随机取第几条记录.把记录集合取出来.产生随机第几条数.这里关键是如何产生不重复的随机数 方 ...

  3. SharePoint 2013 搭建负载均衡(NLB)

    服务器架构(三台虚机:AD和Sql在一台,前端两台) DC.Sql Server,其中包括:AD.DNS.DHCP服务(非必须): SPWeb01,其中包括:IIS.SharePoint: SPWeb ...

  4. AVAudioSession初探

    根据文档,AudioSession规定了app和系统音频行为交互的规范,一个app只有一个AudioSession的单例. app通过设置自己AudioSession的单例的属性来告诉系统自身想达到的 ...

  5. 解决Dialog 消失,输入法不消失的问题

    前言:今天遇到一个奇怪的问题,Activity 里面弹出一个 dialog , 这个dialog里面有EditText . 问题:当 dialog 里面的输入法出现的时候,此时让diolog 消失,输 ...

  6. Android 生成xml文件

    生成XML文件备份短信,其格式为: <?xml version="1.0" encoding="UTF-8" standalone="true& ...

  7. 单例模式-用GCD实现

    用GCD实现单例模式的步骤: 步骤1. 创建头文件 XZSingleton.h,里面代码如下: // .h文件 #define XZSingletonH(name) + (instancetype)s ...

  8. unity3D 常用快捷键

    http://blog.csdn.net/ganlijianstyle/article/details/7985509 此页面提供了Unity3D默认的快捷键. shift +方向键         ...

  9. 转载文章----IL反编译利器——Ildasm.exe和Reflector.exe:

    转载地址:http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662546.html 一:Ildasm.exe简介  这一微软VS自带工具, ...

  10. 计算机组成原理往年试题以及答案(tzf!!!)

    计算机组成原理往年试题以及答案(下载链接!!!) 太子妃升职记(1~36) ::http://pan.baidu.com/s/1dDP5Kqd