You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IPTABLES仅允许单用户上网,DNS仅root可用故障排查求助

问题原因分析与解决方案

这个问题我之前帮朋友排查过,核心原因其实和DNS解析的运行身份直接相关——你配置的iptables规则只允许指定用户的出站流量,但系统负责DNS解析的服务(比如systemd-resolved、dnsmasq这类)默认是以root身份运行的。

具体逻辑拆解:

  • 当你用授权用户执行ping(如果ping的是IP地址)时,流量直接由该用户的进程发起,符合iptables的允许规则,所以能正常通行。
  • 但当你需要解析域名(比如访问网站、用nslookup)时,普通用户的进程并不会直接发送DNS查询数据包,而是调用系统的DNS解析服务。这些服务进程是以root身份运行的,它们发起的DNS流量不在你的允许列表里,自然就被拦截了。
  • 当你把root加入允许列表后,DNS服务的出站流量被放行,解析功能也就恢复正常了。

验证步骤:

  1. 先确认系统正在使用的DNS服务:

    systemctl status systemd-resolved dnsmasq bind9
    

    查看输出里标着active (running)的服务,就是当前负责DNS解析的进程。

  2. 检查该服务的运行用户:

    ps aux | grep -E 'systemd-resolved|dnsmasq|bind9'
    

    输出的第一列就是进程的运行用户,大概率会看到是root。

解决方案

根据你的需求,有两种常见的处理方式:

方案1:放行DNS服务的出站流量

如果不想把整个root用户加入允许列表,可以只放行DNS服务的DNS端口(UDP/TCP 53)流量:

# 假设你的DNS服务是root运行,放行UDP和TCP的53端口出站
iptables -A OUTPUT -m owner --uid-owner root -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner root -p tcp --dport 53 -j ACCEPT

如果你的DNS服务用的是特定用户(比如dnsmasq可能配置为dnsmasq用户),把上面的root换成对应的用户即可。

方案2:让授权用户直接发起DNS查询

有些工具(比如dig、host)可以直接由用户进程发起DNS查询,不需要依赖系统服务。如果你希望授权用户用这类工具,可以确保你的iptables规则允许该用户的UDP/TCP 53端口出站:

iptables -A OUTPUT -m owner --uid-owner 你的授权用户名 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -m owner --uid-owner 你的授权用户名 -p tcp --dport 53 -j ACCEPT

不过这种方式只能覆盖直接用DNS工具的场景,浏览器、curl这类依赖系统解析库的程序还是会受影响,所以方案1更通用。

内容的提问来源于stack exchange,提问作者sjaak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 04:21:14