在 OpenBSD 上,我可以使用以下命令成功且透明地将端口 80 和 443 转发到在自定义非特权端口上运行的服务/etc/pf.conf
:
tcp_pass = "{ 22 80 123 443 }"
block all
pass out log on egress proto tcp to any port $tcp_pass keep state
pass in log on egress proto tcp from any to any port 80 rdr-to 127.0.0.1 port 3080 keep state
pass in log on egress proto tcp from any to any port 443 rdr-to 127.0.0.1 port 3443 keep state
我通过加载一个绑定到 的静态文件服务器来测试它3080
,然后从另一台机器对服务器进行 cURL 调用,如下所示:
curl -v 192.168.1.xxx
...我得到了 200 状态代码和我期望的 HTML 内容。?
现在我想对 DNS 做同样的事情。首先,我更新了tcp_pass
宏以包含53
并创建了第二个宏并将udp_pass
其53
也放入其中,然后是一条udp
规则。
然后我尝试添加以下规则(请参阅下面代码块中的注释):
tcp_pass = "{ 22 53 80 123 443 }"
udp_pass = "{ 53 }"
# ...
pass out log on egress proto udp to any port $udp_pass keep state
# ...
# the new rules I added -- emulating the http(s) rules from before
pass in log on egress proto tcp from any to any port 53 rdr-to 127.0.0.1 port 5353 keep state
pass in log on egress proto udp from any to any port 53 rdr-to 127.0.0.1 port 5353 keep state
我在端口上启动了一个 DNS 服务器5353
,并尝试从外部机器向这台机器发出请求:
dig @192.168.1.xxx -p 5353 cnn.com
按预期工作:立即返回正确的响应dig @192.168.1.xxx cnn.com
挂起,然后超时并出现以下错误; <<>> DiG 9.10.6 <<>> @192.168.1.xxx cnn.com ; (1 server found) ;; global options: +cmd ;; connection timed out; no servers could be reached
当我进行 DNS 查询时,我遵循pf
日志tcpdump -nettti pflog0
,并且在端口上请求时我只看到以下条目53
:
Jun 09 17:15:22.513529 rule 10/(match) pass in on iwm0: 192.168.1.yyy.58201 > 192.168.1.xxx.53: 64594+ [1au] A? cnn.com.(36)
Jun 09 17:15:22.513933 rule 6/(match) pass out on iwm0: 192.168.1.xxx.47191 > 9.9.9.9.53: 64594+ [1au] A? cnn.com.(36)
53
如果我直接使用将 DNS 服务器重新绑定到端口root
,解析工作正常,所以我知道问题出在我的 PF 配置上,而不是我的网络。
我的目标是在非特权端口上运行我的 DNS 服务器,并将端口转发53
到该端口。我不确定接下来要尝试什么,希望能有任何见解。
我想我解决了!
据我所知,我的问题的症结在于我的初始规则有效,
53
但我没有允许流量进出的规则5353
,所以我实际上是重定向到死胡同。我意识到我最初的问题确实提到了我在本地运行的名称服务器,但没有提到它是通过另一个守护进程 ( Tailscale ) 解决/查询/无论如何……并且来自该守护进程的流量被阻止。?♂️这是我的最新消息
pf.conf
(请注意,我切换到使用服务名称而不是数字端口,但两者可以互换 AFAIK):此配置似乎如我所愿地工作,允许我透明地在自定义的非特权端口上服务
www
、https
和domain
。?其他注意事项:
/etc/pf.conf
和应用我的更新,pfctl -f /etc/pf.conf
但没有看到我预期的更改,只是在几个小时后才想起我之前禁用了 pf usingpfctl -d
!我重新启用 pf 并pfctl -e
看到符合我预期的结果,之后我走出去,摸了一些草,喝了?,看了一些☁️。tcpdump
,我过于关注53
并且没有考虑到我的问题可能与5353
. 以后,我会记得检查所有正在播放的端口。127/8
;上述解决方案不需要在 OpenBSD 7.3 上进行额外的系统配置更改。pf.conf(5)
tcpdump(8)
5353