aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
阅读:16331回复:59

问问openvpn下的虚拟网卡问题

楼主#
更多 发布于:2007-04-27 09:36
  有人看过tap_win32的代码? 是关于虚拟网卡的。
我看了一下,应该就是一个普通的物理网卡去掉硬件部分的代码

但是以前我作物理网卡的驱动时候,看过ne2000和e100bex代码
发现tap_win32里面多了一些我不是很理解的代码。

是关于tun点对点的和dhcp的。以前没看过这方面的。
很奇怪 我可以将这部分代码删掉吗?
在ne2000和e100bex代码里面没看到相关这部分的代码啊。

恳请cyliu与zhaock等大侠赐教
周维彬
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
沙发#
发布于:2007-04-27 09:46
还有就是那个processARP和processDHCP的那个问题
这个我也想去掉

可以吗
周维彬
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
板凳#
发布于:2007-04-27 10:01
不能去掉。去掉了就没有模块处理arp,那么上层得不到反应就不会工作。保留就可以,只需要关系你自己需要关系的部分。

这个代码相对简单,可以参考passthru来学习,原理是一样的。

你在作硬件部分完全可以不理会arp等,但是这里是模拟网卡。而且该网卡的arp等不需要发送出去,因此虚拟网卡就模拟了一个返回值。
走走看看开源好 Solaris vs Linux
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
地板#
发布于:2007-04-27 10:09
我看了代码 processarp确实就是直接模拟一个返回值
arp可以不用理了
那么那个tun和那个dhcp呢
周维彬
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
地下室#
发布于:2007-04-27 11:54
看了一下 好像dhcp那个也是不能删除的
tun这个点对点的嘛。。。。还是不太清楚

我现在想实现的是:
假设有一个物理网卡 ,我再虚拟出一个虚拟网卡。
所有经过物理网卡的数据包都经过我虚拟网卡发送和接收。
呵呵 这个还搞不清楚怎么作就对了。但是总体想法就是这样。

虽然用passthru也可以实现,但是我的任务就是用虚拟网卡来实现看看。
netpas就是这么实现的
周维彬
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
5楼#
发布于:2007-04-27 13:47
哎呀 这个怎么实现啊
痛苦啊
像是回到了当年作IMD和TDI的时候了

好多问题至今搞不清楚
假设我安装了我的虚拟网卡驱动,
那么我怎么才能得到要发给物理网卡的数据包呢
接收的时候怎么得到物理网卡真正接收到的数据包。
感觉总是怪怪的。以前作imd和tdi甚至看了一些hook的。
它们的关系像是串联。经过物理网卡的都会经过imd/tdi等
但是现在多出一个虚拟网卡来,这个像是并联的关系。经过物理网卡的不一定会经过我的虚拟网卡啊。

呵呵 小小的问题 帮忙 解决一下啊 。
那个zhaock大侠你在哪里,
cyliu大侠 你先不要走啊

希望能在五一之前搞定这个问题 。。。

祝大家五一快乐
周维彬
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
6楼#
发布于:2007-04-27 14:03
我看了一下netaps的log记录
里面也有
2007-04-27 10:40:40 ADAPTER: Setting a DHCP IP of 10.103.161.146 on interface {C44628AB-EAAF-4346-ACF0-47EB25351FEE} [DHCP-serv: 10.103.161.145, lease-time: 172800]

这段关于dhcp ip和 dhcp serv的信息 这个和tap_32很像。
呵呵 到底是在干什么的啊
周维彬
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
7楼#
发布于:2007-04-27 17:11
奇怪的是 我现在把mux的代码 看了一遍
里面根本没有关于arp和dhcp的代码

其中他的如何得到和转发数据包,都是依靠adapter的blindinghandle和miniporthandle。

但是mux不是也是可以虚拟出多个网卡吗?
周维彬
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
8楼#
发布于:2007-04-28 11:22
cyliu大侠 你放假了 是吗?
看来这个五一 很不好过啊
周维彬
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
9楼#
发布于:2007-04-28 17:31
我现在还不太明白你的意思:是否是无论任何数据包都需要经过虚拟网卡才能通过物理网卡,对用户来说是透明的?

如果是上面所说的情况,解决办法则:

1 是否考虑修改路由表,使所有的数据报都指向虚拟网卡。然后虚拟网卡再进行转发给物理网卡?

2 是否可以拦截所有物理网卡数据报,直接发送到虚拟网卡中,然后再转发到物理网卡?

可以考虑一下。
走走看看开源好 Solaris vs Linux
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
10楼#
发布于:2007-04-28 18:12
我是想实现大概和netpas一样的功能  
netpas是一个网络加速器,其实作用就是改路由 。而我要实现的正是改路由。
我看过netpas的sys了。我用文本打开 里面也有很多tap_win32和openvpn的字样。。
可以确定他就是在tap_win32基础上更改而来的

我要实现的就是将原本要访问远程的数据包修改目的地址和端口。
然后扔出去。这一点对用户来说是透明的。
怎么用openvpn虚拟出一个网卡来实现这个功能呢。

不用IMD的passthru来实现。谢谢
周维彬
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
11楼#
发布于:2007-04-29 07:38
1 再tdi层修改数据包源地址为虚拟网卡地址

2 数据包经过路由被送到虚拟网卡

3 虚拟网卡修改数据源地址为真实物理网卡地址

4 虚拟网卡重新把数据包送入发送网络对栈,可直接送到ip层发送即可或者送到tdi或者应用层处理。
走走看看开源好 Solaris vs Linux
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
12楼#
发布于:2007-04-29 16:17
netpas一定不是通过tdi实现这么麻烦转路由的事情的。
我作过tdi.我看了一下注册表没有这项服务。搜索了一下文件夹system32的和driver下的。
根本没有新增加的sys驱动。还有其他的一些判断,它一定不是用tdi实现的。

还有她的netpas.sys大小只有23k,我free的编译了一下tap_w32。大小只有26k。
如果去掉一些debugprint的信息的话 差不多也是这么大的文件。

我判断改路由的动作应该不是这边做的(个人意见)。
这个netpas.sys应该就是简单的tap0801.sys了。
周维彬
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
13楼#
发布于:2007-04-29 16:48
我快不行了 很头痛很受伤:(

现在我将tap_win32编译成一个tap0801.sys。
然后用ddk的devcon.exe进行install和remove。
可以在网上邻居里面生成和删除出一个本地连接图标。但是带了个大打叉。

想问懂得openvpn的大侠们几个问题。也许满简单的,但是我网上就是找不到我要的内容。
1.客户机A(windows)安装了openvpn,服务器(linux)也安装了openvpn。并且配置好(虽然说还不会)。那是不是说所有A要访问网页等的数据包都会变成先经过服务器了。还是说只有A要访问B(和A一样的客户端)的时候才会通过服务器呢?A和B进行通讯,是否每次都要经过服务器。还是就第一次通过服务器。后面都自己进行点对点的通讯不经过服务器。
2.客户端A安装了openvpn。那客户端访问一个地址(譬如:a.b.c.13)。那是不是所有要访问这个ip的数据包都变为desip为服务器ip了。还有根据openvpn。这个包被封装为什么包呢?UDP?tcp?
3.怎么办,还是说应该怎么配置,才能去掉那个新增加的本地连接的打叉符号,让这个本地连接连接到网罗上。
4.还有想知道这个新增加的本地连接是怎么得到和拦截到所有通往物理网卡的数据包的。在openvpn这一点是不是不用我们操心啊。我知道在imd下,可学mux保存真正的那个adapter的blindhandle和miniporthandle。
周维彬
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
14楼#
发布于:2007-04-29 16:52
网上找了很多
资料看了很多

就是看不到我要的这些方面的解答

望牛人们 解惑
周维彬
jxxy1234
驱动牛犊
驱动牛犊
  • 注册日期2002-05-16
  • 最后登录2012-08-24
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望32点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-04-30 09:49
你准备做vpn吧.

论坛上也说不清, msn聊吧. jxxy1234@hotmail.com
鬼子就是鬼子,永远变不成人!
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
16楼#
发布于:2007-04-30 11:41
想问一下 那个openvpn每次都能虚拟出一个网卡(或者多个)
通常ip地址10.103.160.*。
我route print一下路由表
看到是这样的(我截取一小段):
Network Destination        Netmask          Gateway       Interface  Metric
       58.176.0.0      255.254.0.0   10.103.160.173  10.103.160.174      1
       58.192.0.0      255.240.0.0   10.103.160.173  10.103.160.174      1
       58.240.0.0      255.240.0.0   10.103.160.173  10.103.160.174      1

像我本机的虚拟网卡出来的地址是10.103.160.174。那么这个10.103.160.173又是什么呢
这个网关是本机的吗? 还是远程服务器上的呢。
我每次登陆netpas,这一对值都不一样。但是ip都是临近的。
难道本机虚拟出两个网卡来,一个来作dhcp???我看了tap_win32的代码 是有关于dhcp的处理部分的。
周维彬
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
17楼#
发布于:2007-04-30 13:19
Netpas 在本地安装一块虚拟网卡,连接时对这块网卡分配10.101.*.*的IP地址.
同时服务器根据用户的IP地址确定用户的ISP,例如校内用户是教育网.然后由客户端向
系统路由表中写入项目,使所有非教育网目标地址的默认网关为虚拟网卡地址.这样,使
用网络的时候,非教育网目标地址的数据流向虚拟网卡,并被转发到Netpas设在教育网
内的服务器.服务器拥有不同运营商的多条线路,由服务器来扮演类似于"代理服务器"的
角色进行转发.
周维彬
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
18楼#
发布于:2007-04-30 13:31
我感觉你首先要有解决方案,然后再考虑用什么手段作。总是抠在openvpn上不能帮你解决任何问题,openvpn不过是一种达到预期功能的手段和工具。

你能解决好下面的问题才可以考虑往下做:

1 是否理解了netpas的工作原理? 没有了解,好办,反编译以下,调试一下或者简单使用一下就可以明白他的工作原理。

2  如何拦截所有通向物理网卡的数据? 方法一般有两种: a 修改路由表,所有数据默认路由指向虚拟网卡 。 b 使用imd,即实现协议又实现网卡功能。协议负责拦截数据,网卡负责处理数据并转发。上面提到的tdi不过是提供一种实现修改路由功能的方法,而修改路由方法很多,所以不一定所有的都需要使用该tdi来实现修改路由,也可以在应用层实现,方法而已,不知道你是否明白我说的意思。

3 虚拟网卡如何转发数据?方法依然多种,就看自己的时间和能力来选择了。

不要局限于openvpn,那时手段,不是方法。

openvpn原理:

1 openvpn驱动部分实现了网卡处理和字符设备。网卡处理网络数据,字符设备完成与应用层的数据交互。

2 使用openvpn必须修改路由表

工作过程:

发送数据:

1 应用程序发送网络数据

2 网络数据根据修改后的路由表把数据路由到虚拟网卡

3 虚拟网卡把数据放到数据队列中

4 字符设备从数据队列中取数据,然后送给应用层

5 应用层把数据转发给物理网卡

6 物理网卡发送数据

接受过程:

1 物理网卡接受到数据,并传到应用空间

2 应用守护程序通过字符设备,把数据传给驱动网卡

3 数据通过虚拟网卡重新进入网络堆栈

4 网络堆栈把数据传给上层真实的应用程序。

建议首先了解网络数据路由原理,然后选择windows下合适的网络手段,并给出设计方案,最后找个
人去做就Ok了。

努力吧,可定会成功,good luck!
走走看看开源好 Solaris vs Linux
aben1223
驱动小牛
驱动小牛
  • 注册日期2004-11-29
  • 最后登录2007-06-01
  • 粉丝1
  • 关注0
  • 积分1000分
  • 威望201点
  • 贡献值0点
  • 好评度192点
  • 原创分2分
  • 专家分0分
19楼#
发布于:2007-04-30 14:52
hehe 感谢 不管最后作不作得不来
你给我码了这么多的字

这一点都是需要感谢的
周维彬
上一页
游客

返回顶部