我已经设置了一个我只想用作游戏服务器的 ejabberd 服务器。
关于安全性,我需要注意哪些事项以及需要哪些步骤才能开始将其用作游戏服务器?当然,我只想启用本地用户之间的通信,可能无法从其他服务器与 JID 进行通信。
如何禁用 IRC 和服务器到服务器等功能?这必须在 中完成,对ejabberd.cfg
吧?我是否必须将这些段落注释掉或填写空括号以供他们选择?
我定义了以下访问控制列表:
[{acl, admin, {user, "admin", "localhost"}},
{acl, admin, {user, "admin", "***.***.***.***"}},
{acl, local, {server, "localhost"}},
{acl, local, {server, "***.***.***.***"}}].
关于访问权限,以下定义是否可以,或者我应该禁用除 PubSub 之外的所有通信渠道?
[{access, c2s, [{deny, blocked}, {allow, all}]},
{access, pubsub_createnode, [{allow, all}]},
{access, s2s_shaper, [{fast, all}]},
{access, c2s_shaper, [{none, admin}, {normal, all}]},
{access, muc, [{allow, all}]},
{access, max_user_sessions, [{2, all}]},
{access, configure, [{allow, admin}]},
{access, muc_admin, [{allow, admin}]},
{access, max_user_offline_messages,
[{5000, admin}, {100, all}]},
{access, announce, [{allow, admin}]},
{access, register, [{deny, all}]},
{access, local, [{allow, local}]}].
之后,我可以通过客户端库(例如smack
/asmack
还是我需要 BOSH、HTTP 轮询等)访问服务器?XMPP 端口通常在移动设备上打开吗?
上面这些安全考虑对我来说是最重要的,因为我不想运行有潜在安全风险的游戏服务器。但除此之外,我还不能真正让 PubSub 运行。
在客户端,在 Android 应用程序中,我使用 asmack 库和以下代码来启动新的 XMPP 会话并发送消息:
private void startXMPP() {
new Thread(new Runnable() {
public void run() {
try {
org.jivesoftware.smackx.ConfigureProviderManager.configureProviderManager();
ConnectionConfiguration xmppConfig = new ConnectionConfiguration("123.123.123.123");
xmppConfig.setDebuggerEnabled(true);
if (Build.VERSION.SDK_INT >= 14) {
xmppConfig.setTruststoreType("AndroidCAStore");
xmppConfig.setTruststorePassword(null);
xmppConfig.setTruststorePath(null);
xmppConfig.setSendPresence(true);
xmppConfig.setSecurityMode(SecurityMode.disabled);
}
else {
xmppConfig.setTruststoreType("BKS");
String path = System.getProperty("javax.net.ssl.trustStore");
if (path == null) {
path = "/system/etc/security/cacerts.bks";
}
xmppConfig.setTruststorePath(path);
}
SASLAuthentication.supportSASLMechanism("PLAIN", 0);
XMPPConnection xmpp = new XMPPConnection(xmppConfig);
xmpp.connect();
xmpp.login("john", "password");
PubSubManager xmppPubsub = new PubSubManager(xmpp);
ConfigureForm form = new ConfigureForm(FormType.submit);
form.setPersistentItems(false);
form.setDeliverPayloads(true);
form.setAccessModel(AccessModel.open);
form.setPublishModel(PublishModel.open);
form.setSubscribe(true);
LeafNode xmppNode;
try {
xmppNode = (LeafNode) xmppPubsub.createNode("TESTNODE", form);
}
catch (XMPPException e) {
xmppNode = (LeafNode) xmppPubsub.getNode("TESTNODE");
}
SimplePayload payload = new SimplePayload("book", "pubsub:test:book", "");
xmppNode.addItemEventListener(new ItemEventCoordinator<Item>());
xmppNode.subscribe("john@123.123.123.123");
xmppNode.publish(new PayloadItem<SimplePayload>(payload));
}
catch (Exception e) {
System.out.println("XMPP Connection failed!");
e.printStackTrace();
}
}
}).start();
}
不幸的是,这不起作用。你明白为什么吗?由于我启用了调试,我可以在 LogCat 中看到以下错误消息:
<iq from='pubsub.123.123.123.123' to='john@123.123.123.123/Smack' id='Jf****6' type='result'><pubsub xmlns='http://jabber.org/protocol/pubsub'><subscription jid='john@123.123.123.123' subscription='subscribed' subid='53******B2'/></pubsub></iq>
<iq id="Je4Mf-7" to="pubsub.123.123.123.123" type="set"><pubsub xmlns="http://jabber.org/protocol/pubsub"><publish node='TESTNODE'><item></item></publish></pubsub></iq>
<iq from='pubsub.123.123.123.123' to='john@123.123.123.123/Smack' type='error' id='Jf****7'><pubsub xmlns='http://jabber.org/protocol/pubsub'><publish node='TESTNODE'><item/></publish></pubsub><error code='400' type='modify'><bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/><payload-required xmlns='http://jabber.org/protocol/pubsub#errors'/></error></iq>
编辑:
我没有home/server/username/whatever
按照文档中的描述将 PubSub 节点名称设置为。但至少节点的创建是有效的,不是吗?我不想要这种格式的名称,因为我需要诸如“game234234”之类的名称,以便所有参与用户都可以加入该 PubSub 节点。
此外,似乎有尝试联系pubsub.***.***.***.***
不存在,因为我还没有创建 subdomain pubsub
。这是问题的原因吗?PubSub 是否只能通过该子域使用?我不知道为该子域设置什么,并且宁愿仅在没有子域的 IP 上使用 PubSub。