2010年10月21日 星期四

Firefox 和 VNC 坐 ssh 火車過山洞; 用 iftop 確認

firefox 坐 ssh 火車過山洞 [馬英九任內] 在 "無國界記者" 的 「媒體自由指數報告」 裡面, 臺灣雖然排名還 ok, 不過正在下降當中。 在大學裡面也感受到 P2P 被污名化 及網路封鎖等等 "借防盜版之名行網路控管之實" 的現象。 還好, 命令列控人士 (例如我) 每天在用的 ssh 遠端搖控服務 可以拿來幫各種被封鎖的連線服務鑿山洞 (Tunneling firefox/vnc traffic over ssh)。 所以不論你對下指令有沒有興趣, 都應該支持同事捍衛使用 ssh 的權利, 以保障自己的上網權。 此外, 在公共場所使用未加密的 wifi, 有洩漏隱私的風險; 改透過 ssh 通道上網, 也有保護安全的效果。

先以 firefox 突破封鎖為例。 如果貴公司/貴校/貴學術網路/貴國/... 跟某些集權國家一樣封鎖特定網站, 那麼你可以用 ssh 隧道鑽出去。 首先, 你必須在自由世界的某處有一個 ssh 帳號。 例如假設我到某個網路控管的甲地 (上圖左側) 出差, 而我在自由﹑ 不受控管的乙地 (上圖右側) 有一個 ssh 帳號 zzzzz@penguin.im.cyut.edu.tw。 如果在自由世界沒有朋友可以提供你一個 ssh 帳號, 該怎麼辦呢? 一般如果只需要網頁空間或存檔空間, 通常可以搜尋 「free web hosting」 或 「free storage」, 因為提供服務的廠商可以透過廣告賺到錢, 所以可以免費服務你。 但 ssh 帳號有完全的自主權, 提供者無法透過廣告賺錢, 所以通常都要使用者付費。 (一個月美金十元以下, 也還好) 請搜尋 「ssh hosting」

firefox 透過 ssh 隧道上網示意圖 其次, 就是設定你的瀏覽器, 讓它從這個自由世界的通道鑽出去。 MS Windows 用戶請見 小惡魔 Lenmore (簡中) 的文章; 以下是我在 linux 下的操作步驟。

  1. 用 ssh 打通一個隧道: ssh -4fND localhost:12074 zzzzz@penguin.im.cyut.edu.tw 這裡的 "12074" 是自己隨便選的 port number; 也可以改成任 65535 以下何一個不受限制的 port number。 (1024 或更高; 49152 以上最保險) 如果雙方都支援 ipv6 則可以省略 4, 變成 ssh -fND ... 詳見 這篇] [Windows 用戶: 在 putty 裡建立 SOCKS proxy 隧道]
  2. 回答完密碼, 隧道就打通了。 可用 ps x | grep ssh 確認。
  3. firefox 偏好設定 => 進階 => 網路 => 如何 => 手動設定 proxy 在 firefox 裡面, 編輯 => 「偏好設定」 對話框 => 「進階」 圖像 =>「網路」 分頁 => 「連線」 "設定 firefox 要如何連線到網路"
  4. 在 "設定存取網路的代理伺服器" 對話框裡面, 選擇 「手動設定 proxy」, 並且將 「socks 主機」 (不是「http proxy」!) 設定成 localhost, port 設定成 12074。 這個動作就相當於 "叫 firefox 轉向走入隧道"。 從現在開始, firefox 絕大部分的對外交通流量, 都是經過 ssh 隧道。 除了...
  5. DNS: 若希望連 DNS 也繞由 ssh 隧道出入的話, 請在 firefox 的網址欄打 "about:config", 然後發誓 "我一定會小心的", 就進入完整的手動設定頁面。 「篩選條件」 欄位填 "dns", 找到 network.proxy.socks_remote_dns, 點兩下設為 true。

about:config => network.proxy.socks_remote_dns 如果甲地本來就是沒有管制的自由地區, 雖然感覺上沒差別, 但還是可以檢視這個設定的效果。 搜尋 「my ip」 會找到 123 之類的網站, 告訴你: 從它眼裡看來, 你的 IP 是多少。

或者也可以用 iftop -i eth0iftop -i eth1 之類的指令, 檢視你的網卡對外不同 IP 的流量。 右邊三直行顯示的是最近 2 秒﹑ 10 秒﹑ 40 秒, 你的機器透過該網卡對各站的上傳/下載的每秒平均資料流量。 左邊反白越多, 就表示最近 10 秒平均資料流量越高, 見下方兩張圖。 左圖是 firefox 直接上網; 右圖則是透過 ssh 隧道, 你可以看到 firefox 彷彿只與 penguin.im.cyut.edu.tw 在對談。

直接上網時, 用 iftop 可看到自己的電腦很多網站對話 走 ssh 隧道時, 用 iftop 可看到自己電腦的談話對象只剩 ssh 主機等少數網站

至於 chromium 的話, 要這樣啟動: chromium --proxy-server="socks5://localhost:12074" 詳見 官網文件

* * * * *

遠端桌面工具 vnc 也可以用類似的方式突破封鎖。 這次是我所管理的 penguin, 被鎖在防火牆後面, 我無法從外面用 vnc 連進去使用 penguin 的桌面。 於是只好:

  1. 在雲端的 penguin 上啟動 vnc (隨便選一個 port 5947): tightvncserver :47
  2. 在本地端用 ssh 鑿一個隧道: ssh -fNL 8805:localhost:5947 xxxxx@penguin.im.cyut.edu.tw
    [Windows 用戶: 用 putty 幫 vnc 建立 ssh 隧道]
  3. 在本地端啟用 vnc 客戶端連線, 從 8805 (隧道入口) 鑽出去: xvncviewer localhost:8805

* * * * *

搜詢 "firefox ssh tunnel" 或 "vnc ssh tunnel" 可以找到很多類似的講義。 若遇到錯誤, 可參考 SSH Troubleshooting。 (我曾將 firefox 設定當中的 socks 的版本誤設成 4, 用錯誤訊息搜尋到這一頁。) 在言論管制的國家使用 ssh tunnel, 還有保護隱私的功效。 詳情請搜尋 ssh tunnel censorship。 會不會有一天 ssh 也被封鎖掉呢? 那就要看貴單位有多少經常性的 ssh 用戶囉。 請架設 linux 伺服器, 平常就要鼓勵大家 多使用 ssh 與 vnc 作為雲端方安。 萬一那一天連 ssh 都要被封掉的時候, 才有人站出來與你一起並肩捍衛貴單位的網路自由。 不然像我現在... 就只我一個人要用 vnc, 其他人完全聽不懂我在講什麼, 好像我是要求特權的怪咖一樣 orz 沒有人會幫我說話啦... 還好被封的是 vnc 而不是 ssh。

封鎖網路無助於禁止盜版, 只會造成合法使用者繞道不便, 以及浪費運算資源。 詳見 「各種封鎖網路的方式: 從新疆的乖乖網到臺灣的智財戰」。 其實就算 ssh 被封了, 也還有 openvpn﹑ http tunnel gnu http tunnel 等等其他的替代方案。 如果願意花錢, 搜尋 「network tunneling freedom」 或 「network tunneling privacy」 也可以找到許多種不同的付費方案。 數位高牆, 永遠擋不住資訊洪流。 因為...

Information wants to be free. 資訊渴望自由。

4 則留言:

  1. 感謝~之前困擾我很久的ssh tunnels觀念一下子就稿懂了,原來是這麼簡單的概念,之前看一些書或網頁的文章,還不如您寫的一秒就懂,感恩~~~~

    回覆刪除
  2. 貴哥的文章都可以把很艱深的理論講的很簡單 (深入淺出), 尤其是很多實作, 實作可以讓原本抽象的理論變得很好理解.

    謝謝貴哥持續為自由付出努力, 我到現在還是偶爾會爬到你之前那個舊站 (大片黃色背景那個).

    回覆刪除
  3. 另外有些連結斷了, 像是 「各種封鎖網路的方式: 從新疆的乖乖網到臺灣的智財戰」.
    我不知道你要不要修, 不過我用 google 找標題還是可以找的到.

    回覆刪除
  4. 連結修好了。 謝謝大家支持呵! 被誇獎超開心的。 如果還有哪一篇看不懂, 歡迎針對痛點精確提問, 我再來想想能否換一種方式來說明, 讓文章更清楚。

    回覆刪除

因為垃圾留言太多,現在改為審核後才發佈,請耐心等候一兩天。