我在防火墙服务器上运行了一个 Java 程序,该程序旨在使用 java-apns 向我的 iPhone 应用程序发送推送通知。问题是,每当我尝试发送通知时,库都无法连接到 APNS 服务器。从堆栈跟踪来看,似乎在创建所需的 SSL 连接时,连接在某个时候被拒绝(当库调用的java.net.ConnectException
方法时,会抛出一个带有“连接被拒绝”详细消息的消息)。SSLSocketFactory
createSocket
如果防火墙阻止了连接,我一点也不惊讶,但不幸的是,由于我不管理服务器,我无法验证情况是否确实如此。事实上,该程序在我的(没有防火墙的)桌面上运行良好,这似乎支持了这一理论。
我的问题是,有人知道有什么方法可以找到问题的根本原因吗?或者有人能告诉我应该告诉服务器管理员进行哪些更改才能使事情正常进行(如果确实是防火墙的问题)?我对这些事情的理解有点有限,但它应该像解除端口 2195(APNS 服务器使用的端口)上的传出连接一样简单,对吗?
作为参考,服务器是一个Linux机器,我使用的是java-apns 0.1.2版本。
答案1
好吧,你应该首先简单地要求他/她解除对 2195 端口的阻止。
以下是一个例子:
iptables -A OUTPUT -o eth0 -p tcp --dport 2195 -j ACCEPT
以上假设这eth0
是外部的、面向互联网的接口。
您可能还需要添加一行用于传入(假设源也是另一端的端口 2195):
iptables -A INPUT -i eth0 -p tcp --sport 2195 -j ACCEPT
如果返回通信的源端口是随机的,则必须使用 iptables 中的状态模块来跟踪连接:
iptables -A OUTPUT -o eth0 -p tcp --dport 2195 \
-m state --state NEW, ESTABLISHED, RELATED \
-j ACCEPT
iptables -A INPUT -i eth0 -p tcp \
-m state --state ESTABLISHED, RELATED \
-j ACCEPT
这是最基本的。管理员负责这类事情,而不是你,因此可能需要修改上述内容。HTH。