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

Jos*_*ica 4 firewall freebsd nat

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

小智 5

昨天刚在MacOS上解决了这个问题,没有在FreeBSD上测试,我认为是类似的。

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

一般步骤是:

  • 初始化pfioc_natlookpnl
  • 用客户端套接字的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 包装器)做了一个迷你 POC 程序,它可以在 MacOS 上运行: https: //github.com/monsterxx03/pf_poc