Stunnel服务端
Stunnel on Debian GNU/Linux 6 (squeeze)
传统的POP3, SMTP, Samba等服务,都是不加密的协议(即在网络上明文传输数据),通过stunnel,可以将访问这些服务的连接通过一个加密的管道进行,便于保护个人隐私。
这里我们要搭建的目标:
服务器为Linux(Debian 6.0 squeeze)
,运行两个服务:
Squid
HTTP代理服务器,监听8080端口,只接受本机请求;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系统)。注意,修改操作系统就是重装系统,原有系统的所有数据都将丢失。当然Stunnel
和Squid
的配置,在所有的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 |
这里要设置为ENABLED=1,默认是不使能stunnel服务的:
# Change to one to enable stunnel automatic startup
ENABLED=1
生成key并启动Stunnel服务
启动stunnel服务之前,需要生成一组密钥:
# cd /etc/stunnel |
运行命令后,终端上会有几个问题需要你输入你的设定,基本没有什么意义,自己随便给吧:
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 |
如此这般,服务端的配置就算是结束了。通过在这个服务器上运行了stunnel和squid服务,我们建立了这样一个流程:
某个客户端,通过stunnel连接到了我们的服务器的443端口,这里的连接是用SSL加密的,客户端和服务端必须用同一个我们在服务器配置过程中生成的stunnel.pem
证书文件,因此这个连接是加密的,可以保护用户的隐私不被攻击者窥探。
此时在服务端,Stunnel收到外界连接到443端口的连接请求,会将收到的数据解密为明文数据,然后投递到服务器上的8443端口上。而服务器 上的squid服务正好监听在了8443端口上,squid接收到的HTTP请求就是明文的,于是就这样透明的将HTTP请求传达到它的目的地,并接收到 目的地HTTP服务器的回应,回传给请求来源,这里就是stunnel服务。stunnel收到回应后,再次加密,回传给发起请求的源头,也就是客户端。 客户端的stunnel程序则相应地解密收到的回应给对应的客户端程序(一般是浏览器)。加密的通道对于最两头的客户端和服务端,就是一个透明的管道。
所以仅仅配置了这里的服务端还不行,你必须还得在你的客户端主机上运行一个客户端模式的Stunnel,然后才可以实现加密代理访问。请到本文开头查看Linux或者Windows平台下Stunnel客户端的配置。
Stunnel服务端的更多相关文章
- Docker服务端防护
运行一个容器或应用程序的核心是通过 Docker 服务端.Docker 服务的运行目前需要 root 权限,因此其安全性十分关键. 首先,确保只有可信的用户才可以访问 Docker 服务.Docker ...
- Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)
本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...
- 关于如何提高Web服务端并发效率的异步编程技术
最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...
- Socket聊天程序——服务端
写在前面: 昨天在博客记录自己抽空写的一个Socket聊天程序的初始设计,那是这个程序的整体设计,为了完整性,今天把服务端的设计细化记录一下,首页贴出Socket聊天程序的服务端大体设计图,如下图: ...
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- zookeeper源码分析之一服务端启动过程
zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...
- 创建APPID&&部署服务端教程
创建APPID&&部署服务端 一.创建APPID 1.打开https://console.developers.google.com ,左击顶部Project,然后左击创建项目 2.输 ...
- 简析服务端通过GT导入SHP至PG的方法
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 项目中需要在浏览器端直接上传SHP后服务端进行数据的自动入PG ...
随机推荐
- ae IMap接口成员
使用IMap接口显示各种数据源的数据.IMap接口的成员ActiveGraphicsLayer:活动图形图层,如果没有将创建一个基本memory graphics layer.AddLayer:向地图 ...
- sharepoint列表如何进行随机取几条记录?
sharepoint列表如何进行随机取记录?由于itemid是不连续.可能存在删除添加等操作导致 我们可以采用随机取第几条记录.把记录集合取出来.产生随机第几条数.这里关键是如何产生不重复的随机数 方 ...
- SharePoint 2013 搭建负载均衡(NLB)
服务器架构(三台虚机:AD和Sql在一台,前端两台) DC.Sql Server,其中包括:AD.DNS.DHCP服务(非必须): SPWeb01,其中包括:IIS.SharePoint: SPWeb ...
- AVAudioSession初探
根据文档,AudioSession规定了app和系统音频行为交互的规范,一个app只有一个AudioSession的单例. app通过设置自己AudioSession的单例的属性来告诉系统自身想达到的 ...
- 解决Dialog 消失,输入法不消失的问题
前言:今天遇到一个奇怪的问题,Activity 里面弹出一个 dialog , 这个dialog里面有EditText . 问题:当 dialog 里面的输入法出现的时候,此时让diolog 消失,输 ...
- Android 生成xml文件
生成XML文件备份短信,其格式为: <?xml version="1.0" encoding="UTF-8" standalone="true& ...
- 单例模式-用GCD实现
用GCD实现单例模式的步骤: 步骤1. 创建头文件 XZSingleton.h,里面代码如下: // .h文件 #define XZSingletonH(name) + (instancetype)s ...
- unity3D 常用快捷键
http://blog.csdn.net/ganlijianstyle/article/details/7985509 此页面提供了Unity3D默认的快捷键. shift +方向键 ...
- 转载文章----IL反编译利器——Ildasm.exe和Reflector.exe:
转载地址:http://www.cnblogs.com/yangmingming/archive/2010/02/03/1662546.html 一:Ildasm.exe简介 这一微软VS自带工具, ...
- 计算机组成原理往年试题以及答案(tzf!!!)
计算机组成原理往年试题以及答案(下载链接!!!) 太子妃升职记(1~36) ::http://pan.baidu.com/s/1dDP5Kqd