AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

    • 主页
    • 系统&网络
    • Ubuntu
    • Unix
    • DBA
    • Computer
    • Coding
    • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1132982
Accepted
neezer
neezer
Asked: 2023-06-10 08:28:45 +0800 CST2023-06-10 08:28:45 +0800 CST 2023-06-10 08:28:45 +0800 CST

使用 pf 端口转发 DNS

  • 772

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

domain-name-system
  • 1 1 个回答
  • 58 Views

1 个回答

  • Voted
  1. Best Answer
    neezer
    2023-06-11T02:56:52+08:002023-06-11T02:56:52+08:00

    我想我解决了!

    据我所知,我的问题的症结在于我的初始规则有效,53但我没有允许流量进出的规则5353,所以我实际上是重定向到死胡同。我意识到我最初的问题确实提到了我在本地运行的名称服务器,但没有提到它是通过另一个守护进程 ( Tailscale ) 解决/查询/无论如何……并且来自该守护进程的流量被阻止。?‍♂️

    这是我的最新消息pf.conf(请注意,我切换到使用服务名称而不是数字端口,但两者可以互换 AFAIK):

    tcp_pass = "{ ssh domain www ntp https }"
    udp_pass = "{ domain }"
    
    # block everything
    block all
    
    # allow outgoing $tcp_pass & $udp_pass
    pass out proto tcp to port $tcp_pass keep state
    pass out proto udp to port $udp_pass keep state
    
    # allow ping
    pass in inet proto icmp all icmp-type 8 code 0
    
    # allow ssh
    pass in proto tcp to port ssh keep state
    
    # allow local traffic
    pass in on lo proto tcp from lo to lo keep state
    pass out on lo proto tcp from lo to lo keep state
    
    # redirect www and https to custom ports
    pass in proto tcp to port www rdr-to 127.0.0.1 port 3080 keep state
    pass in proto tcp to port https rdr-to 127.0.0.1 port 3443 keep state
    
    # redirect domain to custom port
    pass in proto { tcp, udp } to port domain rdr-to 127.0.0.1 port 5353 keep state
    pass in proto udp from port 5353 # <-- the piece (1) I was missing!
    pass out proto udp from port 5353 # <-- the piece (2) I was missing!
    

    此配置似乎如我所愿地工作,允许我透明地在自定义的非特权端口上服务www、https和domain。?


    其他注意事项:

    • 有一段时间我一直在更改/etc/pf.conf和应用我的更新,pfctl -f /etc/pf.conf但没有看到我预期的更改,只是在几个小时后才想起我之前禁用了 pf using pfctl -d!我重新启用 pf 并pfctl -e看到符合我预期的结果,之后我走出去,摸了一些草,喝了?,看了一些☁️。
    • 使用 进行调试时tcpdump,我过于关注53并且没有考虑到我的问题可能与5353. 以后,我会记得检查所有正在播放的端口。
    • @Tom Yan 我在路由到 ips 时没有遇到任何问题127/8;上述解决方案不需要在 OpenBSD 7.3 上进行额外的系统配置更改。
    • @poige 我尝试大声重复“tcpdump,tcpdump,tcpdump”,认为它可能会像Beetlejuice一样召唤Puffy或Theo de Raadt,但是,唉,没有任何反应。失望之后,我继续阅读Absolute OpenBSD 的第 21 和 22 章,以及openbsd.org 上的 pf 指南。我的顿悟是在规则更改阻止了本地主机上对自定义端口上我的 http 服务器的管理 api 的请求之后出现的,我想检查 pf 是否也被阻止了。pf.conf(5)tcpdump(8)5353
    • 1

相关问题

  • Solaris DNS

  • resolv.conf 在经过一段时间后被更改

  • 为什么有些网站的网址中没有“www”就无法显示?[关闭]

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助
subwaysurfers
my femboy roommate

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve