如何在Linux虚拟机保持NAT/共享网络模式下访问主机所在局域网的192.168.x.y地址
如何在Linux虚拟机保持NAT/共享网络模式下访问主机所在局域网的192.168.x.y地址
我之前也碰到过和你一模一样的场景——Mac主机在192.168网段的局域网里,Ubuntu VM用NAT模式,只能通过10.0.2.2访问主机,但单个端口转发经常碰到端口冲突的问题。下面是我试过的几种靠谱方法,你可以根据需求选:
方法一:配置路由表实现全网段访问(最彻底的方案)
这种方法能让VM直接访问整个192.168.x.y网段,不用再逐个端口映射,完美解决端口冲突问题。
步骤1:开启Mac主机的IP转发功能
首先得让Mac允许转发VM过来的流量到局域网,打开Mac的终端执行:
sudo sysctl -w net.inet.ip.forwarding=1
如果想要重启后依然生效,编辑/etc/sysctl.conf文件,添加一行:
net.inet.ip.forwarding=1
步骤2:在Ubuntu VM里添加路由规则
在VM的终端里,先确认你的网卡名称(比如eth0或ens33,可以用ip a命令查看),然后执行:
sudo ip route add 192.168.0.0/16 via 10.0.2.2 dev eth0
这条命令的意思是:所有发往192.168.0.0/16网段的流量,都通过10.0.2.2(也就是Mac主机在VM里的IP)转发出去。
如果想要VM重启后路由规则依然存在,可以把这条命令加到/etc/rc.local文件里(Ubuntu 22.04可能需要先启用rc-local服务),或者用netplan配置静态路由。
方法二:用动态SOCKS代理访问多端口服务
如果只是临时需要访问多个不同端口的设备,不想改路由的话,可以用SSH的动态端口转发,相当于在VM里搭个SOCKS代理:
步骤1:建立动态转发隧道
在VM终端执行:
ssh -N -D 1080 user@10.0.2.2
这里-D 1080表示在本地1080端口开启SOCKS代理,-N表示只建立连接不执行远程命令。
步骤2:配置应用或系统使用代理
- 单个应用:比如浏览器,可以在设置里手动添加SOCKS5代理,地址填
localhost,端口1080。 - 系统级或命令行工具:可以安装
proxychains4工具,编辑/etc/proxychains.conf,把默认的socks4 127.0.0.1 9050改成socks5 127.0.0.1 1080,然后运行命令时加前缀,比如:
proxychains4 ping 192.168.x.y proxychains4 curl http://192.168.x.y:8080
方法三:虚拟机软件自带的端口转发(适合单端口场景)
如果你还是想用端口转发但避免冲突,可以直接用VirtualBox/VMware这类虚拟机软件自带的端口转发功能,比SSH转发更稳定:
- 以VirtualBox为例:打开VM的设置→网络→高级→端口转发,添加一条规则,协议选TCP/UDP,主机端口选一个没被占用的(比如9101),子系统IP填目标打印机的192.168.x.y地址,子系统端口填9100,这样VM里访问
localhost:9101就相当于访问打印机的9100端口了。
备注:内容来源于stack exchange,提问作者user513667




