码迷,mamicode.com
首页 > 其他好文 > 详细

Stunnel服务端

时间:2016-02-16 23:25:28      阅读:6405      评论:0      收藏:0      [点我收藏+]

标签:

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服务端

标签:

原文地址:http://www.cnblogs.com/justuntil/p/5194049.html

(1)
(2)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!