OpenBSD下使用pf实现DNS端口转发失败的问题求助
OpenBSD下使用pf实现DNS端口转发失败的问题求助
大家好,我在OpenBSD上用pf做端口转发时遇到了瓶颈,先跟大家说说之前成功的情况:
我已经成功把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 -v 192.168.1.xxx,能正常拿到200状态码和预期的HTML内容,完全没问题。
接下来我想对DNS做同样的转发,于是修改了pf配置:
tcp_pass = "{ 22 53 80 123 443 }" udp_pass = "{ 53 }" # 之前的block和tcp pass out规则保持不变 # ... pass out log on egress proto udp to any port $udp_pass keep state # 新增的DNS转发规则,模仿之前的HTTP(S)规则 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
我在5353端口启动了DNS服务器,测试结果却不一致:
- 直接执行
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
我用tcpdump -nettti pflog0查看pf日志,当请求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)
另外,如果我用root权限把DNS服务器直接绑定到53端口,解析就能正常工作,所以问题肯定出在pf配置上,不是网络本身的问题。
我的目标是让DNS服务器运行在非特权端口,通过pf把53端口转发到它上面,现在不知道该怎么调整配置了,希望大家能给点建议,谢谢!
备注:内容来源于stack exchange,提问作者neezer




