室友天天開黑,這就算了,還老是用外放,不得已,只能讓他們打不爽,從根本上阻止他們開黑,還我寢室一個安靜的環境,至少,讓他們按時睡覺。
寢室的網絡環境
路由器
一臺撿垃圾的小米CR6608,刷入了 OpenWRT ,承擔我們寢室所有的網絡流量,由於是一所垃圾大學,校園網限制一套餐一終端,寢室裡又只有一個網絡口,大家都用我的套餐,整個寢室的網絡控制權當然在我的手上。
室友上網的設備
其餘三個室友都打英雄聯盟,其中兩個使用筆記本,一個是臺式機,沒有無線網卡,而且臺式機恰巧是打的最兇的那位。
決定採用的方案
首先,肯定不能徹底阻斷寢室網絡與英雄聯盟服務器的連接,這樣明顯感知太強,容易被發現,其次由於另外兩個室友都是筆記本電腦,發現丟包率太高肯定會開熱點換移動網絡,所以最終的方案確定為模仿GFW對網站隨機丟包的干擾模式。
具體行動
首先先給每個室友分配靜態的IP地址,原因看到後面你就知道了。
上網查找資料,可以知道英雄聯盟所使用的端口:
| 項目 | 端口號 |
|---|---|
| League of Legends Game Client | 5000 - 5500 UDP |
| Patcher and Maestro | 8393 - 8400 TCP |
| PVP.Net | 2099 TCP |
| PVP.Net | 5223 TCP |
| PVP.Net | 5222 TCP |
| HTTP Connections | 80 TCP |
| HTTPS Connections | 443 TCP |
| Spectator Mode | 8088 UDP and TCP |
向路由器的iptables裡添加以下隨機丟包的規則:
| |
關於如何在 OpenWRT 上自定義 iptables 規則,有兩種方法,第一種方法,打開 系統 -> TTYD終端 將上面的命令一行一行復制進去回車,用這種方法,規則會在路由器重啟或者 iptables 重啟後失效,第二種方法,打開 網絡 -> 防火牆 找到 自定義規則 選項卡,將上述內容粘貼到這個頁面已有內容的後面,注意不要覆蓋文本框裡原先的內容,完成後點擊頁面下方的 保存並應用,這樣即使是重啟路由器也不會重置 iptables 規則。
這些 iptables 規則用到了 ipopt 模塊,而一些固件不會默認安裝 ipopt 模塊,如果發現 iptables 對這些規則報錯,請看後文的安裝 ipopt 部分。
生效後,室友打英雄聯盟就會在校園網本就1%到5%丟包率的基礎上增加30%的丟包率。經過室友的盲測反饋(我怎麼可能會讓室友知情呢?!)放技能總是放不出去,打的非常不爽。
但是這種方法似乎不適用於室友開加速器的情況,所以我們可以針對這種情況直接限制室友所有的流量,也就是說,不論室友的電腦發出什麼數據包,都能享受到30%的丟包率,除非室友開熱點,當然臺式機是不可能的,這種方法就可以讓所有的加速器都失效。前提是,室友的ip地址必須要提前確定,這也就是為什麼需要提前給室友的電腦分配靜態IP。
向路由器的iptables裡添加以下規則
| |
即可“照顧”室友所有的流量。
很好,現在每天11點我都會準時更新防火牆規則,至少讓寢室安靜一點。
授人以魚不如授人以漁
這些參數都是些什麼?
iptables
iptables是運行在用戶空間的應用軟件,通過控制Linux內核netfilter模塊,來管理網絡數據包的處理和轉發。
——維基百科
簡單點說:iptables是Linux的防火牆軟件,可以通過設定的規則過濾掉特定的數據包達到防火牆的目的。OpenWRT基於Linux,自然也用iptables作為防火牆。
-I FORWARD
iptables有所謂的“五鏈”和“四表”。
“五鏈”是指 netfilter 定義的 5 個規則鏈。每個規則表中包含多個數據鏈:INPUT(入站數據鏈)、OUTPUT(出站數據鏈)、FORWARD(轉發數據鏈)、PREROUTING(路由前數據鏈)和POSTROUTING(路由後數據鏈),防火牆規則存儲在這些數據鏈裡。
“五鏈”的結構如下:
四表分別是:
- filter:過濾整個數據包,在 INPUT、FORWARD 和 OUTPUT 鏈可用
- nat:控制數據包的地址轉換,在 PREROUTING 、INPUT、OUTPUT 和 POSTROUTING 鏈可用
- mangle:修改過濾數據包中的原數據,在 PREROUTING、INPUT、OUTPUT、FORWARD 和 POSTROUTING 鏈可用
- raw:控制 nat 表連接追蹤機制的啟用與否,在 PREROUTING、OUTPUT 鏈可用
路由器的功能是轉發數據,這些數據顯然經過 FORWARD 鏈,故規則都在 FORWARD 鏈上添加。在 iptables 上使用 -I 參數插入規則時,默認會插入 filter 表,也就是我們需要的表。
-p xxx –dport xxxx
使用 iptables 時,-p 參數用於指定規則適用的協議,–dport,即destination port的縮寫,支持範圍匹配,可以匹配數據包所去往的端口,這裡參照英雄聯盟所使用的端口和與之對應的協議一一阻止。
-m statistic –mode random –probability 0.3
這些都是自定義的 丟包參數,可以實現很多其他的功能,因為iptables功能太多,故這裡不做贅述,感興趣的話可以自行查閱iptables相關的教程。
-j DROP
iptables 可以對符合規則條件的數據包做多種處理:
- ACCEPT:允許數據包通過
- DROP:丟棄數據包
- REJECT:拒絕數據包通過
- LOG:記錄日誌
- DNAT:目標地址NAT
- SNAT:源地址NAT
- MASQUERADE:地址欺騙
- REDIRECT:重定向
需要隨機丟棄數據包,自然是選擇DROP。
特定時間自動添加/刪除丟包規則
在路由器的 Crontab 裡添加如下規則
| |
即可實現每天晚上11點自動添加丟包規則,每天早晨7點自動刪除丟包規則。
補充:安裝 ipopt 模塊
部分固件可能存在沒有ipopt模塊的問題,而這些規則大部分都使用到了這個模塊,這種情況下需要手動安裝。
ipopt 的安裝有兩個選擇,一般出於穩定性考慮會安裝用戶層的iptables-mod-ipopt,而內核級的kmod-ipt-ipopt則在設備 CPU 性能孱弱或存儲空間不夠用的情況下選擇。
內核級的模塊一般需要預先編譯固件才能安裝,而用戶層只需執行以下opkg命令即可:
| |
後期計劃
後續可能會寫一個每天指定時間自動添加,自動刪除iptables規則的腳本,實現應該相對容易。最近要期末考試,備考要緊。
其次可能會補充iptables的常用功能解說。
評論已停用,直到您接受功能性 Cookie。