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. 在内网中OWA第一次访问速度慢的问题

      当网络环境为内网时,有时访问OWA站点一直卡在Office Web App 那里. 这是因为SharePoint有一个证书需要联网检索 此环境为SharePoint 2013 通过下面的三个步骤 ...

  2. 如何排查sharepoint2010用户配置文件同步服务启动问题

    用户配置文件同步服务与 Microsoft Forefront Identity Manager (FIM) 交互,以与外部系统(如目录服务和业务系统)同步配置文件信息.启用用户配置文件同步服务时,将 ...

  3. [javascript svg fill stroke stroke-width x1 y1 x2 y2 line stroke-opacity fill-opacity 属性讲解] svg fill stroke stroke-width stroke-opacity fill-opacity line绘制线条属性讲解

    <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title ...

  4. Android Content Provider基础

    Android Content Provider基础 Content Providers Content providers管理对一个结构化的数据集合的访问.它们封装了数据,并且提供了保护数据安全性的 ...

  5. 听云数据库管理平台NetopGO简介

    ➠更多技术干货请戳:听云博客 断断续续写了将近一个月,听云第一版数据库管理平台终于写完了,期间来来回回的改了好多次小毛病,现在已经部署到生产环境上去了. 在刚开始的时候,后端的数据库集群只有10多个节 ...

  6. 【代码笔记】iOS-对UIView进行截图

    一,效果图. 二,工程图. 三,代码. RootViewController.m #import "RootViewController.h" @interface RootVie ...

  7. C语言中的函数与指针

    1. 为什么需要函数? 函数就是功能的封装. 函数就是为了实现某个功能而编写的一段代码 scanf()    ,  printf() 2.函数优点: 代码更简洁 代码复用 如果业务逻辑变化,只把相应的 ...

  8. mysql 命令行操作入门(详细讲解版)

    之前分享过多次Mysql主题,今天继续分享mysql命令行入门   1. 那么多mysql客户端工具,为何要分享命令行操作? -快捷.简单.方便 -在没有客户端的情况下怎么办 -如果是mysql未开启 ...

  9. MySql安装与MySQL添加用户、删除用户与授权

    1.安装MySql       目前MySQL有两种形式的文件,一个是msi格式,一个是zip格式的.msi格式的直接点击setup.exe就好,按照步骤进行.但是很多人下了zip格式的解压发现没有s ...

  10. spring项目的 context root 修改之后,导致 WebApplicationContext 初始化两次的解决方法

    修改了 spring web 项目的 context root 为 / 之后,在启动项目时,会导致 WebApplicationContext  初始化两次,下面是其初始化日志: 第一次初始化: 四月 ...