2011-10-17 93 views
2

上下文:由於DOS攻擊,我有一張禁止ip地址表,位於我程序內存某處的某個集合中。java socket:在接受之前收聽?

我使用TCP服務器套接字,接受每個連接,然後檢查IP地址,然後我關閉連接或繼續處理客戶端。

我想知道在Java中是否有可能偵聽TCP服務器套接字上的連接,並且接受或拒絕某種方式建立tcp鏈接(給定請求客戶端的IP地址)。我的意思是不必接受&來關閉客戶端套接字,這正是我已經在做的事情。

謝謝。

回答

6

如果不使用SecurityManager,則只能接受,然後檢查傳入的IP地址,並在連接被禁止列表中時刪除該連接。使用SecurityManager,你可以讓它發出SecurityException,並給它特殊的處理(例如在應用中的安全日誌中記錄連接請求)。

如果你不希望這些連接甚至打你的服務器(我猜測這是重點),你真的想在防火牆級別阻止它。一旦連接擊中你的應用程序,它已經佔用了與你的應用程序交談所需的內存和資源,所以那時你已經失去了DOS/DDOS遊戲。

在接受之前或之後刪除它並不重要,因爲連接已經達到應用程序的應用程序級別。即使使用SecurityManager,它仍然會增加服務器的負載。

+0

不知道! – Joel

2

您可能可以,但是無論如何,您無法阻止他們在您的Java代碼中訪問您的系統。

最好的辦法是,不要使用Java,而應使用諸如iptables之類的東西或其他防火牆來立即丟棄它們的數據包。

在serverfault的男孩可能比SO更好地幫助。

1

如果您可以遵守在.policy文件中定義的地址,或者編寫自己的Policy對象,則可以使用帶有合適的SocketPermissions定義的SecurityManager。

編輯:但我不得不承認,防火牆將是一個更好的解決方案。

+0

如何將安全管理器對象與我的應用程序和服務器套接字連接起來? – Joel

+1

'System.setSecurityManager(new SecurityManager());' – EJP