如何在 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_natlook
到pnl
- 用客户端socket的ip和端口(saddr,sxport),代理服务器的绑定ip和端口(daddr, dxport)填充pnl
- open('/dev/pf'),得到它的fd
- do ioctl(fd, C.DIOCNATLOOK, *pnl), 然后 pnl 的
rdxport
和 rdaddr
将是连接的原始端口 & ip
任何对这个问题仍然感兴趣的人都可以查看这个要点:https://gist.github.com/gkoyuncu/f8aad43f66815dac7769
我用 golang(CGO wrapper) 做了一个迷你 POC 程序,它可以在 MacOS 上运行:https://github.com/monsterxx03/pf_poc
当我在 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_natlook
到pnl
- 用客户端socket的ip和端口(saddr,sxport),代理服务器的绑定ip和端口(daddr, dxport)填充pnl
- open('/dev/pf'),得到它的fd
- do ioctl(fd, C.DIOCNATLOOK, *pnl), 然后 pnl 的
rdxport
和rdaddr
将是连接的原始端口 & ip
任何对这个问题仍然感兴趣的人都可以查看这个要点:https://gist.github.com/gkoyuncu/f8aad43f66815dac7769
我用 golang(CGO wrapper) 做了一个迷你 POC 程序,它可以在 MacOS 上运行:https://github.com/monsterxx03/pf_poc