双虚拟机隔离上网完整教程

本文将以 VirtualBox + ubuntu + tor 为例,详细讲解搭建双虚拟机隔离上网环境的方法。

原材料

  • VirtualBox
  • Ubuntu Linux 16.04 镜像

隔离上网原理

双虚拟机隔离网络的拓扑结构如下图所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    INTERNET (via VirtualBox/Host)
|
| NAT [10.0.2.101 ==> 10.0.2.2]
|
|--------------|
| |
| SERVER | 192.168.56.101:9150 ==> tor
| | tor ==> tor proxy network
|--------------|
|
| Host-Only [192.168.56.101]
|
| Host-Only [192.168.56.102]
|
|--------------|
| | 127.0.0.1:8118 ==> privoxy
| CLIENT | privoxy ==> 192.168.56.101:9150
| |
|--------------|

双虚拟机隔离上网需要三个计算机系统同时参与,这三个系统分别称为 hostserverclient。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 中创建两个新的虚拟机,分别命名为 serverclient(或者任何你喜欢的名字)。在 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
2
3
4
sudo systemctl start tor    # 启动 tor 代理
systemctl status tor # 查看 tor 运行状态
sudo systemctl stop tor # 关闭 tor 代理
sudo systemctl restart tor # 重启 tor 代理

tor 代理的配置文件位于 /etc/tor/torrc 路径下。我们先关闭 tor 代理,对那个文件做一些必要的修改,再启动它。

在配置文件头部附近可以找到这样一行话:

1
## Tor opens a SOCKS proxy on port 9050 by default --

在这一段注释的后面加上如下两行内容:

1
2
SOCKSPort 192.168.56.101:9050
SOCKSPolicy accept *

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
2
forward-socks5t / 192.168.56.101:9050 .
forward localhost/ .

意思是,除了访问 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
2
3
Host *
ProxyCommand nc -X connect -x 127.0.0.1:8118 %h %p
ServerAliveInterval 30

这三行的大意是,对于任意目的地的 ssh 链接,通过 127.0.0.1:8118 端口进行转发,链接在 30 秒无响应之后自动切断。这样,就可以通过双虚拟机隔离上网使用 ssh 了。