室友天天開黑,這就算了,還老是用外放,不得已,只能讓他們打不爽,從根本上阻止他們開黑,還我寢室一個安靜的環境,至少,讓他們按時睡覺。
寢室的網絡環境
路由器
一台撿垃圾的小米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。