netfilter前向挂钩点修改数据包

时间:2015-06-16 08:31:59

标签: c linux forward netfilter

我有两台机器A和B,B不能直接访问Internet。 B需要通过A访问网络。

A上有两个NIC eth0和eht1。

eth0' IP为10.0.2.15,eth1的IP为192.168.56.101,B'网关为A' eth1 NIC IP。

在机器A上设置iptables策略后,B可以访问Internet。

现在我希望拦截机器A上机器B的数据包,并修改数据包。我的方法如下:

  1. 三次握手后,B在浏览器中访问网站,服务器返回HTTP / 1.1 200 OK,在HTML中查找标题标记。
  2. 使用skb_tailroom()函数获取尾部空间大小。
  3. 如果内容的插入长度小于tailroom,则调用skb_put()函数展开skb。
  4. 在title标签后插入内容,并修改Content-Length长度。
  5. 重新计算的IP和TCP校验和。
  6. 问题: 机器B接收来自机器A的修改后的数据包并将其丢弃,机器A重新发送修改后的数据包。

    我怀疑问题是由校验和计算引起的。

    P.S。我使用相同的算法来计算校验和以直接在机器A上修改数据包,它可以工作。 修改了机器A上机器B的数据包,它不起作用。

    抱歉我的英文。

1 个答案:

答案 0 :(得分:0)

由于它是TCP,因此Seq#和Ack#数字很重要,如果您正在编辑数据包数据而不编辑Seq#& Ack#,它不起作用。