问题描述

在使用虚拟机时,一般情况下桌面级虚拟化软件软件提供三种类型的网卡:bridge、host-only、NAT。使用bridge网卡可以使所有流量通过交换机进行交换,宿主机与虚拟机的互相访问也经由交换机,没网的情况下会很尴尬地连不上网,对于使用第三方终端(指宿主机SSH至虚拟机)操作Linux的用户来说,很不友好,且网络流量过大(宿主机<->虚拟机)对网卡负担也比较重。
使用host-only网卡,可以实现宿主机与虚拟机直接进行通信,且可以设置固定IP,唯一问题在于不能访问外部网络。
使用NAT网卡,无法设置固定IP(可以设置使用宿主机的相关设置,但是这不就是桥接了?)。

目的

无论宿主机网络状态如何,都可以通过SSH访问虚拟机,且虚拟机可以正常访问网络。

解决思路

以host-only模式为网卡,解决host-only模式没有网络的问题(顺便解决科学上网)。

步骤

宿主机设置

启用clash for windows (其他socks代理也可)的局域网访问功能,同时在Windows防火墙入站规则中添加规则,打开socks端口。
Windows-Firewall-Setting
Windows 防火墙设置示例

虚拟机设置(以Ubuntu为例)

安装redsocks

1
2
sudo apt update -y && \
sudo apt install redsocks -y

修改redsocks配置

vim /etc/redsocks.conf

1
2
3
4
5
6
7
redsocks {
local_ip = 127.0.0.1;
local_port = 7890;
ip = 192.168.x.1; // replace x by yourself
port = 1080;
type = socks5;
}

编写启动脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
# start redsocks
systemctl start redsocks

# Create new chain
iptables -t nat -N PROXY

# Ignore LANs and some other reserved addresses.
iptables -t nat -A PROXY -d 0.0.0.0/8 -j RETURN
iptables -t nat -A PROXY -d 10.0.0.0/8 -j RETURN
iptables -t nat -A PROXY -d 127.0.0.0/8 -j RETURN
iptables -t nat -A PROXY -d 169.254.0.0/16 -j RETURN
iptables -t nat -A PROXY -d 172.16.0.0/12 -j RETURN
iptables -t nat -A PROXY -d 192.168.0.0/16 -j RETURN
iptables -t nat -A PROXY -d 224.0.0.0/4 -j RETURN
iptables -t nat -A PROXY -d 240.0.0.0/4 -j RETURN

# Anything else should be redirected to port 7890
iptables -t nat -A PROXY -p tcp -j REDIRECT  --to-ports 7890
iptables -t nat -A OUTPUT -p tcp -j PROXY
iptables -t nat -A OUTPUT -p udp -j PROXY

使用root权限运行

编写停止脚本

1
2
3
4
5
6
7
iptables -F  
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
systemctl stop redsocks