如何在 FreeBSD 上使用 pf 获取重定向连接的原始目标 IP?

How do I get the original destination IP of a redirected connection with pf on FreeBSD?

当我在 Linux 上使用 -j REDIRECT 规则重定向与 iptables 的连接时,接收重定向连接的程序可以 getsockopt(sockfd, SOL_IP, SO_ORIGINAL_DST, &val, &len); 获取原始的、预连接的重定向目标 IP。当我在 FreeBSD 上使用 rdr 规则重定向与 pf 的连接时,我该如何做同样的事情?

昨天刚在MacOS上解决了这个问题,没有在FreeBSD上测试,我觉得差不多。

你需要 pfioc_natlook 来自 net/pfvar.h 的结构。

一般步骤是:

  • 初始化pfioc_natlookpnl
  • 用客户端socket的ip和端口(saddr,sxport),代理服务器的绑定ip和端口(daddr, dxport)填充pnl
  • open('/dev/pf'),得到它的fd
  • do ioctl(fd, C.DIOCNATLOOK, *pnl), 然后 pnl 的 rdxportrdaddr 将是连接的原始端口 & ip

任何对这个问题仍然感兴趣的人都可以查看这个要点:https://gist.github.com/gkoyuncu/f8aad43f66815dac7769

我用 golang(CGO wrapper) 做了一个迷你 POC 程序,它可以在 MacOS 上运行:https://github.com/monsterxx03/pf_poc