zoukankan      html  css  js  c++  java
  • ejabberd的多域名(domain)设置

    在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中添加的用户就可以登录了。

  • 相关阅读:
    遇到swiper高度问题
    overflow
    transition过渡规定慢速开始,然后变快,然后慢速结束的过渡效果(cubic-bezier(0.25,0.1,0.25,1))。
    【记录一个问题】thinkpad x1笔记本,安装ubuntu 16后,拔掉U盘,总是启动到windows,无法启动到ubuntu
    【记录一个问题】笔记本ThinkPad X1-Extreme安装ubuntu 18后,更新nvidia显卡驱动后出现显示问题,无法再登录
    golang gin框架中实现一个简单的不是特别精确的秒级限流器
    【解决了一个小问题】golang中引用一个路径较长的库,导致goland中出现"module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v2"
    【解决了一个小问题】golang samara的kafka客户端中使用错误版本号导致初始化失败
    【解决了一个小问题】golang xorm中使用where id in (xxx),没办法使用参数替换
    【记录一个问题】golangci-lint.exe中,盘符大写就会执行出错
  • 原文地址:https://www.cnblogs.com/xuan52rock/p/4596097.html
Copyright © 2011-2022 走看看