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

时间:2017-10-10 20:46:39

标签: firewall freebsd nat

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

1 个答案:

答案 0 :(得分:1)

昨天刚刚在MacOS上解决了这个问题,没有在FreeBSD上进行测试,我认为这很相似。

您需要net/pfvar.h中的pfioc_natlook结构。

常规步骤是:

  • pfioc_natlook初始化为pnl
  • 用客户端套接字的ip和端口(saddr,sxport),代理服务器的绑定ip和端口(daddr,dxport)填充pnl
  • open('/ dev / pf'),获取其fd
  • 执行ioctl(fd,C.DIOCNATLOOK,* pnl),然后pnl的rdxportrdaddr将成为连接的原始端口和ip

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

我用golang(CGO包装器)制作了一个迷你POC程序,它可在MacOS上运行:https://github.com/monsterxx03/pf_poc