Stunnel服务端
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
# 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 []:[email protected]
命令运行完毕,公钥和密钥就都在一个文件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服务端的主要内容,如果未能解决你的问题,请参考以下文章