- 论坛徽章:
- 2
|
实验场景:
Host A:192.168.1.112 做客户端
WebServer B:192.168.1.113:8088 nginx server
WebServer C: 192.168.1.114:80 nginx server
流程:
A:curl 访问 B:nginx----redirect---->A:curl访问C:nginx
在客户端A上使用curl web服务器B的nginx的页面 想要把这个数据包重定向到C的nginx服务器上,IP端口如上。
实现:
在2.6.32.431 X86_64内核上已经实现了,但是把代码迁移到2.6.18内核的时候出现了问题,迁移的时候 函数调用不变 只是把变动的接口修复了,编译没问题,但是在转发的时候出现了问题,就是客户端发出来的数据包 只是重复发syn包。
2.6.32内核上实现流程:
LOCAL_OUT钩子点: 根据skb获取到ip port,符合条件的跳转到转发函数流程:
1、 填充 struct nf_nat_range newrange 结构体
2、 if( !nf_nat_initialized(ct, IP_NAT_MANIP_DST) ) {
ret = nf_nat_setup_info(ct, &newrange, IP_NAT_MANIP_DST);
set_bit 给包打上特定的标志位set_bit(IPS_OWN_NAT_BIT, &ct->status);
}
3、nf_nat_packet(ct, ctinfo, hooknum, skb);
4、ip_route_me_harder(skb, RTN_UNSPEC)
POST_ROUTING钩子点:
1、test_bit检测是不是已经打了标记的包 只对打了标记的包做处理
2、ret = nf_nat_packet(ct, ctinfo, hooknum, skb);
3、 if (ip_route_me_harder(skb, RTN_UNSPEC)) 路由表处理
如上流程 在2.6.32上测试 没问题 但是在2.6.18上包转发出现了问题 求解救
|
|