/ 中存储网

如何给Domino iNotes 服务器配置Apach反向代理

2013-11-03 18:41:01 来源:ITJS.CN

部署背景需求

由于众所周知的安全考虑,不想对公网暴露 Domino http 服务器的地址?

多个 Domino 服务器能不能对外只用一个地址?

在部署 Domino 的情况中,这种需求越来越多。而这些可以通过安装 Apache http 服务器, 把它作为 Domino 的逆向代理(reverse proxy)来实现。

为什么选择 Apache http 服务器

首先,它是一个开源的项目,文档源码都可以参考到。其次,它已经被广泛使用,健壮性有口皆碑。最后,安装配置很简单,在 Windows 上不到 10 分钟就能完成。

逆向代理是 Apache 服务器的一个应用,它处理来自 internet 上客户端的连接请求,然后将请求转发给内部网络上的服务器,并将从内部网络上服务器上得到的结果返回给 internet 上请求连接的客户端。 可参看以下示意图:

图 1. 逆向代理示意图

图 1. 逆向代理示意图

上图中 Apache 逆向代理服务器上没有保存任何网页的真实数据,所有的内容都来来自于在内部的 Domino 服务器上。因此对逆向代理服务器的攻击并不会使得 Domino 服务器上的数据遭到破坏,这样就增强了 Web 服务器的安全性。

实际部署中,通常逆向代理位于防火墙外,Domino 服务器位于防火墙里,能受到防火墙的安全保护。

Apache 逆向代理还可以根据需求配置容许的缓存数据,比如图片。还可以配置动态负载平衡,等等其他一些特性,但这些特性不在本文介绍范围内。

安装 Apache Web 服务器

我们以 Windows 为例。

首先去在 apache 的网站 http://httpd.apache.org/download.cgi 下载一个稳定版 Windows 安装包。下载完后,点击执行安装,一路使用默认的配置,只是在填 host 名字的时候,填上实际安装机器对外的 host 名字,比如我们这里填:bj.cn.ibm.com.

安装完后,窗口右下角会有一个图标 ,这时 apache http 服务器已经自动运行了。尝试打开浏览器,输入 http://dev.cn.ibm.com, 回车,会打开默认的网页,表示 apache 服务器工作正常。

如果是测试配置环境,并没有真正的对外 host 名字,可以在 c:windowssystem32drivesetchosts 里面加上:

ip 地址 hostname

如果机器的 ip 地址是 192.168.0.11,就可以加上如下一行:

192.168.0.11 bj.cn.ibm.com

Hostname 可以是多个。若多个 hostname 实际使用同一个 ip,比如下面就是 2 个 host 共享一个 ip 地址:

192.168.0.11 bj.cn.ibm.com sh.cn.ibm.com

回页首

逆向代理配置

下面我们来看具体怎么和 Domino 服务器结合,配置逆向代理。现在假设我们有 2 台 domino 服务器,他们属于是一个集群(cluster)。

其中一台 host 名字是:inotesBJ.cn.ibm.com

另一台 host 名字是:inotesSH.cn.ibm.com

Apache 服务器就是上面刚刚安装好的。

在配置好后,internet 用户直接使用 bj.cn.ibm.com 来透明访问 inotesBJ.cn.ibm.com; 或者使用 sh.cn.ibm.com 来透明访问 inotesSH.cn.ibm.com。他们实际并不知道 inoteBJ/inotesSH.cn.ibm.com 的存在。

我们知道 Domino Web 服务支持 http 和 htpps 两种方式,https 的逆向代理配置稍微复杂一些,下面先 http 的配置开始。

Http 请求配置

安装好 Apache Web 服务器后,对 http 请求,它默认使用的是 80 端口。而 Domino 默认使用的 http 端口也是 80,所以为了避免冲突,把 domino 的端口改为 8080.(提示一下,这一步可以一并把 Domino https 默认的端口号 443 改为 4433.)

如下图所示:

图 2. 修改 Domino http(s) 默认端口号

图 2. 修改 Domino http(s) 默认端口号

修改结束后,保存,再通过 Admin 控制台,重启一下 http 服务。

接下来打开 apache 应用程序目录,下面有个 conf 子目录,用文本编辑器打开这个目录下的 httpd.conf. 这个文件存放了 Apache 服务器的所有配置信息,为了增加逆向代理支持,我们在文件的末位加上:

Include conf/myproxy.conf

然后在同一个目录下新建一个文件 myproxy.conf,里面加上如下配置。

 LoadModule headers_module modules/mod_headers.so

 LoadModule proxy_module modules/mod_proxy.so

 LoadModule proxy_http_module modules/mod_proxy_http.so

 <VirtualHost *:80>

 ServerName bj.cn.ibm.com

ProxyRequests Off

ProxyPassReverse / http://inotesbj.cn.ibm.com:8080/

<Location / >

ProxyPass http:// inotesbj.cn.ibm.com:8080/

</Location>

 </VirtualHost>

 <VirtualHost *:80>

 ServerName sh.cn.ibm.com

ProxyRequests Off

ProxyPassReverse / http://inotesSH.cn.ibm.com:8080/

<Location / >

ProxyPass http:// inotesSH.cn.ibm.com:8080/

</Location>

 </VirtualHost>

保存一下所做的修改,再重启一下 Apache 服务器。 试着在浏览器里面输入 bj.cn.ibm.com, 就会发现已经进入 inotesbj.cn.ibm.com 的登录界面; 相应的试着输入 sh.cn.ibm.com, 就会发现进入 inotesSH.cn.ibm.com 的登录页面。

很简单,http 的逆向代理就配好了。接下来是 https 的逆向代理配置。

Https 请求配置

1.Https 是基于 SSL 的,这意味着作为逆向代理的 Apache 服务器需要一个 SSL 的证书, 而 Domino 使用的证书是 .kyr 格式的,这种格式 Apache 服务器无法识别。所以需要一个工具将 .kyr 格式转换成 Apache 能读取的证书格式(.cert 和 .key)。然而 Domino 并没有自带的内建命令或者工具能把 .kyr 格式转换成任何其他格式。

所幸 IBM 提供了一个叫 ikeyman 的程序, 它是 IBM http server 和 Websphere 的一部分,用它可以打开 .kyr 文件,然后导出成 .pkcs12 格式。如果没有 IBM http server 和 Websphere,可以从下列 ftp 服务器上下载:ftp://ftp.software.ibm.com/software/lotus/tools/Domino/gsk5-ikeyman.zip

下载完成后,根据 readme 里面描述的步骤,打开 ikeyman(注意,ikeyman 不能在 Win7 64 位上运行),在图形用户界面下,先打开 .kyr 文件,然后通过此程序的 import/Export 按钮,选择把 .kyr 导出成 .pkcs12 格式的文件,后缀为 .p12,这期间需要输入生成 .kyr 时设置的密码。 iKeyman 不能直接导出成 Apache 可读的格式,但 .p12 格式已经是个中间格式了。这里我们把导出文件名叫 server.p12.

2. 从 www.openssl.org上下载 openssl,用以下命令将步骤 1 的 .p12 文件转换成 .cert 和 .key 文件。

openssl pkcs12 -in server.p12 -clcerts -nokeys -out server.cert

openssl pkcs12 -in server.p12 -nocerts -nodes -out server.key转换结束后,拷贝这 2 个文件到 Apache 安装目录下。

3. 下面要修改 myproxy.conf:

首先在前面 http 配置过程新建的 myproxy.conf 中 , 在 loadModule 下面加上如下 2 个 module。

LoadModule ssl_module modules/mod_ssl.so

LoadModule proxy_connect_module modules/mod_proxy_connect.so 再加上增加监听 https 默认端口 443, 如下:

Listen 443

注意,请确保 Domino 已经完成图 2 所示的修改,把 Domino 默认的 SSL 端口改为非 443,如上图为 4433.

4. 接着修改 VirtualHost 部分, SSLCertifcateFile 指向刚刚拷过来的 server.cert 路径,这个路径是相对于 apache 可执行程序的路径。SSLCertifcatekeyFile 指向 server.key 的相对路径。

 <VirtualHost *:443>

 ServerName bj.cn.ibm.com:443

SSLEngine On

SSLCertificateFile conf/ssl/server.cert

SSLCertificateKeyFile conf/ssl/server.key

SSLProxyEngine on

ProxyRequests Off

KeepAlive off

ProxyPassReverse / https://inotesbj.cn.ibm.com:4433/

<Location / >

ProxyPass https://inotesbj.cn.ibm.com:4433/

</Location>

 </VirtualHost>

对于 inotesSH.cn.ibm.com, 重复以上步骤,将它的 .kyr 文件转换成 .cert 和 .key 文件,增加一个 VitualHost 部分,对应填上相应的数据。

5. 最后重启一下 Apache 服务器。试着输入 https://bj.cn.ibm.com,将会出现登陆 intoesbj.ibm.com.cn 的页面,同理对于 sh.cn.ibm.com.

终于 Domino 服务器的 https 逆向代理也配好了。

最好这是一份完整的,仅供参考的 myproxy.conf.

配置清单 :

 #######################################################

 # Before attempting to use your new reverse-proxy

 #

 #  1: Stop the Apache server

 #  2: Start Apache server

 #

 #######################################################

 LoadModule headers_module modules/mod_headers.so

 LoadModule proxy_module modules/mod_proxy.so

 LoadModule proxy_http_module modules/mod_proxy_http.so

 LoadModule rewrite_module modules/mod_rewrite.so

 LoadModule ssl_module modules/mod_ssl.so

 LoadModule proxy_connect_module modules/mod_proxy_connect.so

 CookieLog logs/cookies.log

 Listen 443

 <IfModule ssl_module>

SSLMutex default

SSLRandomSeed startup builtin

SSLRandomSeed connect builtin

SSLSessionCache none

 </IfModule>

 <VirtualHost bj.cn.ibm.com:443>

 ServerName bj.cn.ibm.com:443

SSLEngine On

SSLCertificateFile conf/ssl/server.cert

SSLCertificateKeyFile conf/ssl/server.key

SSLProxyEngine on

ProxyRequests Off

<Proxy *>

Order deny,allow

Allow from 127.0.0.1

</Proxy>

KeepAlive off

ProxyPassReverse / https://inotesbj.cn.ibm.com:4433/

ProxyPassReverseCookieDomain inotesbj.cn.ibm.com .cn.ibm.com

<Location / >

ProxyPass https:// inotesbj.cn.ibm.com:4433/

</Location>

 </VirtualHost>

 <VirtualHost sh.cn.ibm.com:443>

 ServerName sh.cn.ibm.com:443

SSLEngine On

SSLCertificateFile conf/ssl/server2.cert

SSLCertificateKeyFile conf/ssl/server2.key

SSLProxyEngine on

ProxyRequests Off

<Proxy *>

Order deny,allow

Allow from 127.0.0.1

</Proxy>

KeepAlive off

ProxyPassReverse / https://inotessh.cn.ibm.com:4433/

ProxyPassReverseCookieDomain inotessh.cn.ibm.com .cn.ibm.com

<Location / >

ProxyPass https:// inotessh.cn.ibm.com:4433/

</Location>

 </VirtualHost>

 <VirtualHost bj.cn.ibm.com:80>

 ServerName bj.cn.ibm.com:80

ProxyRequests Off

ProxyPassReverse / http:// inotesbj.cn.ibm.com:8080/

<Location / >

ProxyPass http:// inotesbj.cn.ibm.com:8080/

</Location>

 </VirtualHost>

 <VirtualHost sh.cn.ibm.com:80>

 ServerName sh.cn.ibm.com:80

ProxyRequests Off

ProxyPassReverse / http:// inotessh.cn.ibm.com:8080/

<Location / >

ProxyPass http:// inotessh.cn.ibm.com:8080/

</Location>

 </VirtualHost>

回页首

总结

通过使用 Apache 逆向代理来对外提供 Domino 的 Web 服务功能,是一个很不错的安全选择,实施的代价很小,而得到的功能是很多企业想要的。这样即使有黑客攻破了 Apache 服务器,也获取不了任何有价值的数据,因为所有的数据都在企业的局域网内的 Domino 服务器上。

本文提供了一个配置的入门级介绍,希望它能作为一个开始,给更多的人一个参考和借鉴。