多台电脑如何共享翻墙通道

★引子


  元旦前后,俺写了《如何隐藏你的踪迹,避免跨省追捕》系列的第6、7篇——《用虚拟机隐匿公网IP》。之后有不少网友到博客留言,询问如何让不同虚拟机的软件共享翻墙代理。
  所以,俺今天就来聊一聊"多台电脑共享翻墙通道"这个话题。今天介绍的招数,既可以在不同虚拟机之间共享翻墙通道,也可以在不同的实体机(包括PC、平板、手机)之间共享翻墙通道。

  顺便说一下:在《用虚拟机隐匿公网IP(配置图解)》一文的末尾,俺又补充了一个章节——"验证虚拟机的隔离性"。那些使用虚拟机方案隐匿公网IP的同学,为了保险起见,要记得验证一下隔离性。

★准备工作


  考虑到俺博客的读者,有很多人不是 IT 技术人员。所以,俺先通俗地扫盲若干基础知识。

◇什么是"翻墙"


  如果你对"翻墙"还不太了解,建议你先看看俺写的《如何翻墙》一文。这篇扫盲教程可以说是面面俱到,很适合翻墙方面的新手入门。

◇什么是"代理"


  "代理"好比是一个中转站,可以中转你的上网数据流量,以此来避开 GFW 这堵墙。
  翻墙代理通常包括两部分:代理软件,代理服务器。代理软件安装在你的电脑上,代理服务器通常都位于墙外(也就是境外)。当你通过代理上网时,你的浏览器并不是直接连到目标网站。而是通过如下几个步骤:
1. 浏览器发送数据到代理软件
2. 代理软件把你的数据发送到墙外的代理服务器
3. 代理服务器发送数据到目标网站

◇什么是"监听端口"


  代理软件要正常工作,通常都需要开启一个"监听端口"。浏览器通过这个"监听端口"来跟代理软件建立连接。只有建立了连接,浏览器才能把数据发送到代理软件上。

◇如何看本机开启的监听端口


  对于 Windows 系统,在命令行窗口(先运行 cmd 就会出现命令行窗口)运行如下命令,可以看到本机开启的所有监听端口。
netstat -an | find "LISTEN"

  刚才有读者在留言中提问,俺再补充一下。用 netstat 的 o 选项可以看到每个监听端口分别是哪个进程开启的。命令如下
netstat -ano | find "LISTEN"

◇什么是监听端口的"绑定地址"


  以俺手头的虚拟机为例,执行刚才那个命令后,会显示如下
TCP  127.0.0.1:8118  0.0.0.0:0  LISTENING

  其中的 127.0.0.1 表示这个监听端口绑定的网卡地址,而 8118 表示监听的端口号。所谓的"绑定地址",意思就是说,这个监听端口只接受来自该网卡的连接。
  因为 127.0.0.1 表示本机网卡地址;所以,绑定在 127.0.0.1 表示该监听端口只接受来自本机的连接。
  如果要让某个监听端口接受任意连接(包括外部电脑的连接),可以把绑定地址设置为 0.0.0.0

◇小心防火墙的配置


  在《用虚拟机隐匿公网IP》一文,俺就特别用红字,提醒大伙儿要小心防火墙的设置。结果还是有很多人因为防火墙的问题而中招,功亏一篑。
  俺再啰嗦一下:
要特别小心操作系统中防火墙的设置。很多人是因为防火墙没设好,导致代理无法连通。

★如何共享翻墙的代理?


◇问题


  大部分翻墙代理都会提供一个 HTTP 的代理端口(就是刚才说的"监听端口")。问题在于:很多翻墙代理的代理端口都绑定在 127.0.0.1 上。也就是说,这个代理只能被本机的软件使用,外部电脑的软件无法连接到该端口。

◇解决方案之 "修改配置"


  最简单的解决方案,就是修改翻墙软件的配置,让代理端口绑定到 0.0.0.0 上。

自由门
到它的设置界面,点"更多设置",然后勾选"用自由门做服务器",可以把监听端口绑定到 0.0.0.0
GoAgent
GoAgent 的配置信息存储在 proxy.ini 文件中。打开该文件找到 [listen] 字段,然后把该字段下面的 127.0.0.1 改为 0.0.0.0 即可。

  可惜的是,很多翻墙软件都没有提供配置文件让你修改监听端口绑定的地址。所以,俺下面传授一个通用的招数,无需修改配置文件,可以搞定任何翻墙代理,让它的监听端口被外部电脑使用。

◇解决方案之 "端口转发"


  所谓的"端口转发",通俗地说就是让 A 监听端口的数据转发到 B 监听端口。
B 监听端口就是你的翻墙软件原先开启的端口
A 监听端口是新开的,而且绑定地址是 0.0.0.0
  如此一来,外部电脑就可以用 A 端口作为代理的端口,数据都发给 A 端口,然后利用"端口转发"功能,把数据转向 B 端口(也就是翻墙工具自身的端口)

★如何搞端口转发?


  端口转发是本文的重点,所以俺单独开一个章节详细说。
  用来搞端口转发的工具有很多,如果你去 Google 一下 "TCP proxy" 或 "TCP redirection",应该能找到一大堆软件和解决方案。考虑到很多读者是菜鸟,俺挑选两种最简单的办法。

◇利用 Windows 自带的 netsh


准备工作
对于 Vista 以及更新版本的 Windows (比如 Win7 Win8 ...)可以直接使用该方案。
对于 Vista 之前的 Windows(比如 WinXP、Win2003),需要先安装 IPv6 协议栈。具体步骤如下:
1. 以管理员身份登录,进入"控制面板"下面的"网络连接"
2. 选中本地连接,点右键,在右键菜单选"属性"
3. 弹出"属性"对话框,点"安装"按钮
4. 弹出"选择网络组件类型"对话框,选"协议",再点"添加"
5. 在弹出的对话框中选"IPv6",点"确定"

命令详解
(以下命令需要管理员身份才能执行)
添加端口转发的命令
netsh interface portproxy add v4tov4 listenport=新开的监听端口 listenaddress=新开端口的绑定地址connectaddress=要转发的地址 connectport=要转发的端口 protocol=tcp

删除端口转发的命令
netsh interface portproxy delete v4tov4 listenport=新开的监听端口 listenaddress=新开端口的绑定地址

命令举例
比方说,俺本地已经运行了 TOR,端口是 8118,绑定在 127.0.0.1
如果俺希望建立一个新的端口,端口号是 12345(这个端口号是俺随手编的,你也可以用其它端口号),绑定在 0.0.0.0
那么就执行如下命令。然后,发往 12345 端口的数据流就会被转发到 8118 端口。
netsh interface portproxy add v4tov4 listenport=12345 listenaddress=0.0.0.0connectaddress=127.0.0.1 connectport=8118 protocol=tcp

为了保险起见,再用前面介绍的 netstat 命令,看一下本机开启的端口。如果正常的话,你就可以看到如下一行
TCP  0.0.0.0:12345  0.0.0.0:0  LISTENING

如果要删除该端口转发,就执行如下命令
netsh interface portproxy delete v4tov4 listenport=12345 listenaddress=0.0.0.0
删除之后,再用 netstat 命令查一下,这个 12345 的监听端口就看不到了

优点
无需安装任何第三方软件
一旦设置好就会持续有效——即使系统重新启动也没关系。

缺点
需要以管理员身份登录,才能执行上述命令。
该方法只能用于 Windows 系统。

◇利用 rinetd


获取软件
rinetd 是一个很小巧的、跨平台的、开源的工具,它能提供 TCP 端口转发的功能。它的官网在"这里",上面提供了 Linux 平台和 Windows 平台的软件包。考虑到大多数同学用的是 Windows,俺针对 Windows 的使用介绍一下。
把那个 rinetd.zip 下载到本地,解压出来,里面有好几个文件(包括源代码)。你只需取出其中的 rinetd.exe 其它文件不需要。

编写配置文件
rinetd 的配置文件很简单,就是一个普通的文本文件,每一行对应一条转发规则。每一条转发规则包含4个字段,分别如下,字段之间用空格分开。
绑定地址 监听端口 转发的地址 转发的端口

配置文件举例
比方说,俺本地已经运行了 TOR,端口是 8118,绑定在 127.0.0.1
如果俺希望通过 rinetd 建立一个新的端口,端口号是 12345(这个端口号是俺随手编的,你也可以用其它端口号),绑定在 0.0.0.0
那么,转发规则就这么写
0.0.0.0 12345 127.0.0.1 8118

运行
把刚才写好的配置文件保存成 config.txt(俺只是举例,你也可以用其它文件名),把该文件跟 rinetd.exe 放到同一个目录。
运行 cmd 进入 Windows 的命令行窗口,然后进入 rinetd.exe 所在的目录,执行如下命令
rinetd.exe -c config.txt
为了保险起见,再用前面介绍的 netstat 命令,看一下本机开启的端口。如果正常的话,你就可以看到如下一行
TCP  0.0.0.0:12345  0.0.0.0:0  LISTENING

优点
该软件很小巧(整个下载包才 100 多 KB),而且是绿色软件。几乎不占用啥系统资源
无需管理员即可运行
跨平台

缺点
每次你关机或用户注销,rinetd 就退出了,下次要重新运行(为了方便,你可以把 rinetd 的启动命令加入 Windows 的启动项)

★如何共享翻墙的VPN?


◇问题


  用 VPN 翻墙,虽然可以让本机的所有网络软件自动通过 VPN 服务器中转。但是其它电脑的软件无法使用本机的 VPN 网络。

◇解决方案之 "Privoxy"


  "VPN 翻墙" 跟 "代理翻墙" 的技术原理不同——VPN 软件本身是不开启监听端口的。所以刚才介绍的端口转发,对于 VPN 软件是无效滴!
  不过没关系,咱们可以在本机运行 Web 代理或 SOCKS 代理,把监听端口绑定到 0.0.0.0,就可以让其它电脑的软件通过本机的 VPN 翻墙。考虑到大部分人翻墙都是为了浏览网页,俺重点介绍一下 Privoxy 这个工具。

获取软件
Privoxy 是一个老牌的、跨平台的,开源的 Web 代理软件,官网在"这里"。
在官网上有 exe 安装包,也有 zip 的压缩包(免安装)。下哪个看你自己的喜好(俺喜欢免安装的,比较绿色)。

修改配置文件
Privoxy 默认的监听端口是8118,绑定在 127.0.0.1 上。为了让其它电脑能连上来,需要修改绑定的地址。
Privoxy 的配置文件是 config.txt 。打开它,搜索 listen-address 会看到如下一行
listen-address  127.0.0.1:8118
修改为
listen-address  0.0.0.0:8118
即可

运行
直接双击 Privoxy.exe
为了保险起见,再用前面介绍的 netstat 命令,看一下本机开启的端口。如果正常的话,你就可以看到如下一行
TCP  0.0.0.0:8118  0.0.0.0:0  LISTENING

★如何共享虚拟机中的翻墙软件


  (还不了解虚拟机的同学,可以先看俺写的《扫盲操作系统虚拟机》系列教程)
  有些网友(包括俺)会单独开一个虚拟机(Guest OS),专门用来安装翻墙工具。在这个虚拟机上,除了翻墙工具,不放其它任何东西。这样做的好处之一是:即使某些翻墙工具有后门,也不会威胁到真实系统(Host OS)的安全。
  那么,如何把虚拟机中的翻墙工具共享给其它电脑(Host OS 之外的系统)用捏?

◇步骤1


  首先,你还是需要参照前面介绍的方法:
如果用代理翻墙,就搞端口转发;
如果用 VPN 翻墙,就新开一个 Web 代理。

◇步骤2


  配置虚拟机的网卡模式,可以有两种搞法。

对于 NAT 模式的网卡
你需要添加端口映射。主流的虚拟机软件(包括 VMware 和 VirtualBox)都有此功能。
该功能类似于刚才提到的端口转发,其原理是:把 Host OS 上的某个端口映射到某个虚拟机的 NAT 网卡上的另一个端口。
该方法配置稍嫌麻烦,VirtualBox 甚至没图形界面,还要敲一串命令。如果你对网络和虚拟机不太熟悉,俺不推荐用这种搞法。建议改用 Bridge 模式。

对于 Bridge 模式的网卡
如果网卡是 Bridge 模式,那就简单了,无需任何额外设置
因为这种模式的虚拟网卡,对于 Host OS 之外的网络是可见的。也就是说,(Host OS 之外的)其它电脑可以直接访问到此网卡——因此其它电脑的软件就能直接连上虚拟机中的代理端口。

★结尾


  暂且写到这里。如果列位看官针对此话题有啥疑问,或者在实践过程中碰到啥困难,可以到本文留言,俺会尽量解答。

版权声明

本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者"编程随想"和本文原始地址。

学习翻墙

用国外邮箱发信给help_gfw@yahoo.com即可收到翻墙教程
如有其它问题,用program.think@gmail.com联系俺


原文:编程随想

没有评论: