2012-08-25 176 views
0

我有一臺用Java編寫的ServerSocket服務器。Java + ServerSocket +防火牆

而且我有一個客戶端,它是一個企業防火牆,它阻止了除公共端口之外的所有內容。

我已經在SMTP端口上啓動了服務器(#25)。

帶防火牆的用戶連接到它,到目前爲止一切正常。

然後服務器處理ServerSocket.accept()。據我瞭解,它在隨機端口上創建一個套接字(每次端口號不同)。由於防火牆而失敗。

我的問題是 - 我如何讓ServerSocket.accept()從我的白名單中選擇一個套接字端口?我知道它不適合大規模在線使用,但我想讓我的朋友能夠連接到我的服務器。

可能嗎?如何?

+0

我認爲你需要使用像朋友一邊的襪子:http://en.wikipedia.org/wiki/SOCKS。假設您的家中沒有配置問題,您必須允許出站服務器通信。 – Picarus

回答

0

服務器套接字不選擇隨機端口。它是選擇隨機端口的客戶端套接字。我的猜測是,你的防火牆是聰明的,它知道檢測連接是否通過某種類型的DPI(深度包檢測)。

如果你想誤導它,你可以嘗試運行在前2-3個數據包中看起來像smtp的數據,然後切換到你的協議。

另一種選擇是用一種連接器的系統之外,在這種情況下,兩臺機器,它們通過第三客戶端連接的客戶端(有很多這樣的代理服務器)

+0

我不同意,@soulbuner的假設是對的,定義的端口只用於建立連接。接受第二個隨機端口後,超過1024用於數據傳輸。 – Picarus

+0

作爲DPI引擎的前開發人員,我認爲這是正確的,您可以使用wireshark記錄一些http流量,然後查看。有一些使用多個通道的協議如FTP,但事實並非如此。 – roni

+0

然後我們中的一個人沒有正確理解這個問題,因爲我的經歷與@soulburner解釋相同 – Picarus