用Docker+Davmail换掉你的Outlook

云计算
作者从头介绍了如何在Ubuntu系统下安装Docker到使用Upstart工具配置一个Davmail服务器的全过程。每一步都配有图文,详尽易懂。对使用Docker配置邮件服务器的读者很有价值。

简介

不管你喜欢还是不喜欢,有时候不得不通过Exchange服务器去收发邮件,但是如果你不喜欢微软系的邮件客户端(指Outlook),就会给你带来一定的不便,因为你可能更倾向于在兼容模式下,通过IMAP收取、SMTP发送您的邮件。

...好吧,这正是davmail出现的原因。

davmail是一个Java应用程序,它能在标准兼容的客户端与Exchange服务器之间建立连接,这是一个非常棒的工具-这也是唯一的解决方案。它还是单机的,可以无状态的使用,更有意思的是Java让它非常适合运行在Docker容器里面。

目标

把Docker安装在CenturyLink的云主机上,获取一个无状态的运行davmail的容器镜像,然后让系统通过upstart来管理容器。

附加说明

如何获取一台CenturyLink云主机就作为一项练习留给读者。

为了简单,我们在Ubuntu平台使用docker.io包来安装docker,然后手动配置它;当然你还可以使用一种更方便的方式即通过puppet-git-receiver和docker Puppet Forge module这两个工具来管理Docker安装包和容器关于upstart的配置,关于这两个工具的使用会在以后的教程中讲述。

安全是我们最关心的问题,尤其是在一个企业的环境中,所以请注意你的本地的工作站与云主机之间的连接是否安全。常见的和行之有效的方法包括ssh端口转发和使用stunnel(一个不是那么随意与方便(ad-hoc)的方法)。

无论你个人的邮件有多么不重要,也不要以明文的方式收取他们,因为这样会影响到整个邮件服务器的安全,从而波及其他人。

前期准备

出于这篇文章的考虑,我们假设你已经做好了充分的准备,已经运行了一台基于Ubuntu-14.04的云主机;如果没有,请接着往下读你可以非常容易的启动一台Ubuntu机器,然后安装Vagrant v1.6.x+和VirtualBox并进行相关配置,我的前一篇关于Chef和Vagrant的教程会提供一些指导,这又是给读者留下的一个练习。

好了,准备好了吗,让我们开始吧!

安装Docker

我们从Ubuntu上从安装docker开始:

  1. root@trusty:~# apt-get install docker.io 
  2. Reading package lists... Done 
  3. Building dependency tree 
  4. Reading state information... Done 
  5. The following extra packages will be installed: 
  6. aufs-tools cgroup-lite 
  7. Suggested packages: 
  8. btrfs-tools debootstrap lxc rinse 
  9. The following NEW packages will be installed: 
  10. aufs-tools cgroup-lite docker.io 
  11. 0 upgraded, 3 newly installed, 0 to remove and 15 not upgraded. 
  12. Need to get 4,207 kB of archives. 
  13. After this operation, 25.0 MB of additional disk space will be used. 
  14. Do you want to continue? [Y/n] 
  15. Get:1 http://archive.ubuntu.com/ubuntu/ trusty/universe aufs-tools amd64 1:3.2+20130722-1.1 [92.3 kB] 
  16. Get:2 http://archive.ubuntu.com/ubuntu/ trusty-updates/universe docker.io amd64 1.0.1~dfsg1-0ubuntu1~ubuntu0.14.04.1 [4,111 kB] 
  17. Get:3 http://archive.ubuntu.com/ubuntu/ trusty/main cgroup-lite all 1.9 [3,918 B] 
  18. Fetched 4,207 kB in 8s (480 kB/s) 
  19. Selecting previously unselected package aufs-tools. 
  20. (Reading database ... 61703 files and directories currently installed.) 
  21. Preparing to unpack .../aufs-tools_1%3a3.2+20130722-1.1_amd64.deb ... 
  22. Unpacking aufs-tools (1:3.2+20130722-1.1) ... 
  23. Selecting previously unselected package docker.io. 
  24. Preparing to unpack .../docker.io_1.0.1~dfsg1-0ubuntu1~ubuntu0.14.04.1_amd64.deb ... 
  25. Unpacking docker.io (1.0.1~dfsg1-0ubuntu1~ubuntu0.14.04.1) ... 
  26. Selecting previously unselected package cgroup-lite. 
  27. Preparing to unpack .../cgroup-lite_1.9_all.deb ... 
  28. Unpacking cgroup-lite (1.9) ... 
  29. Processing triggers for man-db (2.6.7.1-1) ... 
  30. Processing triggers for ureadahead (0.100.0-16) ... 
  31. Setting up aufs-tools (1:3.2+20130722-1.1) ... 
  32. Setting up docker.io (1.0.1~dfsg1-0ubuntu1~ubuntu0.14.04.1) ... 
  33. Adding group `docker' (GID 114) ... 
  34. Done. 
  35. docker.io start/running, process 2353 
  36. Setting up cgroup-lite (1.9) ... 
  37. cgroup-lite start/running 
  38. Processing triggers for libc-bin (2.19-0ubuntu6.3) ... 
  39. Processing triggers for ureadahead (0.100.0-16) ... 

在安装日志的第33行(注:Adding group `docker' (GID 114) ...这行),我们看到系统创建了一个docker用户组;值得一提的是,如果把用户加入到这个“docker用户组”后,此后再通过命令行与docker服务(或者说是进程)交互的时候就不用每次在命令前面加sudo了,这同样作为一个练习留给读者。

#p#

创建或者挑选我们需要的镜像

在Docker hub中有一些可用的davmail镜像,我们选择镜像rsrchboy/davmail-savvis-docker(https://registry.hub.docker.co ... file/)理由很简单,它是一个配置好了的davmail容器:

  • 他不需要挂载/绑定其他任何资源,也不需要挂载外部的数据卷(volume);
  • 他是单机运行的 ;
  • 没有以root身份运行。

你可能需要根据Exchange的运行环境与配置来修改此镜像(rsrchboy/davmail-savvis-docker)中davmail的配置;如果是这样的话,你就可以把此镜像作为一个基础;把对配置的修改叠加(ADD)到它之上,然后保存成一个新的镜像,再在新镜像的基础上重新构建davmail服务。

下面是该镜像的Dockerfile:

  1. # This software is Copyright (c) 2014 by Chris Weyl <christopher.weyl@centurylink.com> 
  2. (That is, effectively by CenturyLinkLabs.) 
  3. This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 
  4. International License (CC-BY-SA-4.0). 
  5. http://creativecommons.org/licenses/by-sa/4.0/ 
  6. FROM gimoh/davmail:latest 
  7. MAINTAINER Chris Weyl <christopher.weyl@centurylink.com> 
  8.  
  9. RUN mkdir /etc/davmail 
  10. ADD davmail.properties /etc/davmail/ 
  11. add a non-root system user 
  12. note we specify a id so as to try to avoid collisions on the host 
  13. RUN adduser --system --uid 500 --group --home /var/lib/davmail davmail 
  14. RUN chmod 0644 /etc/davmail/* 
  15. ...and use it! 
  16. USER davmail 
  17. override default entry point as we've supplied a config 
  18. ENTRYPOINT ["/usr/local/davmail/davmail.sh""/etc/davmail/davmail.properties"

实在是迫不及待了,我们先试运行一下:

  1. root@trusty:~# docker run rsrchboy/davmail-savvis-docker 
  2. 2014-09-26 18:37:32,226 INFO [main] davmail - DavMail Gateway 4.5.0-2292 listening on SMTP port 1025 POP port 1110 IMAP port 1143 CALDAV port 1080 LDAP port 1389  

配置容器,通过upstart让容器像系统服务一样运行

upstart是类unix系统中的一种服务管理方式,最近的Ubuntu发行版本已经默认采用upstart来管理系统服务了,它可以非常方便的实现我们的要求。

  1. Originally created by Gareth Rushgrove's puppetforge docker module 
  2. description "start and stop corporate-davmail in docker" 
  3. author "Chris Weyl <christopher.weyl@centurylink.com>" 
  4.  
  5. start on (started docker.io) 
  6. stop on stopping docker.io 
  7.  
  8. setuid root 
  9.  
  10. respawn 
  11. respawn limit 5 20 
  12.  
  13.  
  14. script 
  15. docker run --cidfile=/var/run/docker-corporate-davmail.cid \ 
  16. -p 127.0.0.1:11025:1025 \ 
  17. -p 127.0.0.1:11110:1110 \ 
  18. -p 127.0.0.1:11143:1143 \ 
  19. -p 127.0.0.1:11080:1080 \ 
  20. -p 127.0.0.1:11389:1389 \ 
  21. --net bridge \ 
  22. -m 0 \ 
  23. rsrchboy/davmail-savvis-docker \ 
  24. && 
  25. exec docker wait "$(cat /var/run/docker-corporate-davmail.cid)" 
  26. end script 
  27.  
  28.  
  29. post-stop script 
  30. if [ -e "/var/run/docker-corporate-davmail.cid" ]; then 
  31. docker kill "$(cat /var/run/docker-corporate-davmail.cid)" && \ 
  32. rm "/var/run/docker-corporate-davmail.cid" 
  33. fi 
  34. end script 
  35. vim: set ft=upstart : 

在这里我们要注意的关于upstart配置项如下(配置文件):

  • 声明docker.io服务的依赖项(6-7行)
  • 声明服务在异常终止时要重启服务(11行)还有建立安全的限定(12行)
  • 声明如何启动(15-27行)和关闭(30-35行)服务

毋庸置疑,upstart配置中最核心的还是在docker run命令。

  1. docker run --cidfile=/var/run/docker-corporate-davmail.cid \ 
  2. -p 127.0.0.1:11025:1025 \ 
  3. -p 127.0.0.1:11110:1110 \ 
  4. -p 127.0.0.1:11143:1143 \ 
  5. -p 127.0.0.1:11080:1080 \ 
  6. -p 127.0.0.1:11389:1389 \ 
  7. --net bridge \ 
  8. -m 0 \ 
  9. rsrchboy/davmail-savvis-docker 

在日志中我们看到,Docker的端口转发已经建立,davmail监听的端口有:

  1. SMTP port 1025 
  2. POP port 1110 
  3. IMAP port 1143 
  4. CALDAV port 1080 
  5. LDAP port 1389 

这里要记得 类unix系统中non-privliged的进程是无法启动小于1024的端口的,所以我们重新做了映射。

我们告诉docker在云主机也就是宿主机上绑定端口时,只绑定大于10000的端口,且只绑定在loopback上。

这样,当你要访问IMAP时,你就可以再云主机上通过127.0.0.1:11143访问,这样就可以阻止攻击者远程的连接你的davmail进行攻击。

现在我们已经有了一个upstart配置文件,剩下就是如果安装这个文件了,就是把他复制到/etc/init下,然后启动服务:

  1. root@trusty:~# cp docker-corporate-davmail.conf /etc/init/ 
  2. root@trusty:~# service docker-corporate-davmail status 
  3. docker-corporate-davmail stop/waiting 
  4. root@trusty:~# service docker-corporate-davmail start 
  5. docker-corporate-davmail start/running, process 4149 
  6. root@trusty:~# docker ps 
  7. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
  8. 7f93d3b35b60 rsrchboy/davmail-savvis-docker:latest /usr/local/davmail/d 3 seconds ago Up 2 seconds 127.0.0.1:11025->1025/tcp, 127.0.0.1:11080->1080/tcp, 127.0.0.1:11110->1110/tcp, 127.0.0.1:11143->1143/tcp, 127.0.0.1:11389->1389/tcp kickass_mestorf 

这个容器是无状态的,它只是在标准的客户端和Exchange之间做一个转译(translate),你可以对容器进行启动,关闭,终止,禁用,启用等操作;现在davmail容器安全的运行在云主机里面,你不用有其他担心,除非客户端到服务器的连接中断。因此,我们解决了复杂的问题同时,还节省了我们成把的时间。

享受的时刻

到目前为止,你的davmail已经运行在容器里面了,通过正确的端口映射配置,现在你可以选择你喜欢的客户端去跟Exchange server 通信收发邮件了!davmail建议的客户端是pine,当然这只是个建议而已。

原文链接:http://dockerone.com/article/91

责任编辑:Ophira 来源: dockerone
相关推荐

2018-10-30 11:19:33

智能破解安全

2017-07-21 09:48:34

SnackBarToastGoogle

2021-04-02 07:58:36

LogbackLog4j2日志

2022-05-02 17:08:50

芯片苹果高通

2022-03-02 10:13:01

SELinux开源

2011-09-20 09:51:13

2018-11-28 14:54:15

iPhone苹果手机

2020-08-23 18:06:45

Python 开发Docker

2021-04-17 15:11:36

开源VeraCrypt加密文件

2012-12-19 20:07:31

markdown

2012-12-19 20:20:32

markdown

2022-06-19 14:13:29

tmateLinux

2020-04-15 11:00:24

ChezmoiLinux

2015-07-27 08:58:29

NAS云存储非结构化数据存储

2012-12-19 20:14:20

markdown

2012-12-19 20:18:54

markdown

2012-12-19 20:15:51

markdown

2022-01-27 15:37:34

Asciinema终端会话记录器开源

2023-06-08 17:20:37

Lua树莓派

2021-02-05 15:50:27

PythonShell命令
点赞
收藏

51CTO技术栈公众号