我正在尝试将本地机器上端口 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
仅处理传入流量,因此您应该将传出流量重定向到“传入”流量,即重定向out
到lo0
。
您接下来会立即遇到的另一个问题是,您的本地代理的传出流量也被重定向到其自身,这是一个无限循环。
下面是一个解决这些问题的演示,它复制自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
,可以