本文将以 VirtualBox + ubuntu + tor 为例,详细讲解搭建双虚拟机隔离上网环境的方法。
原材料
- VirtualBox
- Ubuntu Linux 16.04 镜像
隔离上网原理
双虚拟机隔离网络的拓扑结构如下图所示。
1 | INTERNET (via VirtualBox/Host) |
双虚拟机隔离上网需要三个计算机系统同时参与,这三个系统分别称为 host
,server
和 client
。host 是 server 与 client 这两台虚拟机的宿主,负责提供硬件资源和互联网的最终接入点。server 有两块网卡,其中一块通过 NAT 与 host 相连,获取互联网连接;另一块与 host-only network 相连。client 只有 host-only network 一块网卡,因此它只能与 server 通信,没有直接访问互联网的能力。由于 client 的网络流量需要经过 server 转发,如果 server 能够确保这些流量通过特定的隐匿代理(比如 tor),那么 client 的上网流量就是安全的。
配置 VirtualBox 网络环境
为了在 host 中搭建网络环境,需要在 VirtualBox 中修改如下配置。
打开 VirtualBox -> File -> Preferences -> Network
创建 NAT Network
配置 NAT Network
进入 Host-Only Network 设定
修改 Host-Only Network 网络地址
修改 Host-Only Network DHCP 地址
本文中涉及的 IP 地址和端口号均可以改为其他数值,只需要保证各处的修改一致即可。
安装 server 与 client 虚拟机
我们在 VirtualBox 中创建两个新的虚拟机,分别命名为 server
和 client
(或者任何你喜欢的名字)。在 server 的配置选项卡中启用 NAT Network 和 Host-Only Network 两个网络适配器,而在 client 中只启用 NAT Network 一个适配器。待配置完成后,分别安装这两个系统。
在安装 server 时,可能会出现需要选择主网卡的情况,此时请选取 NAT Network 对应的网卡。
两个系统分别安装完毕后,进入下一节。
在 server 中配置网卡
我们的 server 有两块网卡,enp0s3
与 NAT Network 相连,enp0s8
与 Host-Only Network 相连。尽管 VirtualBox 为上述两个网络提供了自动分配 IP 地址的 DHCP 服务器,但为了保证 client 总能找到 server,需要为 server 分配固定的 IP 地址。修改 IP 地址的方法有多种,既可以用 ip
指令,也可以直接修改 /etc/network/interfaces
文件,还可以使用图形用户界面。在这里使用最简单的图形界面方式进行讲解。
进入系统设置 Network 选项卡
修改 NAT Network 设定
修改 Host-Only Network 设定,其中 Gateway 空着不填
请勿修改 Network proxy 的任何设定,保持不使用代理。
在 server 中配置 tor 代理
接下来,在 server 中安装 tor 隐匿代理。
1 | sudo apt-get install tor |
通常,按此种方式安装的 tor 会在开机时自动启动。请使用 systemctl is-enabled tor
加以确认。如果返回的结果不是 enabled,需要通过 sudo systemctl enable tor
设置自启动。
我们还可以使用如下的指令控制 tor 的行为。
1 | sudo systemctl start tor # 启动 tor 代理 |
tor 代理的配置文件位于 /etc/tor/torrc
路径下。我们先关闭 tor 代理,对那个文件做一些必要的修改,再启动它。
在配置文件头部附近可以找到这样一行话:
1 | ## Tor opens a SOCKS proxy on port 9050 by default -- |
在这一段注释的后面加上如下两行内容:
1 | SOCKSPort 192.168.56.101:9050 |
IP 地址 192.168.56.101 与先前 enp0s8 的 IP 地址对应。这两行设置的意思是,放行所有进入 192.168.56.101:9050 的流量,并通过 tor 代理转发它们。
保存配置文件,重启 tor 代理,这一步到此完成。
在 client 中配置 socks 代理
下一步,我们需要让 client 的网络流量通过 192.168.56.101:9050 这个 tor 提供的 socks 代理。我们将使用 privoxy
完成大部分的任务。
首先依旧是安装软件包。
1 | sudo apt-get install privoxy |
privoxy 默认也是开机自启动的,可以用 systemctl is-enabled privoxy
进行验证。它的配置文件位于 /etc/privoxy/config
。这个配置文件很长,请翻到 5.2 节,并在该节末尾处填写这两行内容:
1 | forward-socks5t / 192.168.56.101:9050 . |
意思是,除了访问 localhost 以外,其他流量会经过 socks 5 协议转发到 192.168.56.101:9050 端口上。随后,这些流量会进一步被 tor 监听和转发,从而实现隐匿的目的。
重定向 client 流量
我们已经配置好了 client 的转发规则,但现在 client 使用的依旧是 NAT Network,它与 server 的单向连接还没有打通。现在请关闭 client 虚拟机,在 VirtualBox 中把 client 的网络适配器改为 Host-Only Network,如下图所示。
重新启动 client 虚拟机,我们还需要为它分配固定的 IP 地址,并指定全局代理。
由于 privoxy 默认监听 localhost 的 8118 端口,我们可以这样设置系统的全局代理:
大功告成!
在 client 中为 ssh 配置代理
在上一节中,我们在 client 中为 HTTP/HTTPS/Socks 设置了 privoxy 代理,但这并没有涵盖其他网络协议。假如你需要透过代理创建一个 ssh 链接,那么需要为 ssh 单独设置代理。
ssh 的设置文件位于 ~/.ssh/config
下,如果没有这个文件请创建它。然后填写下面三行内容:
1 | Host * |
这三行的大意是,对于任意目的地的 ssh 链接,通过 127.0.0.1:8118 端口进行转发,链接在 30 秒无响应之后自动切断。这样,就可以通过双虚拟机隔离上网使用 ssh 了。