【发布时间】:2017-10-10 20:46:39
【问题描述】:
当我在 Linux 上使用 -j REDIRECT 规则重定向与 iptables 的连接时,接收重定向连接的程序可以执行 getsockopt(sockfd, SOL_IP, SO_ORIGINAL_DST, &val, &len); 以获取连接的原始、重定向前的目标 IP。当我在 FreeBSD 上使用 rdr 规则重定向与 pf 的连接时,我该如何做同样的事情?
【问题讨论】:
当我在 Linux 上使用 -j REDIRECT 规则重定向与 iptables 的连接时,接收重定向连接的程序可以执行 getsockopt(sockfd, SOL_IP, SO_ORIGINAL_DST, &val, &len); 以获取连接的原始、重定向前的目标 IP。当我在 FreeBSD 上使用 rdr 规则重定向与 pf 的连接时,我该如何做同样的事情?
【问题讨论】:
昨天刚在MacOS上解决了这个问题,没在FreeBSD上测试,我觉得差不多吧。
您需要来自net/pfvar.h 的 pfioc_natlook 结构。
一般步骤是:
pfioc_natlook初始化为pnl
rdxport和rdaddr将是连接的原始端口和ip任何对此问题仍然感兴趣的人可以查看这个要点:https://gist.github.com/gkoyuncu/f8aad43f66815dac7769
我用 golang(CGO 包装器)做了一个迷你 POC 程序,它可以在 MacOS 上运行:https://github.com/monsterxx03/pf_poc
【讨论】:
net/pfvar.h 可以在 xnu 内核源代码中找到:opensource.apple.com/source/xnu。大苏尔看这里:opensource.apple.com/source/xnu/xnu-7195.121.3/bsd/net/pfvar.h