2012-02-03 56 views
4

我正在開發我的第一個多人RTS遊戲,我自然會使用UDP套接字來接收/發送數據。管理UDP套接字上的安全性

我一直在試圖弄清楚的一件事是如何保護這些端口不被被DoS攻擊中的虛假數據包淹沒。通常情況下,防火牆可以防止洪水攻擊,但是我需要允許我使用的端口上的數據包,並且必須依靠我自己的軟件來拒絕虛假數據包。什麼會阻止人們嗅探我的數據包,觀察我使用的任何身份驗證或特殊結構,並用類似的數據包發送垃圾郵件?源地址可以很容易地改變,以便檢測和禁止犯罪者幾乎不可能。是否有任何廣泛接受的方法來防範這類攻擊?

我完全瞭解UDP和TCP之間的區別,所以請不要把它變成關於這個的講座。編輯======================== =

我應該補充一點,我還試圖解決如何通過發送我認爲是來自我的遊戲的數據包來防止某人「黑客入侵」遊戲和欺騙行爲。排序/同步號碼或ID很容易被僞造。我可以使用加密,但我擔心這會減慢我的服務器的響應速度,而這不會爲DoS提供保護。

我知道這些都是每個使用UDP套接字的程序員都必須遇到的基本問題,但對於我來說,我找不到任何相關文檔來解決這些問題。

任何方向將不勝感激!

回答

4

您需要的技術不是特定於UDP的:您正在尋找通用消息身份驗證來處理欺騙,速率限制以處理DoS以及服務器端狀態啓發式(「此包是否合理?」)來處理客戶端黑客。

爲了有效處理DoS,您需要檢測層。首先刪除無效的源地址,甚至不看內容。在每個數據包的起始處添加一個會話ID,其ID未分配或與正確源不匹配。接下來,跟蹤每個會話的到達率。從速度過快的地址開始丟棄。這些技術將阻止除了能夠實時嗅探合法數據包的人之外的所有內容。

但基於實時嗅探的DoS攻擊將非常罕見,並且攻擊速率將受限於單個源網絡的速度。阻止數據包嗅探的唯一方法是使用加密和校驗和,這將是很多工作。由於這是你的「第一多人RTS」,我建議儘可能加密。

如果您決定使用加密技術,AES-128相對較快且非常安全。 Brian Gladman的參考Rijndael實現是一個很好的起點,如果你真的想優化,或者有很多的AES庫。使用簡單的CRC-16可以檢查明文數據。但是這可能是對你可能的攻擊媒介矯枉過正。

+0

很棒的總結,非常感謝!我不知道如何判斷源IP是否無效?如果遊戲是在筆記本電腦/智能手機上播放的,則會話中的IP可能會發生變化。這是我到目前爲止所做的: *登錄認證開始活動會話 *將會話ID添加到所有數據包中 *用每個數據包的標籤(move/shoot/keepalive)標記每個數據包並限制每個數據包的每秒數 *讓服務器驗證客戶端在過去30秒內發送了多少個X類型的數據包 *邏輯上刪除任何看起來已損壞或僞造的數據包 *經常終止違反這些規則的會話 – Scotty 2012-02-03 22:33:13

4

最重要的是:永遠不要相信客戶!始終跟蹤服務器端的所有內容。如果一個數據包到達似乎是假的(就像一個單位每秒移動Y個單位,而它應該只能夠每秒移動X個單位),那麼就簡單地丟棄數據包。

此外,如果每秒數據包數量增長到很大,也會開始丟棄數據包。

不要將UDP數據包用於「不重要」的事情......遊戲中的聊天和類似的事情可以通過正常的TCP流。

+0

當然,我會處理來自客戶端的所有消息,以確保它們是合法的,但解密過程(如果我採用該路徑)並將這些數據包處理到我知道它們是假的那一點將會產生足夠的應變在服務器上進行良好的DoS攻擊! – Scotty 2012-02-03 10:34:52

+0

@Scotty這就是爲什麼大型網絡遊戲都使用多服務器架構:一臺服務器用於處理連接,一臺數據庫服務器,一臺「應用」服務器。 (將「一臺服務器」替換爲「服務器羣集」)。 – 2012-02-03 10:37:15

+0

另一方面 - 我記得學習你不能在同一時間使用TCP和UDP,因爲他們以後(或某物)在同一個網絡上工作......當然,這可能只是基於每個端口,或者我可能會完全錯誤:) – Scotty 2012-02-03 10:40:59