- 论坛徽章:
- 0
|
回复 4# 瀚海书香
方法1:
应用层在构造数据包的时候,把自己的IP地址封装进去。
我知道你的意思是在自己的IP地址封装到tcp的数据段,但是这样的话应用程序就需要特别处理这个报文,因为数据段多了一个真实的IP地址,我这边的需求是不让应用程序特别是处理,直接连接返回的就是真实的IP地址了,但是你的这个方法应该需要特殊处理吧??
方法2:
netfilter写一个module,在PREROUTING之前,把源地址放到数据包内容中,然后重新走netfilter。
这个你说的直接IP地址放到数据包的data部分,也就是tcp头的后面,这个我没太能够理解,跟netfilter有啥关系??
再一个就是我跟你先前的方法:http://bbs.chinaunix.net/forum.p ... st%3D1%26digest%3D1
我自己以最低的优先级去注册一个hook,然后去调用ip_nat_setup_info去修改源地址,这里我假设我已经知道源地址了,但是总是执行到ip_nat_setup_info的时候就死机了,这里需要先启动iptable -t nat -L一下,初始化nat相关的东西。- static unsigned int
- ttm_in(unsigned int hooknum, struct sk_buff **skb,
- const struct net_device *in, const struct net_device *out,
- int (*okfn)(struct sk_buff *))
- {
- struct ip_conntrack *ct;
- enum ip_conntrack_info ctinfo;
- struct ip_nat_range newrange;
- const struct iphdr *iph = (*skb)->nh.iph;
- __be32 newsrc = 0;
- if(iph->protocol != IPPROTO_ICMP){
- return NF_ACCEPT;
- }
- IP_NF_ASSERT(hooknum == NF_IP_LOCAL_IN);
- /*取得数据包的连接*/
- ct = ip_conntrack_get(*skb, &ctinfo);
- if (ct == NULL)
- return NF_ACCEPT;
- /* Connection must be valid and new. */
- IP_NF_ASSERT(ct && (ctinfo == IP_CT_NEW || ctinfo == IP_CT_ESTABLISHED
- || ctinfo == IP_CT_ESTABLISHED + IP_CT_IS_REPLY));
- // if (ctinfo != IP_CT_ESTABLISHED)
- // return NF_ACCEPT;
- memset(&newrange, 0, sizeof(newrange));
- newrange.flags |= IP_NAT_RANGE_MAP_IPS;
- newrange.min_ip = newrange.max_ip = newsrc;
- UINPTTM_INFO("test\n");
- return ip_nat_setup_info(ct, &newrange, hooknum);
- }
复制代码 非常感谢 |
|