使用 PF 转发端口传出请求

使用 PF 转发端口传出请求

我正在尝试将本地机器上端口 843 的所有传出流量重定向至本地端口 1234 上的服务。

因此,当我向例如发出请求时1.2.3.4:843,我希望它连接到127.0.0.1:1234(对请求应用程序透明)。

我在 OS X 上,因此我尝试使用来实现这一点pf

以下是我所拥有的:

ext_if = "en0"
int_if = "lo0"

rdr on $ext_if inet proto tcp from self to any port 843 -> 127.0.0.1 port 1234

现在,当我这样做时,telnet 1.2.3.4 843我希望在我的本地服务(在端口 1234 上运行)上建立连接。

但是它似乎没有正确重定向。使用时tcpdump我可以看到数据包被放在了目的地的接口上1.2.3.4

如果我仅执行本地主机规则,例如

rdr on $int_if inet proto tcp from self to any port 843 -> 127.0.0.1 port 1234

然后telnet localhost 843按预期工作,我从正在监听端口的本地服务获得响应 1234

我不知道我做错了什么,现在我不知道该怎么做了。任何帮助/指点我都感激不尽。

编辑:

我又测试了一下,似乎和最后一条规则一样,任何到达环回接口的请求都可以正常工作。因此telnet 127.2.3.4 843重定向也正确。

我尝试添加$ext_if上面

rdr on { $ext_if $int_if } proto tcp from any to any port 843 -> 10.0.1.10 port 1234

但没有成功。我还添加了 sysctl 转发。什么也没做。

sudo sysctl -w net.inet.ip.forwarding=1
sudo sysctl -w net.inet6.ip6.forwarding=1

答案1

正如评论所说,rdr仅处理传入流量,因此您应该将传出流量重定向到“传入”流量,即重定向outlo0

您接下来会立即遇到的另一个问题是,您的本地代理的传出流量也被重定向到其自身,这是一个无限循环。

下面是一个解决这些问题的演示,它复制自https://docs.mitmproxy.org/stable/howto-transparent/#macos

#The ports to redirect to proxy
redir_ports = "{http, https}"

#The address the transparent proxy is listening on
tproxy = "127.0.0.1 port 8080"

#The user the transparent proxy is running as
tproxy_user = "nobody" 

#The users whose connection must be redirected.
#
#This cannot involve the user which runs the
#transparent proxy as that would cause an infinite loop.
#

rdr pass proto tcp from any to any port $redir_ports -> $tproxy
pass out route-to (lo0 127.0.0.1) proto tcp from any to any port $redir_ports user { != $tproxy_user }


一些重要说明

  • 必须在最后一条规则后留下一行,否则会出现语法错误pfctl
  • 由用户运行代理tproxy_user,以避免循环

我在 macOS 13 上测试过mitmdump,可以

相关内容