- 论坛徽章:
- 7
|
回复 #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。
后面还没明白怎么回事,只能慢慢看了. |
|