Evthron's blog

如何告別互聯網

以前,互聯網對我來説,是個充滿知識、幻想和樂趣的遊樂場。但現在,我卻在想盡辦法把互聯網從我的生活裏趕出去。原因很簡單,不就是因為互聯網是個充滿無用的知識、虛妄的幻想和過剩的樂趣的遊樂場嗎?在網上得到的樂趣,讓自己放棄了多少次反抗外界壓力的機會?又讓自己擱置了多少個改變生活的願望?

不過,如果你和我一樣,真的有放棄互聯網的決心,一定會一次又一次地失敗。原因無非有兩個。

第一,依賴決心。決心這玩意只在自己有決心的時候有用,沒有決心的時候就連廢紙都不如了,怎麼會有這麼不方便的東西?對付互聯網這麼吸引人的玩意,怎麼能靠自己一戳即破的決心?對抗誘惑,外界的束縛是最有用的。但是外界的束縛又讓人討厭,讓人有反抗的心思,而天底下沒有毫無破綻的束縛,一定會有漏洞,只要束縛一破,陋習就會變本加厲。所以,要點在於讓自己設下別人執行規則。

第二,限制過緊。要是像上面説的一樣,為自己設下牢不可破的障礙,像是把手機鎖在箱裏了,把電腦砸了,到了真的有需要用的時候,一定會氣急敗壞,悔不當初,從此絕口不提斷網的事情了。或許在別的世界裏,要得到好處就要抵得住誘惑,但是在電腦的世界裏沒有這種常識。把不需要的部分像挑魚刺一樣全部剔除,只留下自己需要的部分,才能算是個聰明的用家。

在經歷了數不清的後悔、數不清的悔改和數不清的重蹈覆轍之後,我終於摸索出了一套好用的工具來限制自己上網。雖然還不是很完美,但要是能全部用上,你就勝過大部分還矇在鼓裏的人了。

限制上網的方法從嚴格到寬鬆可以分為三種:禁止,預防,減少興致。禁止是封鎖自己上網的途徑,預防是防止自己發現新的資訊。減少興致是為自己上網增加一點麻煩。按你自己的需要配合着用吧。

手機

手機是最危險的。絕對沒有人需要隨時隨地都可以上網,想看什麼就看什麼的手機。對付手機,我只有禁止策略,沒有預防和減少興致的策略。

HelpMeFocus (Android)

不錯的 App 阻擋器。它可以把自己也阻擋掉,這是很重要的功能。

Universal Android Debloater (Android)

在 Android 上,Google Chrome,Youtube 和 Play Store 是系統預裝軟件,一般是刪不掉的。要動用 Universal Android Debloater (github) 這個大殺器才能除掉。

用不着 Play Store,也可以更新軟件。有些軟件會在官網上直接放出安裝包。要是沒有的話,多數也能在 APKMirror 一類的鏡像網站找到。實在沒有辦法的話,就暫時重新啓用 Play Store 吧。

螢幕使用時間 (iOS)

iOS 可不像 Android 那麼自由可以隨意禁用軟件,不過 iOS 的數位健康功能做得很嚴格,只能用密碼解鎖。

電腦

電腦能用的工具比較靈活,可以在瀏覽器裏安裝擴充套件,不像手機一樣,只能整個 App 屏蔽掉。

阻擋:Leechblock NG

這是必備的網站阻擋器。你可以試試各種各樣的封鎖策略,設置使用倒計時,或者按時間段封鎖,都是可以的。不過,我的經驗告訴我應該要做得絕一點,不需要上的網站就要完全封鎖。

如果有些網站讓你下不去手封鎖,就要仔細研究網站的域名,你可能只需要其中一部分讓你分心的頁面,例如我只需要看知乎專欄 zhuanlan.zhihu.com,而不需要知乎的問答部分 zhihu.com。

不過 Leechblock 是瀏覽器插件,只能阻止一個瀏覽器,誰也攔不住你安裝另一個。你能做的就只有把世界上所有瀏覽器的下載頁面封鎖掉。

阻擋:Cold Turkey Blocker

這個軟件比上面的更進一步,要求瀏覽器必須安裝它的封鎖插件才能啓動。封鎖的程度也很徹底,只要設了時間限制,除了捐錢沒有任何解除封鎖的方法,就算把軟件刪掉也沒用。一般人不可能知道它用了什麼原理,所以這是最強的封鎖軟件。沒有比絕對可靠的規則更讓人感到安心的東西了。

預防:uBlacklist

要是搜尋的時候總是看到那些自己已經擋掉的網站,一定會有解除封鎖的衝動,所以要讓阻擋了的網站從搜尋結果中消失,不讓自己意識到自己阻擋了內容。

新網站往往是最危險的。uBlackList 能在搜尋結果裏除掉自己不想看見的網站。

減少興致:uBlock Origin

你説不定知道這是個攔截廣告的軟件,但重點不是這個。這是個萬能攔截器,只要網站上有讓你分心的東西,像是百科全書底部能跳到其他相關頁面的連接,或是搜尋頁面上翻到下一頁的箭頭,你就可以用元素選擇器把它們除掉。

Youtube

值得為了 Youtube 專門開一段。Youtube 讓人又愛又恨的原因,是上面有數不清的實用學習視頻,而同樣也有數不清的無用娛樂影片。如果是要應付考試的話,看視頻可能比讀教科書還好,所以很難割捨。這自然也有應對方法。

阻擋:BlockTube

把自己不喜歡的頻道屏蔽掉。特別是那些上百萬次播放量的娛樂頻道。 還可以按時間和語言篩選。重要的教學影片都是英文的,不會太長也不會太短。

(video, objectType) => {

  // 只留下時長在5到50分鐘之間的影片
  if (video.vidLength > 3000 || video.vidLength < 300) {
    // Block the video
    return true;
  }
  // 要求影片至少要有 1000 觀看次數
  if (video.viewCount < 1000){
    return true;
  }

  // Custom conditions did not match, do not block
  return false;
}

排除所有不是英文的影片標題

/[^\x00-\x7F]+/

預防:Unhook

讓主頁和推薦影片欄都變得一片空白,然後好好管理自己訂閲的頻道。想看其他內容就只能自己搜尋了。

減少興致:yt-dlp

這是一套組合招式。在看 Youtube 之前影片前先下載好,讓自己考慮一下才決定要不要看。至少不會輕易點進一個多小時的遊戲直播了。

先用 Leechblock 禁止播放影片的 watch 類頁面,然後在 Ublock Origin 的自定義靜態規則裏加入 youtube.com##ytd-continuation-item-renderer,停用無限加載,最後在搜尋頁面複製好鏈接,扔進 yt-dlp 裏下載。

用 RSS 閱讀器集中內容

無論是 Youtube 還是新聞網站,都能用 RSS 閲讀器訂閲。這樣就能集中觀看自己訂閱的所有內容,不用在其他網站流連。電腦可以用 Feedbro,手機可以用 Feeder。

Linux

説這個之前先抱怨一句,研究網絡研究得越深入,就能找到越多破解網絡封鎖的辦法。什麼都不知道反而輕鬆,這就是知識的詛咒。不過既然已經開始研究了,就只能研究到底了。

Linux 和 Windows 其實並沒有什麼區別,除了 Cold Turkey Blocker 之外全部都能用。可能 Cold Turkey Blocker 的作者也知道,在 Linux 上不用瀏覽器也能上網,破解網絡封鎖的辦法也多的是,所以,封鎖網絡只能中斷網絡連接本身,這需要修改電腦的網絡配置才能實現。

網址要先轉換成 IP 地址才能上網,這個過程叫作「域名解析」。只要手動干擾域名解析,就能中斷網絡。

dnsmasq

首先要安裝一個域名解析工具,dnsmasq 能配合 Linux 上常用的網絡配置工具 NetworkManager 使用,是不錯的選擇。 在 etc/NetworkManager/dnsmasq.d/block.conf 裏,把自己要封鎖的網站一行行加進去。

address=/example.com/
address=/example1.com/
...

現在上 example.com 的時候就解析不了域名。

etc 文件夾裏的文件是系統設定,需要 root 權限才能修改。先限制好自己的 sudo 權限讓自己沒有辦法修改文件,然後把 root 密碼藏起來。這樣就沒有辦法修改 dnsmasq 的設定了。不過我還沒有這樣做。只要解除封鎖的過程足夠複雜,我就不會自找麻煩了。要知道,拆掉自己建好的東西是多麼痛苦啊。

網上也有一些別人辛苦整理好的封鎖列表,像是 dns-blocklists (github)。你也可以拿來用。

Delayed-admin

dnsmasq 只是在域名層面的一道基礎防禦,沒有辦法像 Leechblock 一樣靈活地控制開放時間和針對 URL 禁止網站。我只要下載另一個瀏覽器,就能繞開這些插件的限制,所以我還需要防止自己安裝瀏覽器。

在 Linux 系統裏,只要放棄 root 權限就安裝不了軟件,不過我既是用家,也是系統管理員,需要升級系統、更改系統設定,以後也需要安裝新的軟件,所以我不能這樣做。怎樣防止自己監守自盜的問題一直讓我很頭痛。用到 root 權限的頻率很高,所以我像不能把密碼放在家裏的硬盤裏,等到需要的時候才拿出來。

delayed-admin (github) 用很簡單的想法解決了我的煩惱:讓自己先等待一段時間,才能執行操作,就能抵住一時的鬼迷心竅,不會剛看完電影,急着上網看影評,發現影評網站被自己擋掉了就下載另一個瀏覽器,然後沉溺在沒有插件限制的網絡裏了。

詳細的原理是這樣的:在 Linux 裏,可以指定用户屬於什麼羣組,然後根據不同的羣組,分發不同的權限。具體會用到 sudo 這個程序分發權限。前面説到用户需要 root 權限來執行和修改系統設定有關的操作,但如果一直持有 root 權限的話,會有安全問題,所以一般都只會在需要的時候,用 sudo 指令臨時賦予自己 root 權限。在 sudoers 設定檔裏,可以細緻地設定什麼人,什麼羣組,可以在什麼樣的指令上使用 sudo。

而 delayed-admin 這個程序會新增一個 delayed-admin 羣組,這個羣組沒有常規的 root 權限,羣組裏的用户只能用 delayed 指令執行需要 root 權限的操作,等待一段時間後才會執行。做法是在 sudoers 文件裏加上一行:

%delayed-admin ALL = /usr/local/bin/delayed

這個 delayed 程序也很簡單,主體邏輯只有三行。

CMD=${@}
sleep "$delay"
$CMD

雖然很簡單,不過這就是我一直想要的工具。

delayed-admin 還有另一個模式,是讓自己在指定時間內離開 Wheel 羣組( 一般會在 sudoers 裏設定,讓 Wheel 羣組的用户獲得和 root 一樣的權限)。雖然我用不上,但因為我在安裝這個的時候遇到了點麻煩,所以還是在這裏記錄一下使用 setup.sh 安裝之後要做的事。

  1. 安裝 at,排程工具
  2. 手動建立 /etc/sudoers.d/delayed-admin,加入上面的 sudoers 設定
  3. 不要在 sudoers 裏給自己 root 權限,而是把自己加進 wheel group,再給 wheel group root 權限。

其他問題(su 和 kdesu)

要防止自己用 su 獲得 root 權限,需要在/etc/pam.d/su and /etc/pam.d/su-l 加上一句:

https://wiki.archlinux.org/title/Su#su_and_wheel

auth required pam_wheel.so use_uid

在 KDE 裏,如果用户需要 root 權限,會使用 kdesu 這個程序,讓用户輸入 root 密碼,這樣用户就可以用 KDE 的 Dolpin 文件瀏覽器進入系統管理員模式,繞過上面的限制。要防止這種情況,需要修改 Polkit (PolicyKit)的設定。

要先讓 kdesu 像 sudo 一樣運作,在 ~/.config/kdesurc 加入: https://wiki.archlinux.org/title/Sudo#kdesu

[super-user-command]
super-user-command=sudo

接着是修改 polkit,設定是根據 Bypass KDEsu Authentication Dialog (archlinux bbs)How do I “graphical-sudo” under KDE (not “su”)? (gentoo forum) 改的。

在 /etc/polkit-1/rules.d/10-admin.rules 裏:

// 讓 Wheel 羣組的用户輸入用户密碼,而不是 root 密碼。這部分和上面無關,只是不需要使用 root 密碼的話,就算換一個複雜一點的密碼,甚至直接消除密碼,無法登入 root 也沒問題。
polkit.addAdminRule(function(action, subject) {
    return ["unix-group:wheel"];
});

// 如果用户想在 Dolphin 裏面提升權限,直接否決
polkit.addRule(function(action, subject) {
    if (!subject.isInGroup("admin") && action.id == "org.kde.kio.admin.commands") {
        return polkit.Result.NO;
    }
});