在ejabberd中可以支持多个domain,我讲一下我的配置过程
我的ejabberd系统是:ejabberd server+sql server+openldap+gateway.
我总共使用了5台机器,用两台机器组成了ejabberd cluster,另外3台机器分别做sql server,openldap server和gateway。
gateway机器上可以安装多个不同的gateway软件,这样我们就可以同时使用多种服务,如icq,aim,msn,yahoo通等等。
我是在公司做的,sql server,openldap server和gateway能不能放到一台机器上,我没有试过。
我设置了两个domain:im.yourcompany.com, im2.yourcompany.com.
设置两个domain的目的是将不同的用户群分开管理,不同用户群的用户之间还是可以互通。比如说我有两个产品im和im2,我想把使用im和im2的用户分开管理,就可以使用
两个domain对用户进行区分,guest@im.yourcompany.com是使用im的用户,而guest@im2.yourcompany.com是使用im2的用户。
具体的用户管理是用openldap进行的,它设置了两个数据库,分别对应两个domain。
我是在fedora 6下进行安装和配置的,按我的方法在其他版本下可能会有问题,具体问题具体分析吧
而且只是针对多个domain的设置,不是完整的ejabberd系统设置。
写的比较乱,有些东西是第一次接触,可能有些错误,大家凑合着看吧。
ejabberd,sql server,openldap的具体安装过程我就不说了。
(一)openldap设置
先讲下openldap的设置,找到slapd.conf文件,打开这个文件,找到这一段
database bdb
suffix "dc=my-domain,dc=com"
rootdn "cn=Manager,dc=my-domain,dc=com"
# Cleartext passwords, especially for the rootdn, should
# be avoid. See slappasswd(8) and slapd.conf(5) for details.
# Use of strong authentication encouraged.
rootpw secret
我们把它改为
database bdb
suffix "dc=im,dc=yourcompany,dc=com"
rootdn "cn=Manager,dc=im,dc=yourcompany,dc=com"
rootpw password
directory /usr/local/var/openldap-data
database bdb
suffix "dc=im2,dc=yourcompany,dc=com"
rootdn "cn=Manager2,dc=im2,dc=yourcompany,dc=com"
rootpw password
directory /usr/local/var/openldap-data2
我设置了两个ldap的database
database bdb 是数据库的一种类型,还可以设成其他类型
suffix 根据domain分别设为"dc=im,dc=yourcompany,dc=com"和 "dc=im2,dc=yourcompany,dc=com"
rootdn 是database的管理用户
rootpw rootdn的密码
directory 存放openldap数据的文件夹,为两个database分别设置不同的文件夹,否则会出错,这两个文件夹是自己创建的。
这样slapd.conf文件就设置完了,启动openldap
然后我们新建4个文件,root.ldif,root2.ldif,users.ldif和users2.ldif
root.ldif
dn: dc=im,dc=yourcompany,dc=com
objectclass: dcObject
objectclass: organization
o: yourcompany
dc: im
root2.ldif
dn: dc=im2,dc=yourcompany,dc=com
objectclass: dcObject
objectclass: organization
o: yourcompany
dc: im2
admin.ldif
dn: uid=admin,dc=im,dc=yourcompany,dc=com
mail: admin@163.com
userPassword: adminpassword
uid: admin
accountStatus: Activated
objectClass: top
objectClass: person
sn: admin
cn: admin
im2admin.ldif
dn: uid=im2admin,dc=im2,dc=yourcompany,dc=com
mail: im2admin@163.com
userPassword: im2adminpassword
uid: im2admin
accountStatus: Activated
objectClass: top
objectClass: person
sn: im2admin
cn: im2admin
接着进行添加
ldapadd -x -D “cn=Manager,dc=im,dc=yourcompany,dc=com” -W -f root.ldif
ldapadd -x -D “cn=Manager,dc=im,dc=yourcompany,dc=com” -W -f admin.ldif
ldapadd -x -D “cn=Manager2,dc=im2,dc=yourcompany,dc=com” -W -f root2.ldif
ldapadd -x -D “cn=Manager2,dc=im2,dc=yourcompany,dc=com” -W -f im2admin.ldif
admin和im2admin分别是两个domain的管理用户,通过以上的操作我们就为2个domain分别添加了管理用户并设置了密码,用这种方法你还可以添加其它用户。
ok,openldap设置完毕,可以用ldapsearch命令查找你刚才添加的用户是否存在。
(二)ejabberd server中的设置
首先在ejabberd.cfg中找到
{acl, admin, {user, "admin"}}.
这是设置ejabberd的管理用户名,因为有两个domain,需要设置两个admin的user,即可设为:
{acl, admin, {user, "imadmin"}}.
{acl, admin, {user, "im2admin"}}.
imadmin和im2admin就是前面我们在openldap中添加的管理用户。
admin用户要有配置的权限,所以设置:
{access, configure, [{allow, admin}]}.
然后加入两个domain
% Host name:
{hosts, ["im.yourcompany.com","im2.yourcompany.com"]}.
对两个domain分别进行配置
%% Anonymous login support:
%% auth_method: anonymous
%% anonymous_protocol: sasl_anon|login_anon|both
%% allow_multiple_connections: true|false
{host_config, "im.yourcompany.com", [{auth_method, [odbc,ldap]},
{ldap_servers,["192.168.0.10"]},
{ldap_uidattr,"sn"},
{ldap_base,"dc=im,dc=yourcompany,dc=com"},
{ldap_rootdn,"cn=Manager,dc=im,dc=yourcompany,dc=com"},
{ldap_password,"password"},
{odbc_server, "DSN=ejabberd;UID=odbcuser;PWD=odbcpassword"}]}.
{host_config, "im2.yourcompany.com", [{auth_method, [odbc,ldap]},
{ldap_servers,["192.168.0.10"]},
{ldap_uidattr,"sn"},
{ldap_base,"dc=im2,dc=yourcompany,dc=com"},
{ldap_rootdn,"cn=Manager2,dc=im2,dc=yourcompany,dc=com"},
{ldap_password,"password"},
{odbc_server, "DSN=ejabberd;UID=odbcuser;PWD=odbcpassword"}]}.
其中auth_method是认证的方法,我们用odbc和ldap进行验证,192.168.0.10是openldap server的ip,根据自己的情况设置。
ldap_base是openldap中存储用户帐号的地方,ldap_rootdn是openldap的rootdn,ldap_password是rootdn的密码,这些都在前面openldap中设置好了。
odbc_server是odbc的服务器,后面的配置与odbc的配置文件中相同。
监听端口的设置
% Listened ports:
{listen,
[{5222, ejabberd_c2s, [{access, c2s}, {shaper, c2s_shaper},
{max_stanza_size, 65536},
starttls_required, {certfile, "/etc/ejabberd/im.yourcompany.com.pem"}]},
{5223, ejabberd_c2s, [{access, c2s},
{max_stanza_size, 65536},
tls, {certfile, "/etc/ejabberd/im.yourcompany.com.pem"}]},
% Use these two lines instead if TLS support is not compiled
%{5222, ejabberd_c2s, [{access, c2s}, {shaper, c2s_shaper}]},
%{5223, ejabberd_c2s, [{access, c2s}, ssl, {certfile, "./im.yourcompany.com.pem"}]},
{5269, ejabberd_s2s_in, [{shaper, s2s_shaper},
{max_stanza_size, 131072}
]},
{5280, ejabberd_http, [http_bind, web_admin]},
{5390, ejabberd_service, [{host, "icq.im.yourcompany.com",[{password, "secret"}]}]},
{5391, ejabberd_service, [{host, "icq.im2.yourcompany.com",[{password, "secret"}]}]},
{5392, ejabberd_service, [{host, "aim.im.yourcompany.com",[{password, "secret"}]}]},
{5393, ejabberd_service, [{host, "aim.im2.yourcompany.com",[{password, "secret"}]}]},
{5395, ejabberd_service, [{host, "msn.im.yourcompany.com",[{password, "secret"}]}]},
{5396, ejabberd_service, [{host, "msn.im2.yourcompany.com",[{password, "secret"}]}]},
{5397, ejabberd_service, [{host, "yahoo.im.yourcompany.com",[{password, "secret"}]}]},
{5398, ejabberd_service, [{host, "yahoo.im2.yourcompany.com",[{password, "secret"}]}]}
]}.
端口5222监听c2s连接,使用STARTTLS,5223也是监听c2s连接,不过使用老的ssl。
5269监听s2s连接,5280监听http请求,通过5280可以使用web进行管理。
5390-5398监听icq,aim,msn,yahoo服务。经我测试,host后面的hostname应该是唯一且不可改,
如icq.im.yourcompany.com,icq表明是icq服务,im.yourcompany.com区分用户群,表示im的用户,因此要设置两个端口,分别进行监听,如不设置5391,im2的用户将无法使用icq服务。
模块设置
% Used modules:
{modules,
[
{mod_register, [{access, register}]},
{mod_roster_odbc, []},
{mod_privacy, []},
{mod_adhoc, []},
{mod_configure, []}, % Depends on mod_adhoc
{mod_configure2, []},
{mod_disco, []},
{mod_stats, []},
{mod_offline_odbc, []},
{mod_announce, [{access, announce}]}, % Depends on mod_adhoc
{mod_private, []},
{mod_irc, []},
{mod_vcard_odbc, []},
{mod_muc, [{access, muc},
{access_create, muc},
{access_admin, muc_admin}]},
{mod_pubsub, [{access_createnode, pubsub_createnode}]},
{mod_time, []},
{mod_last_odbc, []},
% {mod_http_bind, []},
{mod_version, []}
]}.
以上是公共模块
% Add modules :
{host_config, "im2.yourcompany.com", [{{add, modules}, [
{mod_echo, [{host, "echo.im.yourcompany.com"}]}
]}]}.
{host_config, "im2.yourcompany.com", [{{add, modules}, [
{mod_echo, [{host, "echo.im2.yourcompany.com"}]}
]}]}.
以上是添加各自的模块
(三)gateway设置
client我是用的spark,一个开源的客户端软件,下面是它的网址
http://www.igniterealtime.org/projects/spark/index.jsp
它其实是一个客户端的平台,可以添加自己的用户,还可以将icq,msn,yahoo messenger等服务集成到一起,它们底层的通信协议都是一样的,通过安装和设置gateway软件,将它们集成到一起。
以icq为例,安装的是pyicq-t-0.8a.tar.gz
假设pyicq是你的安装目录
修改 pyicq/src/main.py中的
import signal
signal.signal(signal.SIGHUP, reloadConfig)
# Load scripts for PID and daemonizing
# from twisted.scripts import twistd
try:
from twisted.scripts import _twistd_unix as twistd
except:
from twisted.scripts import twistd
复制config.example.xml为config.xml
打开config.xml,设置:
<jid> icq.im.yourcompany.com</jid>
<spooldir>/usr/local/gateway/spool</spooldir> spool文件夹的路径,自己设置
<mainServer>192.168.1.2</mainServer> 你的ejabberd server的ip
<secret>secret</secret> 密码
<port>5390</port> icq的监听端口
这个与ejabberd.cfg中的设置对应,即
{5390, ejabberd_service, [{host, "icq.im.yourcompany.com",[{password, "secret"}]}]},
{5391, ejabberd_service, [{host, "icq.im2.yourcompany.com",[{password, "secret"}]}]},
{5392, ejabberd_service, [{host, "aim.im.yourcompany.com",[{password, "secret"}]}]},
{5393, ejabberd_service, [{host, "aim.im2.yourcompany.com",[{password, "secret"}]}]},
{5395, ejabberd_service, [{host, "msn.im.yourcompany.com",[{password, "secret"}]}]},
{5396, ejabberd_service, [{host, "msn.im2.yourcompany.com",[{password, "secret"}]}]},
{5397, ejabberd_service, [{host, "yahoo.im.yourcompany.com",[{password, "secret"}]}]},
{5398, ejabberd_service, [{host, "yahoo.im2.yourcompany.com",[{password, "secret"}]}]}
然后启动icq的网关:python PyICQt.py
这样im.yourcompany.com的用户可以应用icq服务了
gateway知道了server的ip和port,这样它就可以与服务器建立连接
要使im2.yourcompany.com的用户也应用icq服务,新建pyicq2目录,重新解压安装icq到pyicq2目录
main.py的配置与上面的一样,config.xml设置如下:
<jid> icq.im2.yourcompany.com</jid>
<spooldir>/usr/local/gateway/spool</spooldir> spool文件夹的路径,自己设置
<mainServer>192.168.1.2</mainServer> 你的ejabberd server的ip
<secret>secret</secret> 密码
<port>5391</port> icq的监听端口
与ejabberd.cfg中的设置对应
然后启动gateway,ok
以上是icq gateway的设置和启动,其它的大同小异
不过我在设置msn的时候遇到了一点问题,msn的gateway装好以后,登录spark,提示消息连不上msn服务器,failure with no framework。查了一些资料,在config.xml文件中<host>.....</host>项,默认设为本机<host>127.0.0.1</host>,本机如果处于NAT后的,设为127.0.0.1就会连不上服务器,将其改为你的公网IP地址。可以用 telnet messenger.hotmail.com 1863进行测试你的内网地址能否连上msn服务器。
有时候会登录的时候会提示没有注册,not registered .....什么的,这个跟你的spooldir的设置有关,更改spool的路径后,原来添加的用户找不到它的信息,就会提示没有注册,比较笨的方法是把原来的用户删除,再登录以下就行了。
另外,好像msn的gateway在一台机器上只能启动一个,所以在一台机器上没法监听2个msn服务的端口,这个可能跟它的python程序有关,具体我也不知道。
ejabberd的双domain系统就设置完了,最后需要在客户端的机器,也就是你登录的机器上的/etc/hosts中加入
192.168.1.2 im.yourcompany.com im.yourcompany.com
192.168.1.2 im2.yourcompany.com im2.yourcompany.com
这是添加服务器的ip和domain
然后在spark的服务器栏中写入im.yourcompany或im2.yourcompany.com,用你在openldap中添加的用户就可以登录了。