进入公司的第一个任务就是配置一个DMZ,鉴于自己完全是个网络小白,对文中涉及的很多概念理解比较肤浅,如有不妥欢迎指正。
废话不多说,首先规划一下本文的行文思路:
DMZ为DeMilitarized Zone的缩写,中文直译为非军事化区域。作用是把WEB, E-mail等允许外部访问的服务器单独接在该区端口,使整个需要保护的内部网络接在信任区端口后,不允许任何访问,实现内外网分离,达到用户需求。DMZ可以理解为一个不同于外网或内网的特殊网络区域,DMZ内通常放置一些不含机密信息的公用服务器,比如Web、Mail、FTP等。这样来自外网的访问者可以访问DMZ中的服务,但不可能接触到存放在内网中的公司机密或私人信息等,即使DMZ中服务器受到破坏,也不会对内网中的机密信息造成影响。DMZ通常是一个过滤的子网,DMZ在内部网络和外部网络之间构造了一个安全地带。
在这里有一段视频,可以很直观得看到DMZ究竟是什么,实现了什么样的功能:What is DMZ.
DMZ是架设在服务器与客户端之间的一个中间媒介,出于网络安全因素的考虑,在Firewall控制下不是所有的端口都能够允许被外网自由访问。此图中Corporate network中开放了https端口号443和http端口号80,而Automation network开放了端口102,它的作用是负责semantic communication。Automation network与Corporate network之间无法通过端口直接互联,这正是防火墙所要起到的保证网络安全的作用。
为了让两个网络之间能够安全互联,DMZ起到了一个中间服务器的作用。Corporate network和Automation network可以把无安全隐患的信息放置到DMZ数据库上提供给外网访问。
实现DMZ的方式之一就是使用apache配置反向代理实现DMZ的功能。下面仍然先简要介绍一下什么是反向代理。
维基百科上的解释如下:
In computer networks, a reverse proxy is a type of proxy server that retrieves resources on behalf of a client from one or more servers. These resources are then returned to the client as though they originated from the proxy server itself. While a forward proxy acts as an intermediary for its associated clients to contact any server, a reverse proxy acts as an intermediary for its associated servers to be contacted by any client.
Fig: A reverse proxy taking requests from the Internet and forwarding them to servers in an internal network. Those making requests to the proxy may not be aware of the internal network.
借用这里的解释:
1.正向代理的概念
正向代理 是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
2.反向代理的概念
反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。
简单的区别方法:正向代理就是我们在浏览器可以设置的代理服务器,主动权在浏览者手里。比如我们有时候要查阅一些资料,被国内墙掉了,这时候我可以在国外的服务器上搭建一个nginx正向代理服务器,然后我们就可以通过浏览器设置代理服务器,来了。反向代理,是浏览者不知情的,服务器端自己假设的。
科普结束,开始正题。
这个在网上可以搜索到不少教程,apache2的环境搭建也通常是为了支持客户端访问服务器上的网页。在查找的过程中发现了几个标准的配置模式,比如LAMP (Linux, Apache, MySQL, PHP)。由于一个个配置搭建比较麻烦,因此我直接选择了套件一次安装。
首先,LAMP概念:
Linux+Apache+Mysql+Perl/PHP/Python,一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。
安装LAMP就已经安装了:网页服务器、数据库、Perl/PHP/Python语言环境。
安装过程很简单:
如果你是安装到本机上测试的话,最好确保hosts的内容为这样:
username@ubuntu:~$ cat /etc/hosts
127.0.0.1 localhost
在命令行中输入
sudo tasksel
用空格选中LAMP,回车即可。(不过要小心别修改其他的选项,否则会安装或删除该服务!)如果出现tasksel aptitude failed (100)错误,需要先更新源包 sudo apt-get update。
安装之后在浏览器中输入:http://localhost或者http://127.0.0.1,如果能够看到It works!的页面,说明安装成功了。
小插曲:我的Ubuntu是用Mac远程连接到的服务器上创建的一个虚拟机,没有用户图形界面。为了能够显示用户图形界面,我尝试了VNC。它需要先使用命令行在ubuntu上安装一个vnc server,然后再在本机(Mac)上安装一个vnc,chicken of the VNC是一个常用的软件。然而虚拟机所在的服务器没有开用户图形界面,还要修改配置。于是在master建议下就使用命令行吧。另外还知道了两个现在似乎比较先进友好的跨平台开发环境,ansible和vagrant,以后有机会可以了解一下。
替代策略:需要打开网页的时候用了一个古老的命令行网页浏览器lynx,它可以在终端显示非图形化界面的网页,而需要下载的安装包则由本地下载后使用scp命令远程复制到ubuntu虚拟机上。
这一步骤主要是参照了How To Use Apache HTTP Server As Reverse-Proxy Using mod_proxy Extension 的教程完成的,不过里面对于SSL的配置不甚详细,在此再把流程理一遍。
配置反向代理主要用到了apache中的mod_proxy模块。
modproxy is the Apache module for redirecting connections (i.e. a gateway, passing them through). It is enabled for use just like any other module and configuration is pretty basic (or standard), in line with others. modproxy is not just a single module but a collection of them, with each bringing a new set of functionality.
里面包含的模块有:
首先,更新操作系统:
aptitude update
aptitude -y upgrade
获取必要的build tool:build-essential package:
aptitude install -y build-essential
设置apache的代理链接:
a2enmod
在出现的输入框中输入以下模块名:
proxy proxy_ajp proxy_http rewrite deflate headers proxy_balancer proxy_connect proxy_html
也可以依次进行设置:
a2enmod proxy
a2enmod proxy_http
a2enmod proxy_ajp
a2enmod rewrite
a2enmod deflate
a2enmod headers
a2enmod proxy_balancer
a2enmod proxy_connect
a2enmod proxy_html
apache的配置文件位于/etc/apache2/sites-enabled路径下,默认为default-000.conf。
使用下面的命令修改:(也可以用vi或者vim)
nano /etc/apache2/sites-enabled/000-default.conf
我们使用mod_virtualhost和mod_proxy来代理虚拟host,语法如下:
<VirtualHost *:*>
ProxyPreserveHost On
# Servers to proxy the connection, or;
# List of application servers:
# Usage:
# ProxyPass / http://[IP Addr.]:[port]/
# ProxyPassReverse / http://[IP Addr.]:[port]/
# Example:
ProxyPass / http://0.0.0.0:8080/
ProxyPassReverse / http://0.0.0.0:8080/
ServerName localhost
</VirtualHost>
具体的解释可以查阅apache官网上的documentation。
参考了教程:How To Create a SSL Certificate on Apache for Ubuntu 14.04。
首先,激活SSL module:
sudo a2enmod ssl
配置完成后,重启apache:
service apache2 restart
创建一个自定义的SSL证书:
首先,我们创建一个路径存储SSL证书:
sudo mkdir /etc/apache2/ssl
通过命令行设置生成一个证书:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt
简单的解释:
回车键之后,会需要回答一系列问题。举个例子:
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Your Company
Organizational Unit Name (eg, section) []:Department of Kittens
Common Name (e.g. server FQDN or YOUR name) []:your_domain.com
Email Address []:your_email@domain.com
在上面的配置文件中加入这样三句:
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/apache.crt
SSLCertificateKeyFile /etc/apache2/ssl/apache.key
重启apache:
service apache2 restart
在我重启之后还遇到了不能正确显示页面的问题,后来参见了这里,再添加了如下设置解决问题。但是似乎不是从根本上解决问题的办法,有待考量:
SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
总结一下,本次配置中还知道了一些debug的技能,比如MacBook上view->developer->Developer Tools的选项可以看到网页链接的过程。查看apache中的error log文件针对性的解决问题是另一个办法。
网页http状态code的意义:http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
证书的类型解释:https://help.ubuntu.com/12.04/serverguide/certificates-and-security.html
apache2.2中文手册中的一些例子:http://apache.jz123.cn/mod/mod_proxy.html
PERC正则表达式语法:http://php.net/manual/zh/reference.pcre.pattern.syntax.php