今日,《刀塔2》在Steam社區發佈了題為“刀塔漫談:如何拒絕拒絕服務”的公告推送,以下為內容詳情。
歡迎回到“刀塔漫談”特色博文,我們開發團隊的成員會在文章中梳理自己遇到的一些挑戰、錯誤修復還有偶爾令人莞爾的意外,主要是在開發像Dota這樣獨特遊戲的過程中。
這是一個關於互聯網的故事,還有它如何不按應有的方式工作,什麼時候在正常工作,實際上又完全沒有。 這是一個關於互聯網如何停止服務我們的客戶,以及我們如何修復它的故事。
互聯網和我們心目中的相比是一片更為狂野的邊界。 離開了雙因素身份驗證和可信cookie的安全範圍,外面可能會有點荒亂,充滿了身懷惡意的隨機壞蛋——而且他們越來越有能力讓你的生活變得非常悲慘,不為別的,就因為他們能做得到。
當時還是2014年,這些壞蛋使用的方法是分佈式拒絕服務(DDoS)攻擊。 “分佈式”是指大量互聯網主機惡意向特定目標IP注入流量,企圖壓垮網絡堆棧。 這被稱為飽和攻擊,而其目的並不是嘗試進入網絡。 只是企圖拒絕服務。 分佈式拒絕服務意味著想要合法服務的合法人會被惡意流量擠出去。
DDoS攻擊的問題是在於,截至2014年底,實施這些攻擊的並不是擁有高級計算機科學學位、專精於數據洩露的超級黑客。 實施的幾乎可以是任何人,他們只要付錢就能找到人或者機器人來為他們辦事。 而且原因很明顯。 儘管有些人純粹是為了破壞公物而樂意這樣做,但其他人是有動機的:DDoS攻擊肯定會導致你或你支持的人馬上要輸的比賽被迫中止。 這就不再只是偶然的煩惱了。 這會演變為公然攻擊有玩家比賽的任何遊戲。
到了2015年初,我們發現Dota和CS:GO遭遇的DDoS攻擊次數大幅增加,其他公司也有大幅增加的報告。 突然之間,有人讓任何人都可以很容易地發動攻擊。
2015年8月,國際邀請賽被DDoS攻擊擾亂比賽現場。 儘管比賽中的職業選手沒有受到影響,但在兩個多小時的時間裡,轉播方無法進入比賽進行實況的解說。 直播流的外送成為了一個難題。 選手們就像是在虛空裡打的比賽。 這是一場有數百萬人觀看、有數百萬美元獎金的職業競技賽事,但有人用了五美元的軟件就擾亂了整個比賽。 這是Valve無法忽視的問題。
在找到了有效的解決方案之前,我們嘗試了多種應對DDoS攻擊的解決方案。 最初,我們嘗試使用功能強大的網絡交換機來過濾流量。 不幸的是,這種類型的過濾本質上很難去針對遊戲流量。 遊戲服務器的本質就是從任意IP地址接收未經請求的UDP(用戶數據報協議)流量。 想象一下,你有一家郵局,專門為你清理不需要的垃圾信件。 但再想象一下,你的工作是給人建議的專欄作家,而且你一直收到大量來自隨機陌生人的合法信件。 對你來說,郵局不知道什麼是垃圾信件,什麼不是。 遊戲服務器的流量往往就是這樣的情況。 此外,UDP數據包中的源IP不安全,很容易被欺騙。 我們的郵局甚至無法通過信封上的回郵地址來尋找線索,因為垃圾信件的發件人偽造了他們的地址。
Steam提供了大量的遊戲內容,併為此建立了一個龐大的網絡。 我們已經利用該網絡通過專用鏈路來傳輸遊戲流量、獲得良好的對等互連、確保使用網絡工程的最佳實踐等。 這能使玩家ping時間保持在較低水平,但無法阻止DDoS攻擊。 問題是在於UDP協議不安全,因此雖然我們擁有自己的網絡,但並不是私有的。
為了防止攻擊者使用我們自己的網絡來攻擊我們的服務器,我們需要控制所有入口並保護它們。 為了實現這個目標,我們為遊戲流量創建代理、通過中繼設備傳輸網絡上的每個數據包。 現在,當客戶端想要與遊戲服務器通信時,它必須通過中繼設備來實現,中繼設備既會對其進行身份驗證,又會將該流量代理到遊戲服務器。 這意味著服務器的IP地址始終都是隱藏的——攻擊者根本不會知道要攻擊哪裡。
重新使用上述的郵局比喻,我們的垃圾信件發送者再也沒有地址讓他們去寄送垃圾信件。 他們可以把垃圾信件發送到該地區的每個郵局並要求他們郵寄,但沒有授權的情況下,郵局並不會這樣做。 (而且,郵局會發現有人企圖向一個人寄出100 000封信是有點可疑。)
但不能直接攻擊中繼設備嗎? 嚴格來說,可以的。 但我們的數量基本上是無限的,而且我們構建的目的就是為了被攻擊。 “中繼設備”只是運行軟件的計算機的另一種說法。 可以攻擊它或使其離線,但是設計協議時就考慮過這樣的情況。 如果客戶端嘗試玩遊戲並與中繼設備失去聯繫,它只會再切換到下個設備。 中繼設備就像散佈在世界各地的數百個棋子,其唯一目的是守衛遊戲服務器。 (順便說一句,幹掉中繼設備比聽起來要難。 它們的設計非常好,並且位於網絡的特定位置,所以儘管它們是為了離線而設計的,但我們還沒有失去過一個。)
這個解決方案簡單但有效。 之前如果有人想要破壞遊戲,他們只需擊垮一臺遊戲服務器(門檻非常低)。 現在他們必須擊垮整個數據中心——門檻非常非常高。 那還有攻擊可以做到嗎? 當然有。 那還有任何人在網上花五美元買到的攻擊可以做到嗎? 沒有。 這麼複雜的攻擊背後需要的財力超出了大多數人的承受範圍。
隨著這個新系統的啟動和運行,我們頓悟了:如果我們控制自己的私有網絡,我們就不會受制於正常互聯網的工作原理。 我們可以利用它來改善客戶體驗。 在常規的互聯網中,當你將數據包從一個IP地址發送到另一個IP地址,你使用的路由是由邊界網關協議(BGP)來決定。 這是一種路由算法,會決定你的數據包在網絡中的傳輸方式,並且你無權決定它挑選的路由。
但是,有了由數百個全球中繼設備和數據中心組成的虛擬私有網絡,我們基本上可以自行選擇從客戶端到遊戲服務器的路由——通常是比默認路由更快的捷徑。 如果你使用Steam數據報中繼(SDR),我們會顯示你的ping時間以及我們為你提供的路由,以便你可以親自了解是如何優化的。
最初用於保護Dota遊戲服務器的一個功能現在超出了所有人的預期。 SDR網絡通常每秒傳輸多達140M數據包和550GBit。 我們在31個數據中心設有中繼設備,容量超過 5TBit。 現在我們所說的Steam數據報中繼不僅可以防止DDoS攻擊,還可以提升每個Dota玩家的連接穩定性並且降低延遲。 不僅適用於Dota,也適用於Steam上任何想要利用它的遊戲。
我們希望大家能再次從刀塔漫談中享受到樂趣。 這次的文章技術性很強,感謝你能堅持讀完! 也請隨時告訴我們,你希望下期介紹哪方面的內容。