基于 Podman 部署 SmartDNS 实现内网分流与企业审计日志合规

Jinpeng
Jinpeng
Jinpeng
管理员
42
文章
0
粉丝
Proxmox VE 容器技术评论4阅读模式

在企业内网网络治理与信息安全合规审计中,DNS 访问记录(谁在什么时间查询了什么域名、解析结果是什么、来源客户端 IP)是追踪内部资产网络行为、排查合规风险的关键凭证。

本文将结合企业的合规审计需求,基于 Podman 容器化部署 SmartDNS,实现“企业内网私有域名与公网域名分流解析”以及“合规审计日志持久化归档与轮转”。

基于 Podman 部署 SmartDNS 实现内网分流与企业审计日志合规

方案设计架构

整个解析流程基于域名规则进行策略路由:

+--------------------+
                    |   客户端 DNS 请求   |
                    +---------+----------+
                              |
                     [ SmartDNS 服务 ]
                     (Podman 容器运行)
                              |
            +-----------------+-----------------+
            |                                   |
    匹配内网域名列表                    未匹配/通用域名
  (如 *.corp.local)                     (如 *.qq.com)
            |                                   |
            v                                   v
   +-----------------+                 +-----------------+
   | 企业内网权威 DNS |                 | 国内公共权威 DNS |
   | 10.0.0.2 / .3   |                 | 223.5.5.5 / ... |
   +-----------------+                 +-----------------+
  • 精准分流:企业私有域名(如 *.corp.local)严格路由至内网专用权威 DNS;公开业务域名通过合规公共 DNS 并发测速优选。
  • 审计可追溯:记录客户端 IP、查询域名、请求时间及解析结果,日志持久化存储于宿主机 /var/log/smartdns,满足网络安全合规与排查审计需求。
  • 隔离与规范:数据缓存独立存储在 /var/lib/smartdns,配置文件存储在 /etc/smartdns,便于定期备份与权限加固。

基于容器化部署

第一步:准备配置与域名列表目录

在宿主机上创建专门的目录,用于存放主配置和分流规则列表:

# 创建配置、数据与审计日志目录
sudo mkdir -p /etc/smartdns/conf.d
sudo mkdir -p /var/lib/smartdns
sudo mkdir -p /var/log/smartdns

# 建议加固日志目录权限,避免普通用户篡改审计记录
sudo chmod 750 /var/log/smartdns

 

第二步:配置企业内网域名分流规则

1. 编写内网专用域名清单

在 /etc/smartdns/conf.d/office-domains.conf 中填入公司内部的专属主域名或二级域名,将其绑定到名为 office 的分组:

# 格式:nameserver /域名/分组名
nameserver /corp.local/office
nameserver /internal.example.cn/office
nameserver /oa.local/office
nameserver /git.local/office

2. 编写 SmartDNS 主配置文件

编辑 /etc/smartdns/smartdns.conf:

# 监听端口
bind [::]:53
bind-tcp [::]:53

# 基础缓存策略(持久化到 /var/lib/smartdns 目录)
cache-size 10240
cache-persist yes
cache-file /var/lib/smartdns/smartdns.cache
prefetch-domain yes
serve-expired yes
serve-expired-ttl 86400
rr-ttl-min 60
rr-ttl-max 86400

# ==========================================
# 安全与合规审计日志配置 (Audit Logging)
# ==========================================
# 系统运行日志级别:notice 级别记录启动、重载与常规事件
log-level notice
log-file /var/log/smartdns/smartdns.log
log-size 100M
log-num 30

# 启用合规审计日志:记录每个客户端的域名请求及结果
audit-enable yes
audit-file /var/log/smartdns/smartdns-audit.log
audit-size 200M
audit-num 30

# ==========================================
# 上游 1:企业内网权威 DNS 组 (office)
# 作用:仅解析内部私有资产,不参与默认公网查询
# ==========================================
server 10.0.0.2 -group office -exclude-default-group
server 10.0.0.3 -group office -exclude-default-group

# ==========================================
# 上游 2:国内合规公共 DNS (默认组)
# 作用:通用公网解析,并发测速提升响应速度
# ==========================================
server 223.5.5.5
server 223.6.6.6
server 119.29.29.29
server 180.76.76.76

# ==========================================
# 加载分流清单
# ==========================================
conf-file /etc/smartdns/conf.d/office-domains.conf

 

第三步:基于 Podman 启动 SmartDNS 服务

SmartDNS 官方在 Docker Hub 上提供了维护良好的容器镜像 docker.io/pymumu/smartdns。

1. 允许非 root 绑定 53 端口(Rootless 环境)

Linux 默认限制普通用户绑定 1024 以下端口,若使用普通用户权限运行 Podman,需调整系统参数:

sudo sysctl -w net.ipv4.ip_unprivileged_port_start=53
echo "net.ipv4.ip_unprivileged_port_start=53" | sudo tee /etc/sysctl.d/smartdns-port.conf

2. 运行容器

推荐端口映射模式 (推荐常规环境),最小化影响主机环境:

podman run -d \
  --restart=always \
  -p 53:53/udp \
  -p 53:53/tcp \
  -p 6080:6080 \
  -v /etc/smartdns:/etc/smartdns \
  -v /var/lib/smartdns:/var/lib/smartdns \
  -v /var/log/smartdns:/var/log/smartdns \
  docker.io/pymumu/smartdns:latest

参数说明:

  • -v /etc/smartdns:/etc/smartdns:Z:挂载配置目录,:Z 确保适配 SELinux 安全标签,保障系统稳定运行。
  • /var/lib/smartdns:/var/lib/smartdns:Z:UI数据文件目录,:Z 确保适配 SELinux 安全标签,保障系统稳定运行。
  • /var/log/smartdns:/var/log/smartdns:Z:日志存储,便于审计需要,:Z 确保适配 SELinux 安全标签,保障系统稳定运行。

第四步:使用 Systemd 进行持久化守护

为保证宿主机重启后 DNS 容器自动拉起,可以使用 Podman 生成 systemd 单元文件:

# 生成 systemd 配置文件
podman generate systemd --new --files --name smartdns

# 注册为系统级服务并启动
sudo mv container-smartdns.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now container-smartdns.service

连通性与分流验证

在终端使用 dig 工具分别对内网和公网域名进行解析测试:

1. 验证内网域名定向解析

dig @127.0.0.1 git.local +short

检查输出是否为企业内部网段 IP(例如 10.0.x.x 或 172.16.x.x)。

2. 验证公共域名测速与解析

dig @127.0.0.1 www.aliyun.com +stats

检查首次与再次查询的 Query time,确认缓存生效且解析结果符合就近接入原则。

企业部署建议

  • 内网高可用建议:建议在内网至少部署两台独立的 SmartDNS 节点,并在企业主路由或 DHCP 服务器上将这两个节点的 IP 分别设为主、备 DNS。
  • 自动化同步规则:若企业内部域名变更频繁,可通过自动化脚本(如 Ansible 或 Git Webhook)将内网域名清单同步至 /etc/smartdns/conf.d/office-domains.conf,并执行 podman exec -it smartdns smartdns -c /etc/smartdns/smartdns.conf -r 实现热重载,无需中断服务。

文章末尾固定信息

weinxin
我的微信
微信号已复制
我的微信
微信扫一扫
 
Jinpeng
  • 本文由 Jinpeng 发表于2026年10月7日 13:33:24
  • 转载请务必保留本文链接:https://www.ixmu.net/221.html

发表评论