2011年9月4日 星期日

開啟網路蟲洞穿越時空,活用 SSH Tunnel VPN

Standard
最近去了一趟上海考察,尋找創業發展的機會,但機會暫且不論,此行確實深深體會在中國的網路世界非常不一般。中國和諧的社會實在不容許影響善良風俗的事情存在,許多外來的邪惡,一一被偉大的長城擋在外面。不過,道高一尺魔高一丈,很多人很聰明,懂得翻牆方法,進出自如,多數人使用 Reverse SSH Tunnel(有興趣可參考筆者舊文『Reverse SSH Tunnel 反向打洞實錄』)建立一個臨時的 Proxy Server,讓網頁連線繞道而行。

不過,使用 Proxy Server 的方式只能讓特定的通訊協定能夠不受防火牆的阻擋,如果說要全面性的逃脫網路限制和監控,就要靠 VPN(Virtual Private Network)的方式。VPN 是什麼?簡而言之,就是與遠端的網路環境建立通道,使電腦彷彿真實身處於遠端的內部網路一般。所以 VPN 一旦建立成功,除了可以存取遠方的內部網路,當然亦可以將遠端網路當為中繼站再連到網際網路,換言之,就是可繞過防火牆的一切限制。至於 VPN 的建立方法有很多種, 但都不在本文範疇,這邊要說明的是如何用 SSH Tunnel 建立 VPN。

設定必要的環境變數後,直接執行以下的 Script,就可以和遠端 Server 建立 VPN 連線:
#!/bin/bash

# Local Network
NETWORK=192.168.16.0
GW=192.168.16.1

# Server IP Address
SERVER=123.123.123.123
# Server 對外的 Interface
SERVER_IF=eth0

echo "Creating Connection"
ssh -w 0:0 -f $SERVER "ifconfig tun0 10.0.2.1 netmask 255.255.255.252 pointopoint 10.0.2.2 ; echo 1 > /proc/sys/net/ipv4/ip_forward ;/sbin/iptables -t nat -A POSTROUTING -o $SERVER_IF -j MASQUERADE ;route add -net $NETWORK gw 10.0.2.2 dev tun0"

echo "Settingi local interface"
ifconfig tun0 10.0.2.2 netmask 255.255.255.252 pointopoint 10.0.2.1
route add -net ${SERVER%.*}.0/24 gw 10.0.2.1 dev tun0
route add $SERVER gw $GW
route add default gw 10.0.2.1 tun0
route del default gw $GW
註一:如果不能正確建立連線,請先確認 SSH Port(22) 是否已被防火牆阻擋。
註二:記得修改 /etc/resolv.conf 的 DNS 設定,有些網路是直接在名稱解析做阻擋(如:在中國的網路)。

後記

SSH 有高度的安全性,透過 SSH 建立 VPN,也可以多少避免網路被當下的網路提供者竊聽。