wangyu- / UDPspeeder

A Tunnel which Improves your Network Quality on a High-latency Lossy Link by using Forward Error Correction, possible for All Traffics(TCP/UDP/ICMP)
MIT License
4.73k stars 832 forks source link

Q: win10 主机并不转发虚拟机的路由,这是为什么? #87

Open Justsoos opened 6 years ago

Justsoos commented 6 years ago

首先,感谢作者作这么好软件,还无私共享出来。 我的问题比较冷门,与本作有关,但不直接相关,由于比较特别,在网上很难搜到同样问题。有碰到这个问题的朋友之后也能从google搜到这里一起探讨。烦劳作者如果知道,也能指点一二。

我用win10最新秋季redstone,vmware workstation 12虚拟机使用作者给的LEDE作的小镜像(顺便说Virtual Box在win10下bugs极多,尽量别用了)。环境如下:

A,上网路由器192.168.1.1 B,vmware主机,192.168.1.100 安装 win10,通过wifi 连接 A 上网 C,用来作透明代理的wmware虚拟子机,192.168.1.80,桥接,安装的作者提供的LEDE 虚拟镜像。(后来也换成centos,ubuntu等,路由都失败了) D,其他同192.168.1.0/24 网段测试用Linux,桥接,等等

首先,上述机器全部联网在一个内网后,C 是打开 net.ipv4.ip_forward = 1 的,D 等等虚拟机可以直接通过设置 C 为 default gw 默认网关就能上网的,这个合理,没问题。

但是 B 无论如何无法通过网关设置为 C 上网(route add 0.0.0.0/0 via 192.168.1.80),用 wireshark 抓包,发现从 C 出来的 redirect 包是指向 -> B 的,但 B 之后就没有去往外网路由器 A 的包了,我又特意打开了 B (win 10)的 ip routing 开关,通过修改 注册表: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\ IpEnableRouter 设置为 1, 并打开了Routing and Remote Access 服务,但依旧无法使用。

简单说,也就是说win10 B -> 把路由包发往虚拟机LEDE, C-> ip forward 回到虚拟机主机 B -> 外网路由器 A。

这个链条,在最后一步失败了,win 10 并没有转发虚拟机来的路由包。 目前在虚拟机内 ping 外网,可以出现 (DUP)!三倍的显示,可以看作是 ip_forward 已经有效的后遗症,但win10死活无法通过虚拟子机路由,也就没法使用代理了。

还曾怀疑是windows禁止duplicate loop routing,但用其他 D 虚拟机都没问题。也不知道这么底层怎么调,问题没有什么方向。看看谁有相关经验?

防火墙应该不是问题,都关掉了。

wangyu- commented 6 years ago

你看一下这个文章,跟你说的差不多;virtualBox测试可用,反而是vmware不可以。

https://github.com/wangyu-/tinyFecVPN/wiki/tinyFecVPN运行在虚拟机中,加速windows和局域网内其他主机的网络

Justsoos commented 6 years ago

多谢 @wangyu- 回复这么快。 破娃酱写过一个文章,《局域网下免设置路由全局透明代理》据她的意思是,只要虚拟子机开 net.ipv4.ip_forward ,同网段本机就应该能通过虚拟机路由(她倒是没说是不是 win 主机),按照原理来说,这时候也根本不用配 iptables,只要路由就够了。但这一步就死活过不去。呵呵。 我再去试试 virtual box吧,不过最近win10 上思科这个vb bug成山,dhcp 都打不开。

我还是怀疑是win10 的原因多些。

Justsoos commented 6 years ago

多次尝试,还是暂时放弃了,Virtual box的官方论坛里各种抱怨win10 升级后bug太多,bridge 模式根本不能用。桥接模式调不出来的话,那就根本做不了 ‘真机’ 路由代理加速了,只能加虚拟机的。

相反,vmware 装上你作的udpspeeder的镜像后,开机就认出 dhcp 网卡,桥接没任何问题。

wangyu- commented 6 years ago

从我自己的体验来说,vb在win10 bridged模式很稳定,没有任何问题。如果VB和vmware一起开,有时会不稳定。

vmware的桥接本身没问题,DHCP也正常,但是用虚拟机做网关不能正常使用。

Justsoos commented 6 years ago

oracle 论坛里还有人说vb不支持 wifi 网卡连接的dhcp,现在都什么年代了,还天天插网线嘛?明明 vmware 用wifi dhcp好好的,而且,从原理来说,dhcp 和插不插 wired NIC 有关系吗? oracle 这帮开发人员,真是让人无话可说 。。。VB各种闹鬼。待会儿看看是否用英文反馈给 vmware 看看情况。 很奇怪你用 vb 很正常啊,oracle 内部和外面的论坛都吵翻了,win10 新版本各种bugs

Justsoos commented 6 years ago

补充更新:virtualbox 升级到去年12月放出的 5.2.4 版本之后,可以作正常桥接了,ip_forward 也没问题了。

futureproperty commented 6 years ago

我这virtualbox可以给其它虚拟机提供网关服务,但就是不能给局域网内真机提供网关服务,是网卡选择有什么讲究嘛?

wangyu- commented 6 years ago

我这virtualbox可以给其它虚拟机提供网关服务,但就是不能给局域网内真机提供网关服务,是网卡选择有什么讲究嘛?

在我这用vmware有跟你一模一样的问题,virtualbox反而没问题。 我觉得是虚拟机虚拟网络的bug,你换个版本试试,或者换vmware试试。

wangyu- commented 6 years ago

是网卡选择有什么讲究嘛?

只要是桥接模式,并且手动指定桥接到哪个网卡就可以了,没有其他的讲究

Justsoos commented 6 years ago

由于后来没有太多时间测这个,这个bug看来是常见问题。vmware和virtualbox 的到的结果相反,也多次遇到 @wangyu- 同样情况。我推测可能最终原因是虚拟网卡驱动之间有冲突。 就是那个 net.ipv4.ip_forward = 1 带来的问题。但看起来 vmware 和 virtualbox 的人对这事儿没啥认真的,google了很多经验,都不对劲

futureproperty commented 6 years ago

win10在没有注册表开启转发的时候,其虚拟机一样不支持转发(不管开不开ip_forward),建议使用hyper-V直接将原网卡虚拟,或者折腾VMware的网卡,毕竟在适配器列表里。

Justsoos commented 6 years ago

@futureproperty 看你的意思是已经搞定了?

我推测 windows 可能有一个路由黑洞,用来将重复转发的路由包丢弃,在 unix-like 内核处理于此策略不同,所以导致了这些问题。但没Google到相应内容.....

futureproperty commented 6 years ago

@Justsoos,linux也存在这个黑洞,更可怕的是如果宿主机开启转发,以virtualbox为网关的ip包在宿主机的时候就被转发出去了,virtualbox2.8测试。

Justsoos commented 6 years ago

我测试情况不一样,vmware 虚拟机开 net.ipv4.ip_forward = 1 ,其他虚拟机就都可以通过其转发上网。 不需要宿主机 win10 开服务。 到处是重复包,尤其ping 命令会提示 duplicate 包。我怀疑就是因为这个dup 判断,被 windows 的内核抛弃了包。

futureproperty commented 6 years ago

我就是你这个情况,虚拟机可以。但是局域网内真机测试是转发失败的

linhua55 commented 5 years ago

@futureproperty 最近也遇到这个问题,实际需求是 用VirtualBox虚拟机中的linux安装的mitmproxy抓包 同在一个局域网下的 Android 设备的http/https流量。但是 在linux虚拟机中(桥接的)设置了 net.ipv4.ip_forward = 1 , Android的wlan网关也设置成 虚拟机的ip,结果,Android设备就是访问不了网络。 经过几番尝试,发现以下方法可以:

  1. android的wlan网关还是设置成虚拟机的ip
  2. 在虚拟机所在的windows宿主机中打开 Routing and Remote Access 服务,这样android设备就可以访问网络了,虽然android的wlan网关还是设置成虚拟机的ip,实际上,流量并不经过虚拟机,此时关掉虚拟机,android设备也可以访问网络。
  3. 那怎么让流量经过虚拟机呢? 那就得设置 宿主机 Windows系统的网关 为 虚拟机的ip,这样 windows的流量就经过 虚拟机(经过实际测试,这样做是可以的),而android设备的流量经过Windows宿主机。这样间接的实现 android设备流量经过 虚拟机的目的。
Evilmass commented 5 years ago

@wangyu- @futureproperty @Justsoos 在有线网络下配置虚拟机代理网关,局域网内的真机流量可以正常转发,而无线网络下则没有任何流量经过,翻了好久终于找到这篇:https://www.virtualbox.org/manual/ch06.html#network_bridged

Bridging to a wireless interface is done differently from bridging to a wired interface, because most wireless adapters do not support promiscuous mode. All traffic has to use the MAC address of the host's wireless adapter, and therefore Oracle VM VirtualBox needs to replace the source MAC address in the Ethernet header of an outgoing packet to make sure the reply will be sent to the host interface. When Oracle VM VirtualBox sees an incoming packet with a destination IP address that belongs to one of the virtual machine adapters it replaces the destination MAC address in the Ethernet header with the VM adapter's MAC address and passes it on. Oracle VM VirtualBox examines ARP and DHCP packets in order to learn the IP addresses of virtual machines.

Evilmass commented 5 years ago

目前了解到的解决方案是:无线开共享给loopback网卡,然后Vbox桥接loopback。 亦或者使用能让连接设备的流量通过自身软件(驱动程序)的随身WIFI。

linhua55 commented 5 years ago

以下是不需要在 windows宿主机中打开 Routing and Remote Access 服务,也不需要在宿主机 Windows系统的网关 设置为 虚拟机的ip 的方法:

sudo ifconfig eth0 down sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv4.conf.all.send_redirects=0

// 混淆模式(需要在虚拟机软件的网卡设置中打开桥接网卡的混淆模式选项) 进行包路由, enp0s8 虚拟机桥接网卡名称 sudo brctl addbr br0 sudo brctl addif br0 enp0s8 sudo ifconfig br0 up // 让包经过三层(Tcp/ip层)转发(不drop的话,默认只是二层(mac层)转发) sudo ebtables -t broute -A BROUTING -i enp0s8 -j redirect --redirect-target DROP

// 过滤掉宿主机的包(172.18.0.73为宿主机的ip地址) // sudo ebtables -t broute -A BROUTING -i enp0s8 -s 38:a4:ed:f1:c9:7f -j redirect --redirect-target DROP 意思是 只三层转发(route) 来源mac地址为 38:a4:ed:f1:c9:7f 的包,其余的包只是二层转发(bridge) ,但这条命令并不对 // 不知道为什么使用 上面的 ebtables -s 没有生效 // 也许是 ebtables 早就不更新了,最新版是2011年的,用 nftables替代了 ,更进一步 // ebpf 不过 nftables还是没有没能替代 iptables sudo iptables -t raw -A PREROUTING -s 172.18.0.73 -j DROP

参考: https://security.stackexchange.com/questions/197453/mitm-using-arp-spoofing-with-kali-linux-running-on-virtualbox-with-bridged-wifi https://blog.csdn.net/zxygww/article/details/48056601 https://serverfault.com/questions/755287/forward-all-traffic-when-connected-to-a-hub

fbion commented 4 years ago

mark

KaseiHaku commented 5 months ago

我用 vmware VM bridge 模式,搭建 v2ray 透明代理,也碰到同样的问题,默认网关指向 VM IP 透明代理无效