路由器直接分配的网段是 192.168.0.0/24

主机 192.168.0.108 安装了几台 Vmware 虚拟机,网络模式为 NAT 虚拟机网段为 192.168.204.0/24 (主机 192.168.204.1,虚拟机 192.168.204.10-20 )

现在怎么才能让主机同路由器下的其他客户机(假设 192.168.0.107 )可以访问主机服务器上的虚拟机

我在主机上安装了 Open* 服务器,主机中的虚拟机中可以 telnet 连上客户机,但是客户机只能脸上主机,连不上主机上的虚拟机

%title插图%num

附上 server.o* 和 client.o*

port 1194
proto udp
dev tun

ca ca.crt
cert server.crt
key server.key
dh dh2048.pem

server 10.8.0.0 255.255.255.0

ifconfig-pool-persist ipp.txt

push “route 192.168.204.0 255.255.255.0”
push “dhcp-option DNS 8.8.8.8”
push “dhcp-option DNS 114.114.114.114”

keepalive 10 120
cipher AES-256-CBC

persist-key
persist-tun

status open*-status.log
log-append open*.log
verb 3
explicit-exit-notify 1
client

dev tun
proto udp

remote 192.168.0.108 1194

resolv-retry infinite
nobind
persist-key
persist-tun

ca ca.crt
cert client.crt
key client.key

cipher AES-256-CBC

verb 3

UnknownSky 1
UnknownSky 45 天前 via Android
正好前段時間有這方面的研究,給個參考鏈接,實測有用。Iptables 就解決了。
UnknownSky 2
UnknownSky 45 天前 via Android
你的意思就是說 Open* clients 暴露出來嘛
UnknownSky 3
UnknownSky 45 天前 via Android
https://unix.stackexchange.com/questions/449853/port-forwarding-using-open*-client
UnknownSky 4
UnknownSky 45 天前 via Android
https://unix.stackexchange.com/questions/432175/port-forwarding-to-*-client
UnknownSky 5
UnknownSky 45 天前 via Android
還有個方法,編譯 FullconeNAT Kernel module,和 iptables,直接實現 server Fullcone
lry 6
lry 45 天前
@UnknownSky 我的目的是让 NAT 后面的虚拟机暴漏出来,这样同局域网下的其他机器可以连上去。
lry 7
lry 45 天前
@UnknownSky 端口转发可以,但是这样就得为每一台虚拟机配置一个端口转发了,我觉得用 Open* 也可以实现这个效果,而且不用记住虚拟机配置的端口转发,直接使用虚拟机 ip 。(谁要连主机上的虚拟机,就直接装个 Open* 的客户端,但是我这配置好像有问题,连不上)
XiaoxiaoPu 8
XiaoxiaoPu 45 天前
在主机上抓包看看。
看你的 server 配置,把虚拟机所在网络的路由推送给了客户端,那么客户端到虚拟机的包应该会正确的发给主机,那问题应该就是主机没有转发给虚拟机,或者虚拟机的响应没有转发给客户端。猜测可能跟 VMware 的 NAT 模式下的网络限制有关(比如防火墙等)。所以先定位下具体哪里没走下去吧。
XiaoxiaoPu 9
XiaoxiaoPu 45 天前
另外有个疑问,如你所说,客户端和服务端在一个路由器下,已经在一个子网里了,就应该不需要再连 * 了,连 * 的需求是啥?
lry 10
lry 45 天前
@XiaoxiaoPu 客户端可以直接连服务端没问题,但是服务端上的虚拟机用的 NAT 模式(装的时候未选择桥接模式),客户端和虚拟机不在同一个网段。

JmmBite 45 天前
先理解什么是 NAT:
局域网访问互联网,经过 NAT 转换肯定没问题,
那你认为互联网主机可以逆向访问局域网主机吗?肯定不行。
如果要实现,那就还需要 外网到内网的 入口 NAT ;
XiaoxiaoPu 12
XiaoxiaoPu 45 天前
@lry 所谓的网段,影响的无非就是路由。在客户端上加一条 “192.168.204.0/24 via 192.168.0.108 dev eth0” 这样的路由,也能让客户端就知道发给虚拟机的包要交给主机来转发。

不过这两种方法都是可行的,都能实现让主机作为通信的中转节点。问题关键还是 VMware 的 NAT 是否有防火墙策略。分步排查吧:客户端 -> 主机 -> 虚拟机 -> (回应) -> 主机 -> 客户端,看看链路在哪一步断掉了。
JmmBite 13
JmmBite 45 天前
所谓 NAT 就是通过软件把主机当路由器,NAT 后面的虚拟机网络就是一个小型局域网。
所谓 桥接 就是通过软件把主机当成交换机,虚拟机直接暴露给外网。

如果是双向 NAT (路由转发),那就是 桥接(交换机)的功能了。
cdlnls 14
cdlnls 45 天前 via Android
如果跨 IP 网段,数据包就需要先把数据包转发给网关(路由器),然后由路由器判断下一跳去哪。所以你要在路由器上检查一下发往虚拟机的包发去哪里了,(一般路由器默认只有一个指向 wan 口的默认路由,不会有 vmware 定义的路由,所以数据包就直接从默认的 wan 口发走了)

你可以在路由器再加一个路由指向 vmware 的虚拟机,将发往虚拟机网段的数据包先转发给 vmware 。

*后在 vmware 上再转发给虚拟机。
cdlnls 15
cdlnls 45 天前 via Android
现在就是不确定的是,vmware 能不能把包正常转发给内部的虚拟机,这个没验证过。

我自己测试过 kvm 的 router 网络,是可以访问的虚拟机的。kvm 的 router 网络和 nat 应该差不太多。
lry 16
lry 45 天前
@XiaoxiaoPu
@cdlnls 我撤去了 Open*,直接在客户机上面加了一条静态路由 `sudo route -n add -net 192.168.204.0 -netmask 255.255.255.0 192.168.0.108`,同时抓包服务器上的以太网卡和 Vmware 的 nat 网卡,发现客户机 telnet 虚拟机的 tcp 包*次握手就收不到 ack,但是 虚拟机 telnet 客户机的包连接正常。这种一般会是什么问题

图 1: 192.168.0.107 –> 192.168.204.10
https://i.loli.net/2021/02/07/UrbXvO9En2764lH.png
图 2: 192.168.204.10 –> 192.168.0.107
https://i.loli.net/2021/02/07/zIPnVkiY2758THE.png
cdlnls 17
cdlnls 45 天前 via Android
@lry 看看客户机的路由表,和对应的虚拟的网络接口。
你这个不应该是这样加的,可能要指定一下接口
XiaoxiaoPu 18
XiaoxiaoPu 45 天前
客户机加的路由应该要指定网卡的。我一般用 ip 命令,不用 route 命令,这样试试 “sudo ip route replace 192.168.204.0/24 via 192.168.0.108 dev eth0”。eth0 是客户机的网卡名称,如果不是 eth0 需要替换下。然后可以在客户机上执行“sudo ip route show” 看下当前路由是否符合预期。

主机的防火墙策略也看一下,在主机上执行 “sudo iptables-save” 查看。
ourgoder 19
ourgoder 45 天前
我也类似 25,很多也不动
lry 20
lry 45 天前
@cdlnls @ourgoder 我这边客户机是 MacOS,主机是 Win10,虚拟机才是 Debian
贴了下客户机上面的路由,感觉这个路由没有问题 ?
https://paste.ubuntu.com/p/FxNdJV2n3X/
XiaoxiaoPu 21
XiaoxiaoPu 45 天前
windows 啊,那不了解了。

干脆一把梭吧,客户端跟虚拟机都连 * 里,通过 * 的网段通信 = =
ourgoder 22
ourgoder 44 天前
@lry #20 我试试哦
fzinfz 23
fzinfz 43 天前
vmware 改 bridge 模式

https://docs.vmware.com/en/VMware-Workstation-Pro/16.0/com.vmware.ws.using.doc/GUID-3B504F2F-7A0B-415F-AE01-62363A95D052.html

With NAT, the virtual machine and the host system share a single network identity that is not visible outside the network.
fzinfz 24
fzinfz 43 天前
收回#23 回复,貌似 NAT 支持 Port Forwarding: (多年未用 VMware-Workstation,仅纸上谈兵,逃~ )

https://docs.vmware.com/en/VMware-Workstation-Pro/15.0/com.vmware.ws.using.doc/GUID-E146C894-664C-479A-9E19-484400614BED.html
lry 25
lry 43 天前
@cdlnls @XiaoxiaoPu
这个问题解决了。如果 open* 用的路由模式 (dev tun),需要 win10 服务器上开启端口转发,并且在虚拟机里面添加一条静态路由( route add -net 10.8.0.0/24 gw 192.168.204.1 )
或者使用 open* 的桥接模式( dev tap ),将 open* 的 Tap-Windows Adapter V9 虚拟网卡和 VMware 的 Vment8 NAT 虚拟网卡桥接下
lry 26
lry 43 天前
@lry #25 说错了,应该叫路由转发。https://www.jianshu.com/p/3d5ada946a31
lry 27
lry 43 天前
@fzinfz 是的,这个可以,综上所述,我觉得还是 open* 的桥接模式方便点,不需要一个个配置