评论数:320条

多台电脑如何【共享】翻墙通道——兼谈【端口转发】的几种方法

★引子


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


★预备知识 & 准备工作


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

◇啥是“翻墙”?


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

◇啥是“代理”?


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

◇啥是“监听端口”?


  代理软件要正常工作,通常都需要开启一个“监听端口”。浏览器通过这个“监听端口”来跟代理软件建立连接。只有建立了连接,浏览器才能把数据发送到代理软件上。端口号是一个数字,范围在 165535 之间。

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


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

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

  对于 POSIX 系统(Linux & UNIX),把上述命令中的 find 改为 grep,具体如下:
netstat -an | grep "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》一文,俺就特别用红字,提醒大伙儿要小心防火墙的设置。结果还是有很多人因为防火墙的问题而中招,功亏一篑。
  俺再啰嗦一下:要特别小心操作系统中防火墙的设置。很多人是因为防火墙没设好,导致代理无法连通。
  如果你使用本文介绍的招数,却总是搞不定,可以参考下面的教程,用 netcat 诊断一下。
扫盲 netcat(网猫)的 N 种用法——从“网络诊断”到“系统入侵”


★如何共享【代理类】的翻墙工具?


◇问题


  大部分翻墙代理都会提供一个 TCP 的代理端口(就是刚才说的“监听端口”)。问题在于:很多翻墙代理的代理端口都绑定在 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 端口(也就是翻墙工具自身的端口)


★如何搞【端口转发】?


  (这招是本文的重点,单独开一个章节来细说)
  “端口转发”有时候也称为“端口映射”,洋文称为“port forwarding”。提及该术语,一般都是指 TCP 协议,有时候也称之为“TCP forward”或“TCP redirection”。
  用来搞端口转发的工具有很多,如果你去 Google 一下相关术语,应该能找到一大堆软件或解决方案。考虑到很多读者是菜鸟,俺挑选两种最简单的办法。

◇利用 Windows 自带的 netsh


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

  命令详解
  (以下命令需要管理员身份才能执行)
  添加端口转发的命令
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.0 connectaddress=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 的监听端口就看不到了

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

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

◇利用 rinetd


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

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

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

  运行
1. 把刚才写好的配置文件保存成 config.txt(俺只是举例,你也可以用其它文件名),把该文件跟 rinetd.exe 放到【同一个目录】。
2. 运行 cmd 进入 Windows 的命令行窗口(黑窗口)
3. 使用 cd 命令切换当前目录,使得“当前目录”是 rinetd.exe 所在的目录(不会用 cd 命令的同学,请自行 Google 之)
4. 然后执行如下命令
rinetd.exe -c config.txt

  上述命令执行之后,命令行窗口的光标会停止不动。不要以为 rinetd 死了,其实它已经开始工作。【这时候千万不要关闭这个 cmd 窗口】。为了保险起见,另外开一个 cmd 窗口,再用前面介绍的 netstat 命令,看一下本机开启的端口。如果正常的话,你就可以看到如下一行输出
TCP  0.0.0.0:12345  0.0.0.0:0  LISTENING

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

  缺点
1. 每次你关机或用户注销,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

  引申阅读:
  Privoxy 是一款功能很强大的工具。为了帮大伙儿更好地利用它,俺后来又专门发了一篇《如何用 Privoxy 辅助翻墙?》,有兴趣的同学可以去看一下。


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


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

◇步骤1


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

◇步骤2


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

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

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

◇引申阅读


  上述这个招数采用的是【代理/proxy】的方式共享翻墙通道。这个招数有一个前提,就是你的上网软件要有“代理功能”(也就是——能通过软件的“界面”或“配置文件”设置代理)。
  万一你使用的网络软件【没有】“代理功能”,咋办捏?请看下面这篇教程:
如何让【不支持】代理的网络软件,通过代理进行联网(不同平台的 N 种方法)


★结尾


  暂且写到这里。如果列位看官针对此话题有啥疑问,或者在实践过程中碰到啥困难,可以到俺博客留言。俺(有空的话)会尽量解答;有些热心读者也会帮忙解答。


俺博客上,和本文相关的帖子(需翻墙)
计算机网络通讯的【系统性】扫盲——从“基本概念”到“OSI 模型”
如何翻墙
获取翻墙软件方法大全》(教你在无法翻墙的情况下拿到翻墙软件)
如何让【不支持】代理的网络软件,通过代理进行联网(不同平台的 N 种方法)
如何用 Privoxy 辅助翻墙?
扫盲 netcat(网猫)的 N 种用法——从“网络诊断”到“系统入侵”
扫盲 Linux&UNIX 命令行——从“电传打字机”聊到“shell 脚本编程”
版权声明
本博客所有的原创文章,作者皆保留版权。转载必须包含本声明,保持本文完整,并以超链接形式注明作者编程随想和本文原始地址:
https://program-think.blogspot.com/2013/01/cross-host-use-gfw-tool.html