在 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
到该端口。我不确定接下来要尝试什么,希望能有任何见解。