主要目的是 ssh 到 Ubuntu16 虚拟机,练习 Linux 环境下的 C 语言编程,以及练习下 Linux 环境下的命令使用(用 vscode 的远程功能,结合 MobaXterm )。本机环境是 win10 环境。
PS:各位大佬,这个问题可能比较蠢。虽然我感觉桥接和 NAT ,对于我这个目的来说,应该没有本质区别。
我查看了“虚拟网络编辑器”,看了里面vmnet8的设置,并没有设置什么端口转发。 并且,NAT网络子网是192.168.135.xxx子网,然后我的虚拟机自身的ip是192.168.135.128。
然后我在宿主机里,直接ssh 192.168.135.128,发现是可以上去的。 所以大家说的端口转发,为啥我这里不需要呢?
另外附上,我宿主机里面,vmnet8网卡的ip信息:
同样的,也是192.168.135网段,ip地址是192.168.135.1。
并且,也没有和网关192.168.135.2冲突。
各位大佬,还有两个问题呢,求解答:
就是不管是桥接模式对应的虚拟网卡vmnet0,还是NAT模式对应的虚拟网卡vmnet8。虚拟机去上网的时候,其实根本没有通过这些虚拟网卡的。
而且,我现在理解,这两个虚拟网卡,只是为了主机和虚拟机之间能通讯:
不知道这个理解对不对?
另外,桥接模式下,有一个“复制物理网络连接状态”选项可以选,不知道这个选项到底起到了什么作用?
1
kujou 2023-09-23 10:51:12 +08:00
你如果在母鸡 ssh 过去,没区别。
|
2
LLaMA2 2023-09-23 11:10:04 +08:00
是的。
桥接时 VM 的网络和宿主机是平级 NAT 时 VM 的网络是宿主的下级 |
3
WingXi 2023-09-23 11:13:33 +08:00 1
桥接的话, 宿主机和虚拟机是处于同一个网段地址内
NAT 的话, 虚拟机是在另外一个子网内。 这种模式下,相互之间要实现访问,要么做 端口映射, 要么手工配置路由表(如果你的虚拟机平台支持的话) |
4
crysislinux 2023-09-23 11:23:04 +08:00 via Android
楼上说的对,nat 的话要做端口映射,桥接的话不知道 IP 稳定不,感觉还是 nat 好点
|
5
amiwrong123 OP @crysislinux
不稳定是指,因为 dhcp ,每次虚拟机开机,分配到的 ip 地址,都不一样吗 |
6
tabit 2023-09-23 12:21:53 +08:00
@amiwrong123 可以在虚拟机一侧配置静态 IP ,不存在 IP 变动问题。具体区别 2 楼已经说得很清楚了
|
7
amiwrong123 OP @tabit #6
好的。我理解,如果开启着 DHCP 的话,不管是桥接还是 NAT ,都会有 ip 地址变化 的问题吧。 |
8
tabit 2023-09-23 12:28:52 +08:00
@amiwrong123 如果虚拟机使用 DHCP 获取 IP 的话,是的
|
9
crysislinux 2023-09-23 12:45:29 +08:00 via Android
@amiwrong123 同一个路由器的话基本上还是分配同一个 IP ,换了网络变的可能性就大了。nat 的话,端口映射到本机的,你就用 127.0.0.1 就好了
|
10
amiwrong123 OP @crysislinux #9
嗯,笔记本一般只在家里用,网络应该不会变。我试了,就算开启了 DHCP ,多次重启虚拟机的 ip 也不会变。 |
11
amiwrong123 OP @kujou #1
@ye4tar #2 @WingXi #3 @crysislinux #4 @tabit #6 @crysislinux #9 各位大佬,看一下附言的问题呗,我看大家都说,ssh 到 NAT 虚拟机的话,都需要开端口映射。为啥我的就不需要呢? |
12
cjpjxjx 2023-09-23 13:07:48 +08:00 1
VMware Workstation 虚拟机安装后默认就会给宿主机添加两张虚拟网卡 VMnet1 和 VMnet8 ,分别用于“仅主机模式”和“NAT 模式”,你虚拟机网卡选了“NAT 模式”,虚拟机获取的 IP 就是和主机 VMnet8 虚拟网卡的 IP 在同一个网段,当然可以直接访问,你可以在宿主机用 route print 查看到直连路由表
区别: 桥接模式虚拟机需要连接到外部路由器,获取的 IP 地址是外部路由器分配的,所以除了宿主机,其他和宿主机同网段的设备也可以直接访问到虚拟机,如果是在公司或其他特殊环境,外部路由器做了 arp 绑定或没有 dhcp ,使用这个模式就可能连不上网或获取不了 IP 地址 NAT 模式 IP 地址是宿主机分配的,你的宿主机就相当于是一个路由器,虚拟机获取的 IP 地址和宿主机本身的 IP 地址不在一个网段,和宿主机同网段的的设备就无法直接访问到虚拟机了,需要在宿主机做端口映射才可以, |
13
cjpjxjx 2023-09-23 13:10:25 +08:00
|
14
studyrun 2023-09-23 13:19:46 +08:00
区别就是一个是桥接一个是 nat ,看似是废话
桥接的话,虚拟机网络和主机是平级,两者访问要经过路由器,好处是其他设备能直接访问虚拟机,坏处是网络速度受到路由器和网卡限制 nat 虚拟机就在主机下面了,坏处是局域网其他设备不能直接访问虚拟机,好处是主机和虚拟机之间网速不受限制,其他设备还是限制的 |
15
Cu635 2023-09-23 13:21:33 +08:00
vmware 的 nat 网络,guest 和 host 是可以通信的,host 上直接 ssh 虚拟机 guest 就可以了。如果是别的电脑连接 host 中的 nat 虚拟机 guest ,这个时候需要端口转发。
virtualbox 的“nat”网络,guest 和 host 是不可以直接通信的,配置端口转发之后 ssh localhost 是一个解决方案,而 virtualbox 的类似于 vmware nat 网络的“guest 和 host 能够通信,同时又是 nat 模式”的网络设置,叫“nat network”…… 可能是有人弄混了? 当然,对于 virtualbox 软件,当别的电脑连接 host 中的 nat 虚拟机 guest 的时候,也是需要端口转发的。 |
16
amiwrong123 OP |
17
amiwrong123 OP |
18
yolee599 2023-09-23 13:35:50 +08:00 via Android
NAT 模式相当于虚拟机生成了一个独立的内网,桥接模式相当于虚拟机弄了一个交换机把 Guest 暴露到了和 Host 同一个网络
NAT 模式 Host 想要访问 Guest 得做端口转发,桥接模式不用。 |
19
amiwrong123 OP @cjpjxjx
可以在宿主机用 route print 查看到直连路由表 —— 那我等会儿看一下这个命令的结果,估计能让我能更加理解这个原理。 他这个命令应该是把我,真实的无线网卡和虚拟机 vmnet8 网卡的信息都列出来了吧 |
20
yolee599 2023-09-23 13:38:53 +08:00 via Android
@amiwrong123 #17 你这说法不对,NAT 模式的网络拓扑软件模拟的,性能取决于虚拟机软件的性能。而桥接是系统内核的功能,性能最好
|
21
ww2000e 2023-09-23 13:39:16 +08:00
桥接相当于多一个网卡直接连进局域网,nat 网上解释很多
|
22
amiwrong123 OP @yolee599
你这么说的话好像也有道理。 |
23
kujou 2023-09-23 14:00:03 +08:00 via Android
nat 时母鸡和虚拟机不需要映射,ip 也不会变化。
桥接时 ip 是否变化又路由器决定 |
24
studyrun 2023-09-23 14:03:19 +08:00
|
25
GeruzoniAnsasu 2023-09-23 16:12:42 +08:00
|
26
sinotw 2023-09-23 16:21:45 +08:00 via iPhone
虚拟机和宿主机总是在一个子网里,如果从宿主机 ssh 虚拟机,那肯定是没问题的,如果是桥接,在子网的其他主机 ssh 虚拟机也没问题,但 nat 时,其他主机并不在宿主机和虚拟机组成的子网里,所以没有特殊设置的话是不能 ssh 到虚拟机的
|
27
Hopetree 2023-09-23 16:26:55 +08:00
强烈建议桥接模式,然后设置静态 IP ,这样你的虚拟机就跟主机一样的网络环境,其他同网络的也可以访问虚拟机,桥接网络和设置静态 IP 参考: https://tendcode.com/subject/article/vmware-bridged-network/
|
28
Admstor 2023-09-23 16:37:03 +08:00
如果用桥接模式
安装后本机出现的那 2 个虚拟网卡禁用也没啥影响 而且桥接模式会更像一个和你电脑平级的虚拟机 迁移后网络修改也更容易,甚至都不需要修改 |
29
akira 2023-09-23 16:46:54 +08:00
桥接破事情少一点。 不熟悉网络的话,无脑上桥接简单点。
|
30
fuis 2023-09-23 17:13:34 +08:00
我基本上都是桥接+tailscale ,比较方便
|
31
studyrun 2023-09-23 17:37:12 +08:00
@GeruzoniAnsasu #25 我用的 VMware ,笔记本用的 WiFi ,桥接模式两者只有百兆带宽(链接带宽 866Mbps )。
> 链路上的同网段机器不需要经过路由器转发。 这个前提应该是有交换机,wsl 我很久没用了,我记得它是有配虚拟交换机的,你这个速度很可能是走了虚拟交换机 |
32
ysc3839 2023-09-23 17:53:49 +08:00 via Android
@GeruzoniAnsasu @yolee599
Windows 版 VMware 的桥接功能是 VMware 实现的,不是操作系统实现的,Linux 版未知。 印象中 Windows 版 VMware 的桥接功能似乎更类似集线器,虚拟机和苏主机通信会绕到上层交换机,网速会受到限制,而且虚拟机内用 Wireshark 能抓到宿主机网卡收发的包,发现这种情况后我后面都不敢用桥接了。另外宿主机通过 WiFi 联网时,虚拟机桥接也获取不到 IP 地址,所以没特殊需求的话我还是不用桥接。 另外,Linux 下 libvirt 的桥接需要手动配置个 Linux 的网桥,把宿主机和虚拟机网卡添加进网桥,然后坑就来了,添加后宿主机要上网就只能在网桥这个设备(如 br0)上配置 IP 地址,原来的网卡是用不了的,也就是说如果你在很多地方写了网卡名称(如 eth0),那就必须全都改掉,非常麻烦。因此我没有特殊需求都不会使用桥接,VMware 和 libvirt 的 NAT 模式,虚拟机都可以访问宿主机,并没有什么大问题。 |
33
shijingshijing 2023-09-23 18:12:06 +08:00
桥接的话,Host 和 Guest 要通过路由器进行通信;如果只是 Host 和 Guest 之间 ssh ,scp ,没有上网的需要,选 Host-only 就可以了,Host 主机 192.168.2.1 ; Guest 虚拟机 192.168.2.33 这种配置,不管 Host 主机是否能连到外网或者路由器,Guest 都能通过这个 Host-only 的网卡与 Host 主机通信。
|
34
iceheart 2023-09-23 19:03:39 +08:00 via Android
nat 模式,你在宿主机上连虚拟机,就相当于在路由器上访问内网,当然可以直连。
别的机器上就没这待遇了。 桥接的意思,就是相当于把宿主机,虚拟机,外边的机器插在一个交换机上,相互访问无压力。 |
35
amiwrong123 OP |
36
amiwrong123 OP |
37
amiwrong123 OP |
38
amiwrong123 OP @Hopetree #27
看了这个文章,意思就是,就算路由器是开着 DHCP 服务的,我这个桥接的虚拟机 也可以强行设置一个 静态的 ip 地址呗 |
39
ysc3839 2023-09-23 19:55:04 +08:00 via Android
|
40
yolee599 2023-09-23 20:01:58 +08:00 via Android
@studyrun #24 #32 嗯,我是参考 QEMU 的网络介绍得出的结论,估计 Windows 和 Linux 有差别。见下面链接的 User Networking (SLIRP) 章节:
https://wiki.qemu.org/Documentation/Networking |
41
amiwrong123 OP @sinotw #26
虚拟机和宿主机总是在一个子网里,如果从宿主机 ssh 虚拟机,那肯定是没问题的 ---- 是的,我现在才理解这个道理。因为我的这个宿主机是有这个 虚拟网卡 vmnet8 的。 而其他的主机是没有这个虚拟网卡 vmnet8 ,其他的主机只能访问到我的宿主机。所以才需要端口转发,让其他的主机访问我的宿主机的某个端口,再转发到我的宿主机能访问到的虚拟机上面去。 不知道上面的理解,正不正确。 |
42
amiwrong123 OP @cjpjxjx #13
看了你这篇文章,我大概懂了。 在 NAT 模式下,那个 vmnet8 网卡,只是用来 host 与 guest 之间通信的。虚拟机上网时,根本就没走 vmnet8 网卡,而且通过虚拟 NAT 设备,去上的网。 我现在想理解一下,桥接模式下,那个 vmnet0 网卡,是不是也应该这么理解呀?只是用来 host 与 guest 之间通信的。 https://zhuanlan.zhihu.com/p/568564392 这篇文章却说:VMware0 没啥用,桥接可以上网的物理网卡,虚拟机就可以直接上网。而 VMnet0 是为物理机创建的虚拟桥接网卡,桥接 VMnet0 ,只能实现 VMnet0 虚拟网络内互通,无法访问外网,效果跟主机模式是一样的。 |
43
churchmice 2023-09-23 23:15:38 +08:00 via Android
我已经能预见到结局了
折腾两天把这些有的没的搞完了然后也不想学了 |
44
yeqizhang 2023-09-23 23:25:33 +08:00
@amiwrong123 没有虚拟网卡 vmnet0 。 是 vmnet0 交换机....
|
45
openbsd 2023-09-24 09:37:35 +08:00
|
46
openbsd 2023-09-24 09:39:16 +08:00
@amiwrong123 #16
第二个笔记本连接前 理论上应该还需要配置宿主机器的防火墙 |
47
Hopetree 2023-09-24 12:14:28 +08:00
@amiwrong123 是的,静态 IP 就是固定 IP ,很重要
|
48
qbqbqbqb 2023-09-24 18:00:48 +08:00
@yolee599 事实上 QEMU 真正实用方案里都不用 SLIRP 做 NAT 联网(用户态实现,性能太差),比如 libvirt ,用这个工具配置 NAT 网络用的是虚拟网卡(一般都是 bridge vnet 模式,实际上就是一个不添加物理接口的网桥;并不是那个真正的虚拟网卡 tun/tap )+ iptables NAT 的实现。也就是说 Linux 里,虚拟机的“桥接”和“NAT”都可以是内核实现。
而且不同虚拟化软件的差别也并非“Windows 和 Linux”的差别,主要还是看具体的虚拟化实现方案。 比如说 Linux 的 QEMU ,本体主要是个硬件模拟器,用它来实现全系统虚拟机的功能,自然有一些功能(比如刚才提到的网络;另外还有硬件加速 KVM 等)需要依赖于内核的实现;同时为了方便非 root 、无权限用户,又添加了像 SLIRP 这样的简易的用户态网络实现。 而 Windows 上的 VMWare 软件,本身就是自成一体的虚拟化方案,里面的虚拟网络功能都是自有的实现,不依赖 Windows 本身的桥接、NAT ( Windows 本身也内置 NAT ,比如 ICS 网络共享)等功能。 如果 Windows 上换成 Hyper-V ,情况又不一样。 |
49
qbqbqbqb 2023-09-24 18:17:03 +08:00
@qbqbqbqb 更正:上述表述有一些错误。linux qemu 实用的 NAT 网络宿主端为 tap 虚拟接口+网桥+iptables NAT 的形式(之前表述中“不使用 tap”有错)。
|
50
WingXi 2023-09-25 15:37:35 +08:00
@amiwrong123 我说到的是原理上肯定是需要的。
因为你并没有在你的帖子里面说你具体在什么系统下面用的哪个虚拟机的产品。 可能有一些虚拟机默认已经帮你配制了对应的转发端口,所以你用起来就会觉得是直接可以用。 |