2013-04-28 56 views
0

在Linux/C++ TCP服務器中,我需要防止惡意客戶端打開多個套接字,否則他們可能會打開數千個連接,直到服務器崩潰。C++ - 檢測到服務器的多個連接

檢查服務器上是否有同一臺計算機已連接的標準方法是什麼?如果我這樣做基於IP地址的話,那麼即使他們在不同的計算機上,同一家裏的兩個人也不能同時連接到服務器嗎?

任何信息都有幫助! 在此先感謝。

回答

1

TCP本身並沒有真正提供IP地址以外的任何東西來識別客戶端。一些(非獨佔)選項:

1)限制從任何IP地址到合理數量的連接數量,如10或20(取決於系統實際執行的操作)。這樣可以防止惡意DoS攻擊,但仍然具有合理的可用性。

2)將連接的最大數量限制在合理範圍內。

3)你可以委託給更高層的解決方案。作爲協議的一部分,讓客戶端發送一次只生成一次的唯一標識符(每次安裝等)。但是,這可能很容易被欺騙。

我相信1和2是有多少服務器處理它。將它們放在配置文件中,以便根據場景進行調整。

+0

感謝您的信息。我可能會執行第一個選項。我會稍微等待其他人對一些可能的解決方案發表評論:) – 2013-04-28 22:37:23

1

只有IP地址的基礎是「這是同一個發件人」,除非你有某種訂閱/登錄系統(但是有人可以嘗試立即登錄一個巨大的次數,因爲必須有某種類型握手登錄)。

如果兩個客戶端使用相同的路由器(使用NAT或類似方案),您的服務器將看到相同的IP地址,因此每個IP地址只允許一個連接對於「多個用戶同一個家「。這也適用於例如使用大學網絡或公司網絡的情況。

因此,根據您提供的內容以及您可以從同一地點獲得的客戶數量,您可能需要高出10分。當然,如果您記錄時發生這種情況,並且您看到一個公平的「看起來像有效的真實用戶無法進入」的數量,您可以調整數量。

擁有某種「滾動平均值」也是有意義的,所以您從每個IP地址每Y秒接受X個新連接,而不是固定的最大數量。如果連接持續一段時間,這是有意義的......對於短時連接,這是毫無意義的...