怎樣從外網訪問內網伺服器,網訪問內伺服器
假設內網有一個自己的電腦A(運行Win7),希望在家中用另一台電腦B(運行Win7)訪問內網資源。
先決條件
1. A機上可訪問外網並且可以安裝虛擬機器。
2. 擁有一個外網的VPS伺服器S(運行Debian),可購買BandWagon的廉價伺服器(http://bandwagonhost.com/),一年100多元。
原理
從A機發起到S的串連,並保持此串連。以此串連為基礎,建立從S到A的隧道。再將S所有到80連接埠的請求(HTTP請求)通過隧道轉寄到A機上,由A機作為S機的HTTP代理。外網B機建立從B到S的隧道,由S機作為B機的代理,從而實現 B -> S -> A -> 內網 的二級代理結構。
用到的主要軟體和命令
- ssh:Linux命令,建立串連;
- curl:Linux命令,抓取URL;
- delegate:Linux軟體,用於將HTTP請求轉換為SOCKS請求的Proxy 伺服器;
- iptables:Linux命令,路由表配置;
- VirtualBox:Windows軟體,虛擬機器;
- Ubuntu Server:虛擬機器作業系統;
- Bitvise:Windows軟體,SSH隧道代理;
- Privoxy:Windows軟體,用於將HTTP請求轉換為SOCKS請求的Proxy 伺服器。
一、建立反向隧道
1.1. 在A機上安裝UbuntuServer虛擬機器。
下載VirtualBox:https://www.virtualbox.org/wiki/Downloads
下載Ubuntu Server:http://www.ubuntu.com/download/server
1.2. 由A機發起,建立從A到S的反向隧道串連,命令格式:
ssh -R [NPORT]:localhost:22 -p [RPORT] [SUSER]@[S_IP]
NPORT :在S機上進行偵聽的連接埠。在S機上發往"localhost:NPORT"的資料包都將被直接轉寄到A機的22連接埠(SSH預設服務連接埠)。
RPORT:S機的SSH服務連接埠。
SUSER:登入S機的使用者名稱,一般為root。
S_IP:S機的公網IP。
執行此命令後,可能需要輸入SUSER在S機的密碼。反向隧道串連建立成功以後,即可作為S的終端進行操作(在A機上遠程登入到S)。
命令舉例:
ssh -R 876:localhost:22 -p 26131 root@14.12.83.20
1.3. 由S機發起,建立從S到A的SSH動態轉寄,即從S機到A機的SOCKS代理服務,命令格式:
ssh -f -N -D [SPORT] -p [NPORT] [LUSER]@localhost
SPORT:S機上SOCKS代理服務進行偵聽的連接埠。在S機上發出的以"localhost:SPORT"為SOCKS 代理的資料包都將被直接轉寄給A機。
NPORT:S機上偵聽的反向隧道連接埠,在第1.2步指定。
LUSER:登入A機的使用者名稱。
執行此命令後,可能需要輸入LUSER在A機的密碼。至此,從S機到A機的SOCKS代理已建立成功。
命令舉例:
ssh -f -N -D 1080 -p 876 devymex@localhost
1.4. 用curl命令測試連接,命令格式:
curl --socks4 localhost:[SPORT] [URL]
SPORT:S機上SOCKS代理服務進行偵聽的連接埠,在1.3步制定。
URL:任意網址。
命令舉例:
curl --socks4 localhost:1080 www.baidu.com
二、在伺服器端安裝delegated
登入到S機執行下列操作。
2.1. 如果沒有g++需要先安裝g++,命令:
apt-get install g++
2.2. 下載和解壓delegate(DeleGate Support Site),命令:
cd ~wget ftp://ftp.delegate.org/pub/DeleGate/delegate9.9.13.tar.gztar -xzf delegate9.9.13.tar.gz
2.3. 編譯delegate,命令:
cd ~/delegate9.9.13make
2.4. 運行delegate,命令格式:
cd ./srcdelegated -P[HPORT] SERVER=http SOCKS=localhost:[SPORT]
DPORT:S機上HTTP代理服務進行偵聽的連接埠。
SPORT:S機上SOCKS代理服務進行偵聽的連接埠,在1.3步指定。
命令舉例:
delegated -P8118 SERVER=http SOCKS=localhost:1080
2.5. 用curl命令測試連接,命令格式:
curl -x localhost:[HPORT] [URL]
HPORT:S機上HTTP代理服務進行偵聽的連接埠,在2.4步指定。
URL:任意網址。
命令舉例:
curl -x localhost:8118 www.baidu.com
三、在伺服器端建立連接埠轉寄
登入到S機執行下列操作。
3.1 清除已有nat規則,命令:
iptables -t nat -F
3.2 建立http 協議的連接埠轉寄,命令格式:
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports [HPORT]
HPORT:S機上HTTP代理服務進行偵聽的連接埠,在2.4步指定。
命令執行後,由S機發出的HTTP請求(80連接埠)都將被轉寄到HPORT連接埠上。
命令舉例:
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 8118
3.3. 用curl命令測試連接,命令格式:
curl [URL]
HPORT:S機上HTTP代理服務進行偵聽的連接埠,在2.4步指定。
URL:任意網址。
命令舉例:
curl www.baidu.com
四、外網機通過SSH隧道串連到伺服器
1. 在B機安裝Bitvise SSH用戶端軟體
:https://www.bitvise.com/ssh-client
2. 配置Bitvise SSH的Login頁
Host:S機的伺服器IP;Port:SSH服務連接埠;Username:登入使用者名稱;Initial method:password;Password:登入密碼。
3. 配置Services頁:SOCKS/HTTP Proxy Forwarding:Enabled;Listen interface:127.0.0.1;Listen port:1080。
4. 在B機安裝Privoxy。
:http://sourceforge.net/projects/ijbswa/files/
5. 配置Privoxy目錄下的config.txt檔案,並運行Privoxy:
listen-address 0.0.0.0:1984forward-socks5 / 127.0.0.1:1080 .
6. B機上的任意程式,以localhost:1984為HTTP代理,即可通過A機訪問內網資源。
備忘
1. kill掉delegate進程即可終止S機上的HTTP代理服務,刪除delegate的目錄即可完全卸載DeleGate。
2. 執行如下命令可取消80連接埠資料包的轉寄:
iptables -t nat -F
3. 斷開從A機到S機的串連,即可終止S機上的SOCKS代理服務。
4. 查看偵聽指定連接埠的進程ID,命令格式:
fuser -un tcp [PORT]
5. B機上建議使用Firefox+AutoProxy進行訪問。
AutoProxy:Firefox 21-27的AutoProxy擴充20131215更新
如果您有任何疑惑,或遇到任何問題,敬請評論或私信,協助我完善此方案。謝謝!