问题描述
在使用虚拟机时,一般情况下桌面级虚拟化软件软件提供三种类型的网卡:bridge、host-only、NAT。使用bridge网卡可以使所有流量通过交换机进行交换,宿主机与虚拟机的互相访问也经由交换机,没网的情况下会很尴尬地连不上网,对于使用第三方终端(指宿主机SSH至虚拟机)操作Linux的用户来说,很不友好,且网络流量过大(宿主机<->虚拟机)对网卡负担也比较重。
使用host-only网卡,可以实现宿主机与虚拟机直接进行通信,且可以设置固定IP,唯一问题在于不能访问外部网络。
使用NAT网卡,无法设置固定IP(可以设置使用宿主机的相关设置,但是这不就是桥接了?)。
目的
无论宿主机网络状态如何,都可以通过SSH访问虚拟机,且虚拟机可以正常访问网络。
解决思路
以host-only模式为网卡,解决host-only模式没有网络的问题(顺便解决科学上网)。
步骤
宿主机设置
启用clash for windows (其他socks代理也可)的局域网访问功能,同时在Windows防火墙入站规则中添加规则,打开socks端口。
Windows 防火墙设置示例
虚拟机设置(以Ubuntu为例)
安装redsocks
sudo apt update -y && \
sudo apt install redsocks -y
修改redsocks配置
vim /etc/redsocks.conf
redsocks {
local_ip = 127.0.0.1;
local_port = 7890;
ip = 192.168.x.1; // replace x by yourself
port = 1080;
type = socks5;
}
编写启动脚本
#!/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权限运行
编写停止脚本
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
iptables -t nat -X
iptables -t nat -Z
systemctl stop redsocks