免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: platinum
打印 上一主题 下一主题

网桥数据可以被 REDIRECT 吗? [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
11 [报告]
发表于 2009-09-23 15:13 |只看该作者
原帖由 platinum 于 2009-9-23 15:05 发表
应如何做呢?是不是把 skb->dev 指向 eth2 的 net_device 结构?
其他的是不是也需要改啊,比如 skb->dst、skb->sk 等?


用咱们平时的dev_queue_xmit发送,不过前提是需要知道eth2的MAC地址。不过作为测试,也可以写死啊。

要么就是修改skb->dev的相关参数吧。

论坛徽章:
0
12 [报告]
发表于 2009-09-23 15:16 |只看该作者
有点复杂,这样的话除了修改 MAC 还要修改 IP,而且要自己重新计算校验和
不仅如此,出去的数据也要反向修改回去
整个 REDIRECT 都要手动完成
搭建这个实验模型的代价有些大

有没有变相的方法可以解决,哪怕效率低一些呢?

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
13 [报告]
发表于 2009-09-23 15:18 |只看该作者

回复 #12 platinum 的帖子

呵呵,是有点。因为涉及到构造和发送数据包了。

你现在的情况是,TCP 80的请求包没有到达192.168.1.1的主机上吧

论坛徽章:
0
14 [报告]
发表于 2009-09-23 15:24 |只看该作者
确切讲,TCP/80 的请求到达了 192.168.1.1 所在的主机,只是没到达 192.168.1.1 这个 IP 的网络接口
数据包直接进入桥接口了,想内部把数据转给本地高层协议栈处理,之后再回来

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
15 [报告]
发表于 2009-09-23 15:50 |只看该作者
确切讲,TCP/80 的请求到达了 192.168.1.1 所在的主机,只是没到达 192.168.1.1 这个 IP 的网络接口

这个地方有点不太明白你的意思。 192.168.1.1是和桥直连的一台主机吧?

论坛徽章:
0
16 [报告]
发表于 2009-09-23 15:52 |只看该作者
原帖由 Godbach 于 2009-9-23 15:50 发表

这个地方有点不太明白你的意思。 192.168.1.1是和桥直连的一台主机吧?

不是,顶楼有拓扑图,和桥直连的机器 IP 是 192.168.1.2
192.168.1.1 是桥所在设备的第三个网口,非桥接口

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
17 [报告]
发表于 2009-09-23 15:57 |只看该作者
eth0和eth1是桥接口,eth2并不是。是这个意思吧,白金兄

论坛徽章:
0
18 [报告]
发表于 2009-09-23 16:16 |只看该作者
原帖由 Godbach 于 2009-9-23 15:57 发表
eth0和eth1是桥接口,eth2并不是。是这个意思吧,白金兄

没错,就是这个意思
目前 192.168.1.2 可以直接访问 192.168.1.1 的 HTTP
希望通过桥出去的 HTTP 请求都重定向到 192.168.1.1 上
有什么更好更巧的办法实现吗?

论坛徽章:
7
丑牛
日期:2013-10-18 14:43:21技术图书徽章
日期:2013-11-03 09:58:03辰龙
日期:2014-01-15 22:57:50午马
日期:2014-09-15 07:04:39丑牛
日期:2014-10-16 14:25:222015年亚洲杯之伊朗
日期:2015-03-16 10:24:352015亚冠之城南
日期:2015-05-31 09:52:32
19 [报告]
发表于 2009-09-23 16:31 |只看该作者

回复 #8 platinum 的帖子

考虑到你这个环境其实改动灵活性很大.
首先说明的是因为桥没加IP,那么它是一个独立的2层交换.(br_netfilter还没彻底弄清楚).
那么机子上实际是2个独立的设备,一个2层交换机,一个主机.
那么
iptables -t nat -I PREROUTING -d 202.106.0.20 -p tcp --dport 80 -j DNAT --to 192.168.1.1
对于eth2上来到IP层的数据包有效.

1,假设用户机的网关配置为防火墙或其后面的机器.那么从防火墙发送出来的数据包的目的MAC是这个网关的地址.
这个包到达交换机后,因为网关的MAC转发记录可能存在交换机中,那么此数据包会达到桥.
这个时候你只需要在桥接受到这个数据包将目的MAC转为ETH2的MAC并从ETH0再发出来,就可以到达ETH2.并传递到上层,但这个要接受还要加相应

的规则.

问题是这时候在交换机上的记录表项出现了冲突.....
因为有相同的源MAC在2个不同的入口到达交换机.....
而且单单修改MAC,问题很大.

2,即使在在桥上添加自己的hook,侦听ip和端口,并改IP,再从ETH0发送出来,对于交换机也有问题.
如果这个交换机是一个hub,那么2个方法,一切成立.

在存在交换机的情况下只能考虑IP层的代理.
就是你前面的那个NAT规则.这个时候关键是你的桥要表现的像一台路由器.好象一年前异次元空间提到这个,当时没注意。


br_input.c->br_handle_frame->NF_HOOK(PF_BRIDGE, NF_BR_PRE_ROUTING, skb, skb->dev, NULL,
                        br_handle_frame_finish);
->br_nf_pre_routing->
(注意这里开启brnf_call_iptables,也就是将/proc/sys/net/bridge/bridge-nf-call-iptables致为1时)才调用下面的
NF_HOOK(PF_INET, NF_IP_PRE_ROUTING, skb, skb->dev, NULL,
                br_nf_pre_routing_finish);
恩,这里就进入了iptables.
做过了dnat以后进入br_nf_pre_routing_finish。
后面还没明白怎么回事,只能慢慢看了.

论坛徽章:
0
20 [报告]
发表于 2009-09-23 17:01 |只看该作者
把192.168.1.1也加入到桥中,然后
稍微修改桥代码就能把访问202.106.0.20:80的数据包发到192.168.1.1上去,但是转发过来的报文的目的IP不是.1的地址,sniffer能抓到包,也到不了上层啊
我没实验过直接修改http报文的目的IP的做法,不过可以试下,如果修改之后.1上抓到的包的目的IP是.1的话,应该就可以了。

[ 本帖最后由 duanjigang 于 2009-9-23 17:03 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP