iptables 的 redirect 动作,对 IP 包到底做了什么?

2023-07-03 12:18:57 +08:00
 ac169

以前常用 iptables 的 redirect 动作做端口转发,那个时候我的理解就是对 IP 包的目标端口做了修改然后转发;最近看了一些透明代理的实现,发现规则里也用到了 iptables 的 redirect 动作来转到某些代理协议的服务端口(比如:dokodemo door )。

如果按照以前的理解 redirect 动作修改了目标端口,那么代理程序的出口如何知道这个 IP 包要转发到的原始端口?如果 redirect 动作仅仅是把匹配的数据包转发 到指定端口什么都不修改,那么 IP 报文的目标端口都和实际服务的端口不一样,这个数据包怎么被服务收到? 官方文档我看过,没有看到详细过程的说明。

1489 次点击
所在节点    Linux
12 条回复
billlee
2023-07-03 12:35:52 +08:00
内核会记住原来的目标地址,getsockopt 有个参数可以获取。
bao3
2023-07-03 13:22:01 +08:00
内核帮你划分了一个用来做 mapping 的区域,所以叫透明代理,对你的应用是透明的。
RobberPhex
2023-07-03 13:30:47 +08:00
tproxy 部分:
1. 先用 setsockopt 函数为套接字设置 IP_TRANSPARENT 标识
2. accept 后,对 socket 进行 getsockopt(SO_ORIGINAL_DST)操作,获取原始的 ip 端口
3. 但 udp 没有 socket 对象,所以如下:
4. 通过 setsockopt(fd, SOL_IP, IP_RECVORIGDSTADDR, ...)给 socket 设置 IP_RECVORIGDST
5. 用 recvmsg 函数替代 recvfrom/recv 来接收数据包,返回的结果里有 msghdr 结构体,并遍历(cmsghdr*)msg_control ,找到 level 为 SOL_IP 的结构体,它就包含了 sockaddr_in 原始 IP 和端口。


其中 1 、2 是 redirect ,其他事 tproxy 扩展的。

另外,配置的时候要额外注意下 iptables 的配置,防止出现网络问题。比如我有一次就是 drop 了 tcp 握手中的 ack+syn 包,google 封禁了 IP (直接无法搜索)。https://github.com/robberphex/luci-app-v2ray/blob/v2.2.4/root/etc/init.d/luci_v2ray#L583
ac169
2023-07-03 17:53:39 +08:00
@billlee
@bao3
@RobberPhex

谢谢,也就是说 redirect 会修改 IP 包 目的端口 等信息,但代理程序通过其他方式可以获取到原始的目的等信息,所以能完成代理功能!
hankai17
2023-07-03 19:07:10 +08:00
透明代理
一般情况下本机监听的就是 realServer 的 ip 跟端口 不存在修改
hankai17
2023-07-03 19:13:58 +08:00
@RobberPhex 咨询一下 1 、2 对应的代码在哪个文件里?
mikewang
2023-07-03 20:57:58 +08:00
参考 https://www.netfilter.org/documentation/HOWTO/NAT-HOWTO-6.html#ss6.2

There is a specialized case of Destination NAT called redirection: it is a simple convenience which is exactly equivalent to doing DNAT to the address of the incoming interface.
alexapollo
2023-07-04 00:27:39 +08:00
我印象里十年前这个模块叫做 conntrack ?
julyclyde
2023-07-04 11:33:50 +08:00
@alexapollo 和 conntrack 根本两码事
alexapollo
2023-07-04 11:35:08 +08:00
@julyclyde 楼上的 DNAT 让我触发了回忆,那时候 DNAT 不是默认 conntrack 吗
julyclyde
2023-07-04 11:36:29 +08:00
@alexapollo “带有”conntrack ,和“是”conntrack 两码事
alexapollo
2023-07-04 11:41:51 +08:00
@julyclyde Sounds reasonable

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/953626

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX