• 前言
  • 刷入 OpenWrt
  • OpenWrt 基本配置
  • 一些基本操作
  • 配置 NTP 服務2018.9.18更新:已經確認不需要做這一步。)
  • 修改 HTTP 請求的 User-Agent 欄位
  • 修改 IP 報文頭 ID 欄位和 TTL 欄位2018.9.16更新:已經確認不需要做這一步。)
  • 一些想說的話
  • 參考資料

前言

女朋友走了之後,我就發現宿舍網掛了。隨後一周的時間都投入在了這件事上,再隨後兩周也斷斷續續地投入了很多時間和精力。現在看來應該是差不多了。先寫教程的部分吧,吐槽放到最後。

這篇教程面向和我一樣願意探索的同學,列出了所有我現在在我的路由器上採取的措施,閱讀並實踐大約需要兩三天的時間,之後你的路由器應該就可以穩定使用了;但如果你不願意付出這麼多的時間和精力的話,還是再等等比較好,我會逐漸確定這些步驟中的哪些是可以略去的,然後如果可能的話,寫一個更簡單、詳細的教程。

閱讀這篇教程之前,建議先大致了解一下當今的網路是怎樣分層實現的,以及每一層大致的作用。這些資料網上有很多,請自行查找。

另外,我不能保證這篇教程中的代碼同樣適用於你的路由器;所以,在執行任何操作之前,最好弄明白自己在幹什麼。倒是一般也不會造成什麼嚴重的後果,就算路由器搞得開不了機,大多也可以在恢復模式里救回來;但也確實有可能讓路由器完全廢掉。並且這樣折騰之後,售後是不會給你保修的。

最後,本文章所述技術不允許擅自用於任何商業用途


刷入 OpenWrt

OpenWrt 是一個路由器上的操作系統,基於 Linux 內核。並不是所有路由器都可以刷 OpenWrt,在這里可以看到支持 OpenWrt 的路由器型號列表,點擊某一型號可以看到路由器的各項參數、固件的下載地址等。

關於路由器的選購,建議去網上多看看,挑一台自己中意的。由於 OpenWrt 不支持硬體 NAT,導致刷 OpenWrt 之後路由器能承載的帶寬隻有原廠固件的幾分之一;隨後的一些防止封殺的操作,也會進一步加重路由器負擔。我現在用的是 Netgear WNDR4300 V1,WAN 到 LAN 的極限速率大概是 60M;供參考。推薦在閑魚上購買二手的,如果之後發現性能不夠用或者不喜歡,再賣掉就可以了。

2018.9.16改正:有資料說 OpenWrt 並非不支持 HWNAT,隻是官方編譯的時候不願意加入閉源驅動,可以手動加入閉源驅動以支持 HWNAT。另外有 Fast Path NAT 可以作 NAT 加速,據說效果不錯,還沒有嘗試。

刷入 OpenWrt 的具體方法因型號而異,大概有兩條思路,在管理頁面中通過固件升級安裝,或者進入恢復模式後使用 TFTP 刷入;具體資料網上很多,搜索」機型 openwrt「應該就可以查到。另外,如果使用 TFTP 刷入:

  • 最好在路由器通電之前就將網線插好。我的 WNDR4300 進入恢復模式後再插網線,就刷不進去。
  • 如果提示超時,試試binary模式。
  • 如果 Windows 下 CMD 中 TFTP 不可用,試試 PowerShell。

刷入後可能還需要一些額外的操作使路由器正常運行。比如,可能需要等路由器完全啟動後再重啟一次使 5G WiFi 正常;我的 TL-WDR3320 還需要改 ART。具體請自行查找資料。

另外,淘寶、閑魚上還有一些已經刷好 OpenWrt 的路由器賣。


OpenWrt 基本配置

瀏覽器輸入 LAN 口地址(一般是192.168.1.1),進入管理頁面。Username 為 root,密碼隨便填,點擊 LOGIN。接下來是:

  • 設置管理員密碼、SSH 訪問(Interface 選 lan,其它默認就可以)。
  • Network -> Interfaces,刪除 WAN6,WAN 協議改為 PPPoE,輸入用戶名、密碼,保存。
  • Network -> Wireless,改一下無線的 ESSID,然後 Wireless Security 中,Encryption 選 WPA2-PSK,填入密碼,保存。註意 5G 左右的那個 WiFi 信道選 149 或更高,否則信號不太好。
  • Network -> FireWall -> Traffic Rules,Allow-DHCP-Renew 必須保留,其它建議一律刪除。

其中,PPPoE 撥號的密碼即是深瀾客戶端中填寫的密碼;用戶名格式為{SRUN2}xxxxx@cmcc(移動)或{SRUN2}xxxxx@ctnet(電信),中間的部分為學號的 ASCII 碼加 4。例如,小明的學號為 1234567890,電信,則用戶名為{SRUN2}56789:;<=4@ctnet

其它的內容如果想要修改,請自行查找資料。


一些基本操作

你需要先學會諸如如何復制文件到路由器上、如何安裝軟體包之類的操作。

  • 在 Windows 下,推薦使用軟體 WinSCP 修改路由器中的文件,可以直接雙擊打開文件修改,也可以把文件復制-粘貼到路由器上;操作非常直觀,這里略過。在這里下載安裝 CgyWin,這樣就可以用ssh給路由器發送命令了。
  • 在 LInux 下,用scp傳文件,用ssh執行命令。既然都會用 Linux 了,這兩個東西怎麼裝應該不需要我說。修改文件的話,可以在ssh下使用vim

scp傳文件,可以這樣寫:

scp /home/chn/000.txt root@192.168.1.1:/tmp/

回車,然後按照提示,輸入密碼、回車,/home/chn/000.txt 就放到路由器的 /tmp 文件夾下了。

這樣使用ssh

ssh root@192.168.1.1

然後回車,輸入密碼、回車,即可。第一次連接時,可能會問你一些選擇題,選yes或者y就可以了。這之後就可以使用各種各樣的命令了,比如,列出/etc下的所有目錄和文件:

ls /etc

如果要路由器自動下載、安裝名為privoxy的軟體包,可以這樣寫:

opkg update
opkg install privoxy

第一條命令執行後,路由器就知道了現在可以用的軟體包的列表、對應的下載地址等;第二句執行之後就裝好了privoxy

如果是自己編譯或者在別處搞來的、官方 feeds 上沒有的軟體包,可以將軟體包放到路由器上之後,類似於這樣去安裝:

opkg install /tmp/kmod-xmu-router-patcher_4.9.124-21_mips_24kc.ipk

除了這些,你還需要知道 iptables/netfilter 的大致結構。參考這篇文章

接下來我們就要開始做防止封號的工作了。這篇文章中介紹的四種方法就恰好是我們接下來要做的三步;但實際上還有別的檢測網路共享的辦法,參考這篇文章或者自行谷歌「count NATed host」。


配置 NTP 服務

2018.9.18更新:已經確認不需要做這一步。隻需要修改 UA 就可以了。

這一步的作用是統一內網各台機器的時鐘;至於 NTP 是什麼、怎麼運作,自行查找資料。OpenWrt 已經自帶相關軟體包,我們隻需要將路由器上的 NTP 客戶端和服務端設置好,然後將所有來自內網的 NTP 請求重定向到路由器的 NTP 服務器就可以了。

編輯/etc/config/system,將其中的config timeserver 'ntp'那一段修改為:

config timeserver 'ntp'
    option enabled '1'
    option enable_server '1'
    list server 'time.xmu.edu.cn'
    list server 'cn.pool.ntp.org'
    list server 'pool.ntp.org'
    list server 'time.apple.com'

這里有關於這些語句意義的詳細解釋,通俗易懂。

保存後使用命令/etc/init.d/sysntpd restart重啟 NTP 客戶端和服務端。然後在瀏覽器控制界面,Network -> FireWall -> Custom Rules 添加如下規則:

iptables -t nat -N ntp_force_local
# 在 nat 表中建立名為 ntp_force_local 的鏈
iptables -t nat -I PREROUTING -p udp --dport 123 -j ntp_force_local
# 在 PREROUTING 鏈最前方插入規則:當協議為 UDP 且目標埠為 123 (為 NTP 請求)時,跳轉到 ntp_force_local 處理
iptables -t nat -A ntp_force_local -d 0.0.0.0/8 -j RETURN
iptables -t nat -A ntp_force_local -d 127.0.0.0/8 -j RETURN
iptables -t nat -A ntp_force_local -d 192.168.0.0/16 -j RETURN
# 不處理發往本地的包
iptables -t nat -A ntp_force_local -s 192.168.1.0/24 -j DNAT --to-destination 192.168.1.1
# 其它情況,則重定向到 192.168.1.1 處理

然後點擊 RESTART FIREWALL 即可。


修改 HTTP 請求的 User-Agent 欄位

2018.9.15修正:這一節之前有一些小錯誤,已經改正。

打開這個網站,你就可以看到自己使用的瀏覽器的 UA,裡面會透露你的操作系統、瀏覽器等資訊。接下來我們使用privoxy軟體包做透明代理,把內網發到外網的所有 HTTP 請求的 UA 欄位全改為Privoxy/1.0

安裝privoxyluci-app-privoxy

opkg update
opkg install privoxy luci-app-privoxy

2018.9.15補充:可能需要重啟路由器使一些依賴包生效。

修改/etc/config/privoxy為下面的內容:

config privoxy 'privoxy'
    option confdir '/etc/privoxy'
    option logdir '/var/log'
    option logfile 'privoxy.log'
    option forwarded_connect_retries '0'
    option keep_alive_timeout '300'
    list permit_access '192.168.0.0/16'
    list filterfile 'default.filter'
    list actionsfile 'match-all.action'
    option accept_intercepted_requests '1'
    list listen_address '0.0.0.0:8118'
    option toggle '1'

config system 'system'
    option boot_delay '10'

修改/etc/privoxy/match-all.action為下面的內容:

{ +hide-user-agent{Privoxy/1.0}}
/

其中的Privoxy/1.0可以改為任何符合 UA 格式的內容,比如HaHaHa/2.33或是更復雜的。自行發揮。

大多設置的意義根據字面意思就可以理解,在這里(可能需要翻墻)可以檢視Privoxy配置的詳細解釋。太長了,我大致翻了一下就沒有看了。

在控制界面上重啟privoxy(寫著 PID 的按鈕就是停止按鈕),然後在防火墻自定義規則中添加:

iptables -t nat -N http_ua_drop
# 在 nat 表中建立名為 http_ua_drop 的鏈
iptables -t nat -I PREROUTING -p tcp --dport 80 -j http_ua_drop
# 在 POSTROUTING 鏈最前方插入規則:當協議為 TCP 且目標埠為 80 (為 HTTP 請求)時,跳轉到 http_ua_drop 處理
iptables -t nat -A http_ua_drop -d 0.0.0.0/8 -j RETURN
iptables -t nat -A http_ua_drop -d 127.0.0.0/8 -j RETURN
iptables -t nat -A http_ua_drop -d 192.168.0.0/16 -j RETURN
# 放過發往本地的包
iptables -t nat -A http_ua_drop -p tcp -j REDIRECT --to-port 8118
# 其它情況,則重定向到 8118 埠處理

重啟防火墻即可。


修改 IP 報文頭 ID 欄位和 TTL 欄位

2018.9.16更新:已經確認不需要做這一步。最麻煩的一步可以跳過了。

接下來我們將會把 ID 改為連續遞增、TTL 欄位改為固定值(例如 128)。通過 ID 判定是否共享上網的原理可以參考這篇文章,通過 TTL 判定的原理在上文的鏈接中已經提到。這一步是最難的一步,建議先不要做,如果賬號還被封,再做這一步。不過我倒是最先做的這一步,因為許多資料上都說 IPID 是一個重要的特徵。

修改 TTL 可以使用 iptables 的命令實現,但修改 ID 必須自己寫代碼、編譯安裝到路由器。

  • 可以參考這篇文章以及其中提到的其它文章修改已有模塊的代碼實現修改 IPID 的功能;原文所述兩個 patch 文件的下載地址已經失效,但這兩個文件還可以在 GitHub 找到。代碼對應 2.6 內核,需自行修改代碼以適配路由器使用的內核版本。我嘗試後失敗了;但有同學成功了。安裝後使用 iptables 的命令修改 IPID 和 TTL。
  • 也可以自己編寫內核模塊。參考這一系列教程學習如何在 LInux 上編寫、編譯 C 語言程序,以及如何編寫適用於 OpenWrt 的軟體包;參考這一系列文章理解 netfilter、編寫修改 ID 和 TTL 的核心代碼,參考這篇文章使用 SDK 編譯軟體包。
  • 也可以使用源碼編譯,我一開始就是這樣幹的。好處是可以參考已有的一些模塊的代碼。

需要註意:

  • 在編寫代碼的過程中,可以在這個網站檢視 Linux 內核各個版本的源代碼。
  • 以上編譯的過程一般需要在 Linux 下進行,虛擬機或真機都可以。在 Windows 下使用 Docker 編譯似乎也是可行的,請自行查找相關資料。
  • 要是沒用過 Linux,推薦先試試 deepin OS。
  • 編寫過程中遇到什麼問題,可以到論壇上問,可能會有大佬來回答。

下面是我編寫的代碼,修改 ID 的同時順便修改 TTL,供參考。對應 4.9 的 Linux 內核版本,其它版本可能需要修改代碼。

xmu-router-patcher/Makefile

include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk
 
PKG_NAME:=xmu-router-patcher
PKG_RELEASE:=24
 
include $(INCLUDE_DIR)/package.mk

EXTRA_CFLAGS:= \
    $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=m,%,$(filter %=m,$(EXTRA_KCONFIG)))) \
    $(patsubst CONFIG_%, -DCONFIG_%=1, $(patsubst %=y,%,$(filter %=y,$(EXTRA_KCONFIG)))) \

MAKE_OPTS:=$(KERNEL_MAKE_FLAGS) \
    SUBDIRS="$(PKG_BUILD_DIR)" \
    EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \
    CONFIG_xmu-router-patcher=m

define KernelPackage/xmu-router-patcher
    SUBMENU:=Other modules
    TITLE:=xmu-router-patcher
    FILES:=$(PKG_BUILD_DIR)/xmu-router-patcher.ko
    AUTOLOAD:=$(call AutoLoad,99,xmu-router-patcher)
    KCONFIG:=
endef

define Build/Compile
    $(MAKE) -C "$(LINUX_DIR)" $(MAKE_OPTS) modules
endef

$(eval $(call KernelPackage,xmu-router-patcher))

xmu-router-patcher/src/Makefile

obj-${CONFIG_xmu-router-patcher}    += xmu-router-patcher.o

xmu-router-patcher/src/Kconfig

config xmu-router-patcher
    tristate "xmu-router-patcher"

xmu-router-patcher/src/xmu-router-patcher.c

#include <linux/module.h>
#include <linux/version.h>
#include <linux/kmod.h>
#include <linux/kernel.h>
#include <linux/netfilter.h>
#include <linux/netfilter_ipv4.h>
#include <linux/ip.h>
#include <linux/netdevice.h>
#include <linux/random.h>

//#define XMUR_DEBUG

//鉤子
static struct nf_hook_ops nfho;

void modify_ipid(struct iphdr *iph)
{
    //舊的id作為索引值,得到新的id。可以假定已經初始化,盡管並沒有專門初始化。
    static u_int16_t id_new[1 << 16];
    register u_int16_t foff = (iph->frag_off) & ((1 << 14) - 1);
    static u_int16_t id_next = 0;
    //foff中保存了標志的最後一位和片偏移。如果為0,則沒有分片,直接賦值;如果首位為1、其餘為0,則為分片的第一片;
    //如果首位為1、其餘位不為0,則為分片的中間幾片

    //如果沒有分片
    if (foff == 0)
    {
        iph->id = id_next;
        id_next++;
    }

    //如果分片了並且是第一個
    else if (foff == (1 << 13))
    {
        iph->id = id_next;
        id_new[iph->id] = id_next;
        id_next++;
    }

    //如果分片了並且不是第一個
    else
        iph->id = id_new[iph->id];
}

uint8_t is_pppoe(char *s)
{
    return s[0] == 'p';
    // p 開頭就當是 pppoe 吧
}

unsigned int hook_funcion(void *priv, struct sk_buff *skb, const struct nf_hook_state *state)
{
    if (is_pppoe(state->out->name))
    {
        struct iphdr *iph = ip_hdr(skb);
        modify_ipid(iph);
        iph->ttl = 128;
        iph->check = 0;
        iph->check = ip_fast_csum((char *)iph, iph->ihl);

#ifdef XMUR_DEBUG
        printk("modified on wan.\n");
#endif
    }

    return NF_ACCEPT;
}

static int __init hook_init(void)
{
    nfho.hook = hook_funcion;
    nfho.pf = NFPROTO_IPV4;
    nfho.hooknum = NF_INET_POST_ROUTING;
    nfho.priority = NF_IP_PRI_MANGLE;
    nf_register_hook(&nfho);
    printk("xmu-router-patcher start\n");

#ifdef XMUR_DEBUG
    if (dev == 0)
        printk("0\n");
    else
        printk(dev->name), printk("\n");
#endif

    return 0;
}

//卸載模塊
static void __exit hook_exit(void)
{
    nf_unregister_hook(&nfho);
    printk("xmu-router-patcher stop\n");
}

module_init(hook_init);
module_exit(hook_exit);

編譯、安裝的大致步驟是:

  • 安裝編譯依賴項。參考這里

    sudo apt-get update
    sudo apt-get install git-core build-essential libssl-dev libncurses5-dev unzip gawk subversion mercurial ccache
    
  • 下載 SDK,SDK 的下載地址與對應型號、版本的 OpenWrt 固件的下載地址差不多,在同一個目錄下。解壓,進入文件夾。把以上源代碼保存到./package/xmu-router-patcher

  • 選中軟體包:

    make menuconfig
    

    選中 Kernel Module -> Other modules -> kmod-xmu-router-patcher 為 M。

  • 編譯:

    make package/xmu-router-patcher/compile V=sc
    

    2018.9.15補充:使用 LEDE 的 SDK 時,可能需要手動指定一些 MAKE 選項,包括目標平台、toolchain 目錄等。參考這里

  • 復制到路由器:

    scp ./bin/targets/ar71xx/nand/packages/kmod-xmu-* root@192.168.1.1:/tmp/
    
  • 然後ssh登錄到路由器,安裝:

    opkg install /tmp/*.ipk
    

    安裝好後會自動啟動。

  • 在內核日誌中看到xmu-router-patcher start字樣,即啟動成功。


一些想說的話

打個比方的話,就是:我花錢買了一度電,為什麼要管我接幾個燈泡呢?

之前看到有文件說:封路由器不是宿舍網路改造的原因,而是運營商封的;我去辦電信寬帶的時候順便問了一句,電信說我們沒有封,是學校封的。現在也不知道是哪邊的鍋。

後來又看到這篇文章,來自廈大官方,裡面列出了封禁路由器的種種原因。個人認為後兩點是不存在的(我從未見過門禁被影響過,也從未聽誰抱怨過 WiFi 信號被影響);第二點確實是這樣,但 XMU-CMCC 之類明文傳輸的豈不是更不安全。不過我覺得第一點可能有道理。

我看了第一點中提到的相關的法律,並沒有明確說不許用戶共享網路。那篇文章中的觀點大概是這樣的:法律規定,要是誰在網上鬧事了,要能追查到是誰幹的;而個人用的路由器不能提供有法律依據的記錄。我覺得這個雖然有因噎廢食的嫌疑,但確實可能有道理。

我還請教了一個法學院的研究所,問他我的行為是否違反法律或者校規。他的觀點是應該沒事(我等會兒再去問問他吧)。一年前的破解不僅技術上非常簡單,而且當時學校方面根本沒說不許接路由器,隻是確實設了一個檻而已;所以那時我是安全的。但這次,我覺得一旦出了事情,我很可能逃不了幹系;所以,需要在這里加一句:

本文章所述技術僅用於方便個人上網及學術研究之用,不要拿在這里學到的東西去搞事情(雖說好像也搞不了什麼事情),不許拿去掙錢,也請在使用路由器上網時保護好自己的個人安全和學校的網路安全。技術上的疑問本人會盡力解答或一起探索,但無論是硬體或軟體的損壞,或是錢財被盜、個人資訊泄漏、被學校查水表,均與本人無關。在這件事情上,我從未教唆任何人幹任何不該幹的事情。

好像太長了,我再總結一句:

不要搞事情,不許搞事情,也要避免別人拿你的路由器搞事情,萬一你們搞了事情跟我沒關系。

他剛剛回復了:「關鍵在於是否會通過惡意使用造成嚴重後果。沒有的話應該不會有問題。」我又問了一下:假如有人拿我的網發了不該發的東西,我會不會背鍋?他說,不會。

我宿舍的網路是這樣的:一個有密碼的,供宿舍使用;一個沒密碼的,供共享。對於後者,網關處我僅僅開放了一些上網必要的埠,順便也屏蔽了100.138.0.0/16(移動的局域網)的訪問;這樣他們肯定動不了我的路由器的設置,移動的那層局域網里的設備或者網關也訪問不了(之前有註意到移動開放著22埠,感覺可能危險)。另外,路由器的管理員密碼也隻有我一個人知道。算是努力避免危險吧。

但其實,我們的生活本來就不是絕對安全的,個人認為沒必要在這件事情上這樣小心:如果有人想害人,與其費盡心思破解網路,不如隨便在門口攤位上的調料盒裡撒一把毒。應該說,我們的幸福生活強烈地依賴於這樣一個事實:大部分人都是好人,雖然會有自己古怪的脾氣,但幾乎沒人是想害人的。我個人其實不願意像這樣斤斤計較地保護自己安全的,也就是這個原因:有這工夫,不如把精力花到其它事情上。我信任並且愛著我所生活的環境。

你看,我為了這個東西,滿打滿算花了兩個星期吧,大概是從起床幹到凌晨那麼算的兩星期。我暑假計劃了挺多事情,並且早就預料到時間不夠用;沒想到的是,我居然在路由器上花了兩三周。但是這兩三周也學習了不少東西的。從記不清網路分哪幾層開始學,從完全沒用過 Linux 命令開始學;網上並沒有現成的面向小白的教程。

開始投入的前兩三天重在嘗試各種技巧,比如兩台路由器串聯;後來才決定正面肝技術。首選當然是改 TTL 之類簡單的操作,但是並沒有用;然後嘗試修改 IPID,拿別人寫好的代碼適配 4.9 的內核,最終失敗,決定自己寫內核模塊。女朋友走後一個星期,我做出了改 IPID 的效果;然而發現,學校的管制已經鬆了很多,即使不改路由器也能長時間存活,改了也不能避免掉線。那時的感覺就是,自己一周的起早貪黑都餵了豬了。

後來發現一件事情:舍友的一個平板連上後,十分鐘內必定掉線。嘗試封殺xxx.meizu.com的訪問,掉線時間成了二十分鐘;又抓包尋找可疑的 IP,當時解決了他的平板的問題,可是隔壁的蘋果連上後又掉了。那時我計劃寫一篇文章,題目叫「記一次失敗的網路共享破解」之類,整理一下最近所學。

當然最後,我沒有寫那篇,而是寫了這一篇。

做到改 IPID 之後,我沒有再想到是 NTP 和/或 UA 的問題:因為當時我的手機連上一天都沒有任何問題,問題隻出在舍友平板上,因此一直懷疑問題是訪問了諸如 api-push.meizu.com 之類通常情況下電腦不會訪問的地址;一直在這里尋找問題,耗費了幾天。現在想來,可能是學校檢測 UA 的關鍵字不在Android而在其它;我的手機刷的第三方系統,所以恰好沒有關鍵詞。這些也隻是猜測了;也沒有必要去驗證了。

昨天晚上,舍友忽然說:浩南哥,WiFi 掉了!我趕緊看了看介面狀態,看了看認證日誌,沒掉啊;打開 b 站翻一翻,沒掉啊。後來找到原因了:他誤連了隔壁的 WiFi。這種感覺就很爽。自己付出了很多精力,也得到了相應的回報;雖然不是什麼大事情,但這樣實實在在的成就感就很舒服。

2018.9.14 補充:和別人聊了一下,他提到 2.4G 頻段確實很擠,體驗不佳;我個人確實沒覺得什麼。我有一個平板就隻支持 2.4G,用起來也從沒出過網路的問題;一個舍友的電腦也隻支持 2.4G,但現在不還是「真香」的狀態。另外,了解到一些宿舍樓每一間都有門禁,所以裝路由器會影響;或許可以試試把 2.4G 空出來,隻用 5G?

2018.9.14 又補充:看了看芳網上我的這篇文章下面推薦的文章,感覺比我膽大的人大有人在,有破解銳捷認證的,有用 IPv6 探索世界的,有大一不讓開網被破解的;一些文筆也是幽默。感覺自己忽然放心了很多。另外,我宿舍的網也是支持科學上網的,偶爾需要的話可以來蹭。


參考資料

還沒有補充完。