- 论坛徽章:
- 2
|
我有两台机器 A 和 B,B 无法直接上网,需要通过 A 来上网,A 上有两块网卡 eht0 和 eth1。
eth0 的 IP 为 10.0.2.15,eth1 的 IP 为 192.168.56.101,B 的网关是 A 的 eth1 网卡的 IP。
在 A 上设置好 iptables 策略后,B 可以访问外网。
现在我希望在 A 上截获 B 机器的报文并修改内容,我的做法简略如下:
1.在三次握手后,B 在浏览器中访问网址成功时,查找某个特定标签准备进行修改 (例如查找 html 中的 title 标签)。
2.利用 skb_tailroom 函数获取 tailroom 大小
3.如果要插入的内容长度小于 tailroom,调用 skb_put 函数扩大 skb。
4.在标签 title 处插入内容,并修改 Content-Length 长度。
5.重新计算 IP 和 TCP 的校验和。
问题描述:
B 能收到 A 修改后的报文,不过接着好像丢弃了,之后 A 不停的重发修改的那个报文。
我怀疑是校验和什么地方计算有问题(会不会修改 NF_INET_FORWARD 与 修改 NF_INET_LOCAL_IN 和 NF_INET_LOCAL_OUT 的校验和算法有什么区别呢?)。
P.S.
1. 在机器 A 上修改 A 的报文是没有问题的,其中包括有 seq 和 ack number 的重新计算。
2. 在机器 A 上修改 B 的请求头是没有问题的。
3. 在机器 A 上修改 B 的响应头和响应体时出现 [问题描述] 中提到的问题。
请教 CU 的诸位大神小伙伴们,大家有遇到过修改 NF_INET_FORWARD 这个 hook 点的问题么?如果有的话,又是怎样解决这个问题的?
|
|