ファイアウォールで保護されたサーバーで 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。